我有几个文件要映射到具有mmap()
个文件的虚拟地址空间consecutively中.每个文件长度都是页面大小的倍数.
对于第一个文件,我调用mmap()
,将addr
参数设置为nullptr
.在下一次调用中,我将addr
参数设置为第一个文件映射到的区域末尾之后的地址.
在某些情况下,我无法映射所有文件,因为mmap()
忽略了addr
提示.有没有办法预先预分配整个区域,然后将文件一次映射到一个区域?
我有几个文件要映射到具有mmap()
个文件的虚拟地址空间consecutively中.每个文件长度都是页面大小的倍数.
对于第一个文件,我调用mmap()
,将addr
参数设置为nullptr
.在下一次调用中,我将addr
参数设置为第一个文件映射到的区域末尾之后的地址.
在某些情况下,我无法映射所有文件,因为mmap()
忽略了addr
提示.有没有办法预先预分配整个区域,然后将文件一次映射到一个区域?
我要感谢@GSPR在这个问题上的帮助!
要确保您可以成功处理所有文件,您必须执行以下操作:
mmap()
一个匿名区域,其大小等于文件大小之和.void* ret = mmap(/*addr=*/nullptr, file_size_sum, PROT_NONE,
MAP_SHARED | MAP_ANONYMOUS, /*fd=*/-1, /*offset=*/0);
assert(ret != MAP_FAILED);
MAP_FIXED
旗帜.void* addr = mmap(ret, file_size, PROT_READ,
MAP_SHARED | MAP_FIXED, fd, /*offset=*/0);
assert(addr != MAP_FAILED);
MAP_FIXED
指示mmap()
使用addr
参数中指定的确切地址.如果已经存在addr
的映射,则覆盖该映射.因此,重要的是,我们在步骤(1)中预先分配了整个区域,这样当我们使用MAP_FIXED
时,就不会在步骤(2)中无意中覆盖其他内容的现有映射.