mprotect()如何工作?

tsu*_*dot 3 c linux-kernel

我正在使用Linux内核中的一些常用命令,并且看到mprotect()被使用了很多次.我只是想知道,mprotect()用来找出它为其设置保护值的内存地址的决定因素是什么?在它自己的地址空间中?

caf*_*caf 10

在具有MMU 1的体系结构上,mprotect()作为参数的地址是虚拟地址.每个进程都有自己独立的虚拟地址空间,因此只有两种可能:

  • 请求的地址在进程自己的地址范围内; 要么
  • 请求的地址在内核的地址范围内(映射到每个进程).

mprotect()通过改变附加到VMA 2的标志来内部工作.它必须做的第一件事就是查找与传递的地址相对应的VMA - 如果传递的地址在内核的地址范围内,那么就没有 VMA,因此这种搜索将失败.如果您尝试更改未映射的地址空间区域上的保护,则会发生同样的情况.

您可以通过检查/proc/<pid>/smaps或查看进程地址空间中VMA的表示/proc/<pid>/maps.


1.内存管理单元
2.虚拟内存区域,一种描述进程内存的连续部分的内核数据结构.