32位FreeBSD 7.2和1GB mmaps

时间:2010-07-15 20:57:16

标签: posix freebsd mmap aslr

我在使用FreeBSD和大型mmaps方面遇到了一些麻烦。 Linux没有出现同样的问题。

在程序启动时,它总是可以获得1 GB的映射。但是,有一个重新加载操作,其中文件被替换并重新映射。新地图通常每次都要大一点,因此它不能整齐地放入旧的mmap位置。这种重映射经常在FreeBSD上失败,但在Linux上几乎没有。 (在使用ASLR的Linux上更常失败.FreeBSD是否使用ASLR?)

认为这是因为库加载了其他库以及在程序运行期间完成的内存分配,它将虚拟内存空间分段。 FreeBSD的malloc实现或库加载可能有一些特性导致这种情况。

我正在寻找一些可以让它更有可能发挥作用的事情。

我正在考虑的一件事是,即使文件大小实际上可能是890 MB,也要始终mmap一个完整的1 GB空间。如果我可以做到这一点,那么我将始终有一个1 GB的插槽来重新映射新的895 MB文件。

1 个答案:

答案 0 :(得分:3)

问题可能是由于没有足够大的重叠地址空间块引起的。它很可能出现在具有1Gb mmap的32位系统上。

考虑专门使用64位系统(现在大多数公司都用于生产服务器),或者改为使用mmap()代替几个较小的区域。

你不会绕过这个。