在 Linux 中,通过虚拟文件系统hugetlbfs提供对大页面的访问。libhugetlbfs库接口与 hugetlbfs配合使用,可提供更方便的特定应用程序级服务。
libhugetlbfs可用于使现有应用程序对其所有malloc()调用使用大页面。
要使用自动大页面malloc()功能运行程序,我设置了以下环境变量:
- 设置LD_PRELOAD=libhugetlbfs.so
- 将LD_LIBRARY_PATH设置为包含libhugetlbfs.so的目录
- 设置HUGETLB_MORECORE=yes
现在,我的新进程对所有malloc()内存使用大页面(如果有)。但是当它执行fork()系统调用并且如果系统上没有足够的大页面时,孩子会被SIGBUS终止。发生这种情况是因为当孩子尝试更新 malloc 内存中的某个内存位置时,会发生页面错误。由于 Copy-On-Write 机制,系统尝试将新的大页面分配给子页面以服务页面错误。但是由于没有可用的大页面,内核会生成SIGBUS并输出错误。
我将不胜感激任何帮助/指针来解决SIGBUS对孩子的丑陋终止并导致核心。