预先分配虚拟地址空间区域

问题描述 投票:0回答:1

我有几个文件想要用 mmap()

连续
映射到虚拟地址空间。每个文件长度是页面大小的倍数。

对于第一个文件,我调用

mmap()
,并将
addr
参数设置为
nullptr
。在下一次调用中,我将
addr
参数设置为第一个文件映射到的区域末尾之后的地址。

在某些情况下,我无法映射所有文件,因为

mmap()
忽略了
addr
提示。有没有一种方法可以预先分配整个区域,然后一次将文件映射到该区域?

c linux mmap virtual-memory
1个回答
0
投票

我要感谢@gspr 对于这个问题的帮助!

为了确保您能够成功

mmap()
所有文件,您必须执行以下操作:

  1. mmap()
    一个匿名区域,其大小等于文件大小的总和。
void* ret = mmap(/*addr=*/nullptr, file_size_sum, PROT_NONE,
                 MAP_SHARED | MAP_ANONYMOUS, /*fd=*/-1, /*offset=*/0);
assert(ret != MAP_FAILED);
  1. 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) 中其他内容的现有映射。

© www.soinside.com 2019 - 2024. All rights reserved.