Posix 32位FreeBSD 7.2和1GB MMAP

Posix 32位FreeBSD 7.2和1GB MMAP,posix,freebsd,mmap,aslr,Posix,Freebsd,Mmap,Aslr,我在FreeBSD和大型MMAP方面遇到了一些问题。Linux没有显示相同的问题 在程序启动时,它始终可以获得1GB映射。但是,有一个重新加载操作,文件被替换并重新映射。新地图通常每次都会稍微大一点,因此它不适合旧的mmap位置。这种重新映射在FreeBSD上经常失败,但在Linux上几乎从未失败过。(在Linuxes上使用时更容易失败。FreeBSD是否使用ASLR?) 我认为这是因为库加载了其他库,并且在程序运行期间进行了内存分配,从而分割了虚拟内存空间。可能是FreeBSD的malloc实

我在FreeBSD和大型MMAP方面遇到了一些问题。Linux没有显示相同的问题

在程序启动时,它始终可以获得1GB映射。但是,有一个重新加载操作,文件被替换并重新映射。新地图通常每次都会稍微大一点,因此它不适合旧的mmap位置。这种重新映射在FreeBSD上经常失败,但在Linux上几乎从未失败过。(在Linuxes上使用时更容易失败。FreeBSD是否使用ASLR?)

我认为这是因为库加载了其他库,并且在程序运行期间进行了内存分配,从而分割了虚拟内存空间。可能是FreeBSD的malloc实现或库加载的某些特性导致了这种情况

我正在寻找一些我可以做的事情,使它更有可能工作


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

问题可能是由于没有足够大的连续地址空间块造成的。它很可能在具有1Gb mmap的32位系统上

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


你无法回避这个问题。

你有没有研究过
login.conf(5)
,特别是
内存锁定
vmemoryuse
?@Nikolai:这些限制没有设置。问题不在于限制。我知道,因为mmap总是在程序启动时起作用。@Nikolai:7.2我编辑了标题,以指定.7.0及以上版本的使用
jemalloc
()。这里我唯一能建议的就是使用
/etc/malloc.conf
中的选项。尝试
D
强制
sbrk(2)
而不是默认的
M