我正在使用Linux内核中的一些常用命令,并且看到mprotect()被使用了很多次.我只是想知道,mprotect()用来找出它为其设置保护值的内存地址的决定因素是什么?在它自己的地址空间中?
caf*_*caf 10
在具有MMU 1的体系结构上,mprotect()
作为参数的地址是虚拟地址.每个进程都有自己独立的虚拟地址空间,因此只有两种可能:
mprotect()
通过改变附加到VMA 2的标志来内部工作.它必须做的第一件事就是查找与传递的地址相对应的VMA - 如果传递的地址在内核的地址范围内,那么就没有 VMA,因此这种搜索将失败.如果您尝试更改未映射的地址空间区域上的保护,则会发生同样的情况.
您可以通过检查/proc/<pid>/smaps
或查看进程地址空间中VMA的表示/proc/<pid>/maps
.