4

当共享库映射到内存中时,Linux内核会为这个内存区域分配虚拟内存区域,并分别标记它们的权限。但是我们知道 x86 arch 中的页表项中没有可执行位。如果程序中有“call *edx”这样的调用指令来调用共享库中的函数,Linux内核如何知道目标地址是否可执行?如果 vma 列表中的权限不兼容,是否会导致一般保护错误?

4

2 回答 2

3

它不能。

在没有与读取权限不同的执行页面权限的架构(/操作模式)上,由于 MMU 检测到故障,内核将无法发现所谓的非法地址执行。

于 2013-02-05T20:36:15.177 回答
0

你是对的,理论上内核可以根据内存区域对象的更细粒度的权限来决定,但是这样的决策过程必须在页面错误处理程序中,(我想)它会进行例行的内存访问非常贵。

相反,内核在 x86 上采用了这些简化规则:

  • 读访问权总是意味着执行访问权
  • 写访问权总是意味着读访问权

资料来源:了解 Linux 内核,第 1 版,第 205 页

于 2016-02-26T19:06:55.950 回答