【问题标题】:Why is mprotect a distinct syscall from mmap为什么 mprotect 是与 mmap 不同的系统调用
【发布时间】:2020-12-05 05:14:40
【问题描述】:

我最近在处理与虚拟内存相关的系统调用。从mmap 的手册中我知道,当设置MAP_FIXED 标志时,它可以非常强大,在内存中到处创建新的映射。

MAP_FIXED
不要将 addr 解释为提示:将映射准确地放置在 那个地址。 addr 必须适当对齐:对于大多数 架构页面大小的倍数就足够了; 然而,一些架构可能会施加额外的 限制。 如果addr和len指定的内存区域 重叠任何现有映射的页面,然后重叠 部分现有映射将被丢弃。如果 指定的地址不能使用,mmap() 会失败。 渴望便携的软件应该使用 MAP_FIXED 小心地标记,记住一个确切的布局 允许进程的内存映射发生显着变化 内核版本、C 库版本和操作 系统发布。仔细阅读这个标志的讨论 在笔记中!

我的问题是,考虑到mmap 可以通过使用相同的fdoffset 创建新映射并设置你想要新的prot

在我看来,所有关于VM的操作最终都可以通过mmapmunmap来完成,因为这些操作基本上只是在玩页表。有人能告诉我这是不是一个坏主意吗?

【问题讨论】:

    标签: linux memory-management system-calls mmap mprotect


    【解决方案1】:

    如果您想更改现有内存区域的权限,同时保持其内容不变,则需要mprotect

    mmap 不能这样做。如果您使用mmapMAP_FIXED 在同一地址创建新映射,则该区域以前的内容将被您映射的新文件的内容替换,如果使用MAP_ANONYMOUS,则为零。

    使用相同的fdoffset 并不能解决这个问题。如果映射最初是用MAP_ANONYMOUS 创建的(大多数动态分配的内存就是这种情况),那么就没有fd。或者,如果该区域被映射到一个文件但带有MAP_PRIVATE,那么内容可能已经在您的进程内存中被修改,而没有被写回文件。尝试使用mmap 再次映射文件将丢失修改后的数据并将其替换为文件的原始内容。

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 2012-05-04
      • 2014-09-28
      相关资源
      最近更新 更多