1

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

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

我的问题是,为什么有一个不同的系统调用mprotectfrom mmap,因为它可以通过创建一个具有相同andmmap的新映射来完成完全相同的工作,并设置你想要的新的?fdoffsetprot

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

4

1 回答 1

2

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

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

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

于 2020-08-15T15:34:43.250 回答