页面错误,页面短缺或访问冲突?

ven*_*s.w 3 x86 operating-system kernel exception-handling exception

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

Ale*_*nze 7

在调用页面错误处理程序之前,您将读取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告诉您是否正在读取或写入无法完成的操作.

这将在本Interrupt 14—Page-Fault Exception (#PF)节中描述Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3: System Programming Guide.