如何解决为什么mprotect是来自mmap的独特系统调用
我最近正在处理与虚拟内存有关的syscall。从mmap
的手册中,我知道设置MAP_FIXED
标志会在内存中各处创建新的映射。
MAP_FIXED
不要将addr解释为提示:将映射准确地放在 该地址。 addr必须适当对齐:对于大多数 架构是页面大小的倍数就足够了; 但是,某些架构可能会施加额外的 限制。 如果由addr和len指定的内存区域 重叠任何现有映射的页面,然后重叠 现有映射中的一部分将被丢弃。如果 指定的地址无法使用,mmap()将失败。 渴望可移植的软件应使用MAP_FIXED 请小心标记,并要牢记 允许进程的内存映射发生重大变化 内核版本,C库版本和操作之间 系统版本。仔细阅读该标志的讨论 在笔记中!
我的问题是,为什么mprotect
与mmap
截然不同的系统调用mmap
可以通过使用相同的{{1} }和fd
,并设置所需的新offset
?
我认为,有关VM的所有操作最终都可以使用prot
和mmap
完成,因为这些操作基本上只是在页表上进行。有人可以告诉我这是一个坏主意吗?
解决方法
如果要更改现有内存区域的权限,同时保持其内容不变,则需要mprotect
。
mmap
无法做到这一点。如果将mmap
与MAP_FIXED
一起使用在同一地址创建新的映射,则该区域的先前内容将被您映射的新文件的内容替换;如果使用{{1},则为零。 }。
使用相同的MAP_ANONYMOUS
和fd
不能解决这个问题。如果映射最初是用offset
创建的(大多数动态分配的内存就是这种情况),那么就没有MAP_ANONYMOUS
。或者,如果将区域映射到文件但使用fd
,则内容可能已在进程的内存中进行了修改,而没有写回到文件中。尝试使用MAP_PRIVATE
再次映射文件将丢失修改后的数据,并将其替换为文件的原始内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。