c - 带有 MAP_NORESERVE 的 mmap 是否保留物理内存?

标签 c linux gcc x86-64 mmap

mmap文档说明了关于标志 MAP_NORESERVE 的以下信息。

Do not reserve swap space for this mapping. When swap space is reserved, one has the guarantee that it is possible to modify the mapping. When swap space is not reserved one might get SIGSEGV upon a write if no physical memory is available.

我实际上想要的是只保留虚拟内存地址,而不分配实际的物理内存。这可以用带有 MAP_NORESERVE 的 mmap 来完成吗?如果我想使用任何物理内存,我会在通过带有 MAP_NORESERVE 的 mmap 分配的地址范围内再次使用 MAP_FIXED 对其进行 mmap。

总而言之,我希望内核不为使用带有 MAP_NORSERVE 标志的 mmap 分配的内存保留任何物理页面。它真的是这样工作的还是内核在有足够物理内存的情况下分配物理页面?

最佳答案

mmap() 是管理 {address, Physical memory, disk-blocks} 之间关联的方法之一,这个关联的所有三个成员都是资源。该关联保存在页表条目 (PTE) 中

mmap() 实际上做的是:

  • [也许] 在用户进程中分配一个地址范围。此范围必须由连续的地址组成(不应与现有范围重叠)
  • 为请求的范围创建 PTE 并使它们指向地址范围内的页面
  • 让 PTE 指向被 mmap()ed 的文件
  • [也许] 分配和预取(一些)页面
  • [也许] 保留一些后备存储空间。

上述步骤中有许多(5 个中的 3 个)是可选的,并且取决于 mmap() 调用中提供的实际参数和标志。 (fd 可能是 -1:创建一个匿名映射,起始地址可能是 NULL:mmap 应该分配一个(以前)未使用的内存范围)

调用 mmap() 后,内核中的页面错误处理程序应该能够找出要做什么。 (将物理 ram 附加到页面;刷新和分离;分配和 COW,...)

保留交换空间意味着调用者相信将来任何时候都会有足够的交换空间。交换空间由所有进程共享,因此永远无法保证有足够的空间。预分配它(或多或少)保证调用进程总是有足够的它。 (如果不是:mmap() 应该失败了)

关于c - 带有 MAP_NORESERVE 的 mmap 是否保留物理内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8506366/

相关文章:

c - 是否可以在 C 中模拟对象/实例方法?

c - Linux timer_setup 函数

c++ - 如何在 Makefile 中向 1 头文件添加引用

debugging - 从 elf 二进制文件中提取调试符号信息

c++ - ld : entry point (start) undefined. 通常在 crt1.o 中用于架构 x86_64

c++ - 当我尝试使用 AVX 功能时 Clang 生成错误

c - 带参数函数的 printf 返回指向 char 的指针

将一串十六进制数字转换为整数

linux - SCP密码在哪里设置?

c - 使用字符串文字初始化数组时的不同程序集