我有几个文件想要用 mmap()
连续映射到虚拟地址空间。每个文件长度是页面大小的倍数。
对于第一个文件,我调用
mmap()
,并将 addr
参数设置为 nullptr
。在下一次调用中,我将 addr
参数设置为第一个文件映射到的区域末尾之后的地址。
在某些情况下,我无法映射所有文件,因为
mmap()
忽略了 addr
提示。有没有一种方法可以预先分配整个区域,然后一次将文件映射到该区域?
我要感谢@gspr 对于这个问题的帮助!
为了确保您能够成功
mmap()
所有文件,您必须执行以下操作:
mmap()
一个匿名区域,其大小等于文件大小的总和。void* ret = mmap(/*addr=*/nullptr, file_size_sum, PROT_NONE,
MAP_SHARED | MAP_ANONYMOUS, /*fd=*/-1, /*offset=*/0);
assert(ret != MAP_FAILED);
mmap()
每个文件在预分配区域内一次打开。重要的是,使用 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) 中其他内容的现有映射。