为什么 mprotect 是与 mmap 不同的系统调用

Why is mprotect a distinct syscall from mmap

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

MAP_FIXED
Don't interpret addr as a hint: place the mapping at exactly that address. addr must be suitably aligned: for most architectures a multiple of the page size is sufficient; however, some architectures may impose additional restrictions. If the memory region specified by addr and len overlaps pages of any existing mapping(s), then the overlapped part of the existing mapping(s) will be discarded. If the specified address cannot be used, mmap() will fail. Software that aspires to be portable should use the MAP_FIXED flag with care, keeping in mind that the exact layout of a process's memory mappings is allowed to change significantly between kernel versions, C library versions, and operating system releases. Carefully read the discussion of this flag in NOTES!

我的问题是,为什么 mmap 有一个不同的系统调用 mprotect,因为 mmap 可以通过创建具有相同 fdoffset,然后设置你想要的新 prot?

在我看来,所有关于VM的操作最终都可以用mmapmunmap来完成,因为那些操作基本上只是在玩页面table。谁能告诉我这是否是个坏主意?

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

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

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