我有一组文件,其长度都是我的操作系统(FreeBSD 10)的页面大小的倍数。我想将mmap()这些文件放到 RAM 的连续页面中,让我能够将文件集合视为一个大型数据数组。
最好使用可移植函数,我怎样才能找到足够大的未映射地址空间区域,以便我可以确定mmap()对该区域的一系列调用会成功?
我有一组文件,其长度都是我的操作系统(FreeBSD 10)的页面大小的倍数。我想将mmap()这些文件放到 RAM 的连续页面中,让我能够将文件集合视为一个大型数据数组。
最好使用可移植函数,我怎样才能找到足够大的未映射地址空间区域,以便我可以确定mmap()对该区域的一系列调用会成功?
按着这些次序:
mmap。如果这失败了,你就输了。unmap区域(实际上,如果您的系统具有固定地址隐式取消映射任何先前的重叠区域,unmap则可能没有必要)。mmapMAP_FIXED使用适当的标志映射此地址的第一个文件。这应该可以完全移植到任何 POSIX 系统,但某些操作系统可能有阻止这种方法的怪癖。试试看。
您可以mmap使用一个大区域,其中大小是所有文件大小的总和,使用MAP_PRIVATE | MAP_ANON和保护PROT_NONE这将防止操作系统不必要地提交内存费用。
这将保留但不提交内存。
然后,您可以在打开文件并filename1在[baseAddr, size1)打开filename2,[baseAddr + size1, baseAddr + size1 + size2)依此类推。
我相信这方面的标志是MAP_FIXED | MAP_PRIVATE.