在fork()之后的Linux巨大页面和SIGBUS子终止

在Linux中,通过虚拟文件系统“hugetlbfs”提供对大页面的访问。 libhugetlbfs库接口与hugetlbfs协同工作,提供更方便的特定应用程序级服务。

可以使用libhugetlbfs使现有应用程序为其所有malloc()调用使用hugepages。

要使用自动巨大页面malloc()function运行程序,我已经设置了以下环境variables。

  1. 设置LD_PRELOAD = libhugetlbfs.so
  2. 将LD_LIBRARY_PATH设置为包含libhugetlbfs.so的目录
  3. 设置HUGETLB_MORECORE = yes

现在我的新进程使用大页面(如果有的话),所有的malloc()内存。 但是当它执行fork()系统调用,并且系统上没有足够大的页面时,子程序将被SIGBUS终止。 这是因为当孩子试图更新malloc'd内存中的一些内存位置时,发生页面错误。 由于写时复制机制,系统会尝试将新的巨大页面分配给子页面来处理页面错误。 但是由于没有可用的大页面,内核会生成SIGBUS和错误。

我将不胜感激任何帮助/指针来解决SIGBUS丑陋的终结孩子,并造成核心。