我对linux内核中的一些常用命令进行了分析,看到很多次都使用了mprotect()。我想知道的是,什么是决定因素,用来找出它正在设置保护值的内存地址是否在它自己的地址空间中?
发布于 2010-09-30 03:25:32
这是关于virtual memory的。还有关于dynamic linker/loader的。您在跟踪中看到的大多数mprotect(2)
系统调用可能与引入库依赖项有关,尽管malloc(3)
实现可能也会调用它。
编辑:
在注释中回答你的问题- MMU和内核中的代码保护一个进程不受另一个进程的影响。每个进程都有一个完整的32位或64位地址空间的假象。您操作的地址是虚拟,并且属于给定的进程。在硬件的帮助下,内核将这些内存页面映射到物理内存页面。这些页面可以在进程之间隐式地作为代码共享,也可以显式地用于进程间通信。
发布于 2010-09-30 03:41:08
内核会在当前进程的页表中查找您传递给mprotect的地址。如果它不在那里,那么它就失败了。如果它在那里,内核可能会尝试用新的访问权限标记该页。我不确定,但如果有一些特殊的原因导致无法授予访问权限(例如,试图将内存映射共享文件区域的权限更改为可写,而该文件实际上是只读的),则内核仍有可能在此处返回错误。
请记住,处理器用来确定某个内存区域是否可访问的页表并不是内核用来查找该地址的页表。处理器的表中可能有空洞,用于存储交换到磁盘的页面等内容。这些表是相关的,但并不相同。
https://stackoverflow.com/questions/3825018
复制相似问题