linux如何在x64平台上实现mprotect的PROT_NONE模式?

How does linux implement PROT_NONE mode of mprotect on x64 platform?

方法 mprotect 有一个 PROT_NONE 选项来禁用内存访问。表示“内存根本无法访问”

我想知道它是如何在x86/x64平台上实现的。

根据页面table条目的属性R/W和XD,可以将一个页面设置为只读和禁止执行。但是如何实现PROT_NONE模式让内存完全不能访问呢?

换句话说,读内存时如何产生异常

  1. 直接让虚拟页面失效触发page fault?
  2. 使用 CPL 和 DPL 触发特权侵犯?
  3. 删除虚拟内存和物理内存之间的映射以触发页面错误?

限于本人能力,无法通过源码找到实现机制。好像只修改页面 table 条目的保护标志。

请注意,mprotect 是从虚拟地址区域上的用户 space 调用的。当保护设置为 PROT_NONE 时,_PAGE_PRESENT 位被清除,_PAGE_PROTNONE 位被设置。尝试访问该地址将导致页面错误。 Source