众所周知,访问内存中不存在的页面会导致页面错误,但是写入只读页面也会导致页面错误?如何在异常处理程序中识别两种类型的页面错误?
最佳答案
在调用页面错误处理程序之前,您读取 CPU 放置在堆栈上的异常错误代码。该错误代码包含 5 位,您对其中的 4 位感兴趣:
- P=0:错误是由不存在的页面引起的。
P=1:故障是由于页面级保护违规引起的。 - W/R=0:导致故障的访问是读取。
W/R=1:导致故障的访问是写入。 - U/S=0:导致故障的访问源自处理器
正在以主管模式执行。
U/S=1:导致故障的访问源自处理器 正在用户模式下执行。 - I/D=0:故障不是由取指令引起的。
I/D=1:取指令导致故障。
如果 P=0,则该页面不存在。
如果P=1,则权限不足以访问该页面。 U/S 会告诉您它是在内核还是应用程序中。 I/D 告诉您是否是因为代码指令读取(读/写数据)。 W/R 告诉您是否正在读取或写入无法完成。
英特尔® 64 和 IA-32 架构软件开发人员手册第 3 卷:系统编程指南的
.中断 14 - 页面错误异常 (#PF)
部分对此进行了描述
关于exception - 页面错误、页面短缺或访问冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9759439/