exception - 页面错误、页面短缺或访问冲突?

标签 exception operating-system x86 kernel

众所周知,访问内存中不存在的页面会导致页面错误,但是写入只读页面也会导致页面错误?如何在异常处理程序中识别两种类型的页面错误?

最佳答案

在调用页面错误处理程序之前,您读取 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/

相关文章:

linux - `[stack]` 、 `[vdso]` 和 `[vsyscall]` mmaps 从哪里来?

ios - 从不兼容类型 'NSBlockOperation *__strong' 分配给 'void (^)(void)' getNewMessages = ^{ ^ ~~

c++ - C++中未处理的异常检查

java - 如何处理 ifPresent 内部的异常?

c - 外部数组用法导致访问冲突

c - Windows 中的高级 C 编程(pthreads、信号和信号量,天哪!)

c++ - linux中调用bg时应该执行什么状态

assembly - 如何检查 x86 程序集中的 key 状态?

linux - I/O 的定义是什么,哪些 Action 被归类为 I/O?

c++ - 内联汇编会影响可移植性吗?