为什么mprotect是来自mmap的独特系统调用

问题描述

我最近正在处理与虚拟内存有关的syscall。从mmap的手册中,我知道设置MAP_FIXED标志会在内存中各处创建新的映射。

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

我的问题是,为什么mprotectmmap截然不同的系统调用mmap可以通过使用相同的{{1} }和fd,并设置所需的新offset

我认为,有关VM的所有操作最终都可以使用protmmap完成,因为这些操作基本上只是在页表上进行。有人可以告诉我这是一个坏主意吗?

解决方法

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

mmap无法做到这一点。如果将mmapMAP_FIXED一起使用在同一地址创建新的映射,则该区域的先前内容将被您映射的新文件的内容替换;如果使用{{1},则为零。 }。

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...