我有一组文件,其长度都是我操作系统(FreeBSD 10)页面大小的倍数。我想将这些文件mmap()
连续到RAM的连续页面,这使我能够将一组文件视为一大块数据。
最好使用便携式功能,如何找到一个足够大的未映射地址空间区域,以便确保对该区域的一系列mmap()
次呼叫成功?
答案 0 :(得分:5)
请按照以下步骤操作:
mmap
映射此大小的单个匿名内存区域。如果失败了,你就输了。unmap
区域(实际上,如果系统的unmap
具有固定地址,则可能不需要mmap
隐藏任何先前重叠区域。MAP_FIXED
标记映射此地址的第一个文件。这应该可以完全移植到任何POSIX系统,但是某些操作系统可能有防止这种方法的怪癖。试试吧。
答案 1 :(得分:1)
您可以mmap
一个大区域,其中大小是所有文件大小的总和,使用MAP_PRIVATE | MAP_ANON
和保护PROT_NONE
,这将阻止操作系统不必要地提交内存费。
这将保留但不提交内存。
然后,您可以在filename1
打开文件[baseAddr, size1)
,在filename2
打开[baseAddr + size1, baseAddr + size1 + size2)
,依此类推。
我相信这个标志是MAP_FIXED | MAP_PRIVATE
。