operating-system - 处理页错误陷阱后的指令指针值

标签 operating-system page-fault

老实说,我真的对这个特定的虚拟内存相关概念感到困惑。

Q1) 当发生页错误时,处理器是否先完成当前指令的执行,然后将 IP 寄存器内容(下一条指令的地址)移入堆栈?或者,它中止当前正在执行的指令并将指令指针寄存器的内容移至堆栈?

Q2) 如果第二种情况为真,那么它如何恢复被中止的指令,因为当它恢复时,堆栈包含指令指针值,该值只是下一条指令的地址。因此它永远不会恢复发生页错误的指令。

我的想法
我认为第二种情况听起来不对。当我阅读 Silbershatz 和 Galvin 的《操作系统原理》时,出现了困惑。他们写了

when a page fault occurs, we will have to bring in the desired page, correct page table and restart the instruction.

但是指令指针总是指向下一条指令的地址,所以这意味着,根据本书试图传达的内容,我们递减IP的值只是为了重新开始执行发生页面错误的指令?

最佳答案

在英特尔系统编程指南第 6.5 章中,它说

Faults — A fault is an exception that can generally be corrected and that, once corrected, allows the program to be restarted with no loss of continuity. When a fault is reported, the processor restores the machine state to the state prior to the beginning of execution of the faulting instruction. The return address (saved contents of the CS and EIP registers) for the fault handler points to the faulting instruction, rather than to the instruction following the faulting instruction.

页面错误被归类为错误(这并不奇怪),因此当页面错误发生时,您处于“发生之前”的状态 - 好吧不是真的,因为您处于错误处理程序中(所以EIP 和 ESP 绝对不同,CR2 也包含地址),但是当您返回时,它将是发生之前的状态,仅由处理程序进行更改(因此,将页面放在那里,或者终止进程)

关于operating-system - 处理页错误陷阱后的指令指针值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27114512/

相关文章:

c++ - 为什么分配更大的空间时,堆地址的增长方向会相反?

java - NACHOS(JAVA版)教程【设置及简单示例】

MongoDB、NUMA 硬件、页面错误但有足够的 RAM 用于工作集、touch 命令或 vmtouch/dd 未加载到内存中

c++ - 从 Visual Studio 启动应用程序时出现页面错误

operating-system - 操作系统中延迟和抖动之间的区别

windows - 为什么无法从具有 PAGE_GUARD 保护的 block 中读取数据?

operating-system - 物理内存、主内存、辅助内存、主内存之间有什么区别?

bash - 'top' 中的 Faults 列是什么?

linux - 防止 linux 上实时进程中的小页面错误

c - read() 系统调用页面错误不依赖于文件大小