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
模式让内存完全不能访问呢?
换句话说,读内存时如何产生异常
- 直接让虚拟页面失效触发page fault?
- 使用 CPL 和 DPL 触发特权侵犯?
- 删除虚拟内存和物理内存之间的映射以触发页面错误?
限于本人能力,无法通过源码找到实现机制。好像只修改页面 table 条目的保护标志。
请注意,mprotect 是从虚拟地址区域上的用户 space 调用的。当保护设置为 PROT_NONE 时,_PAGE_PRESENT 位被清除,_PAGE_PROTNONE 位被设置。尝试访问该地址将导致页面错误。 Source
方法 mprotect
有一个 PROT_NONE 选项来禁用内存访问。表示“内存根本无法访问”
我想知道它是如何在x86/x64平台上实现的。
根据页面table条目的属性R/W和XD,可以将一个页面设置为只读和禁止执行。但是如何实现PROT_NONE
模式让内存完全不能访问呢?
换句话说,读内存时如何产生异常
- 直接让虚拟页面失效触发page fault?
- 使用 CPL 和 DPL 触发特权侵犯?
- 删除虚拟内存和物理内存之间的映射以触发页面错误?
限于本人能力,无法通过源码找到实现机制。好像只修改页面 table 条目的保护标志。
请注意,mprotect 是从虚拟地址区域上的用户 space 调用的。当保护设置为 PROT_NONE 时,_PAGE_PRESENT 位被清除,_PAGE_PROTNONE 位被设置。尝试访问该地址将导致页面错误。 Source