老实说,我真的对这个特定的虚拟内存相关概念感到困惑。
Q1) 当发生页错误时,处理器是否先完成当前指令的执行,然后将 IP 寄存器内容(下一条指令的地址)移入堆栈?或者,它中止当前正在执行的指令并将指令指针寄存器的内容移至堆栈?
Q2)如果第二种情况为真,那么它如何恢复被中止的指令,因为当它恢复时,堆栈包含指令指针值,该值只是下一条指令的地址。因此它永远不会恢复发生页错误的指令。
我的想法
我认为第二种情况听起来不对。当我阅读 Silbershatz 和 Galvin 的《操作系统原理》时,出现了困惑。他们写了
当发生页面错误时,我们必须引入所需的页面、正确的页表和重新启动指令.
但是指令指针总是指向下一条指令的地址,所以这意味着,根据这本书试图传达的内容,我们递减IP的值只是为了重新开始执行发生页面错误的指令?
在英特尔系统编程指南第 6.5 章中,它说
故障——故障是一种通常可以纠正的异常,一旦纠正,程序就可以
重新启动而不失去连续性。当报告故障时,处理器将机器状态恢复到
开始执行错误指令之前的状态。返回地址(保存的内容
错误处理程序的 CS 和 EIP 寄存器指向错误指令,而不是指令
按照故障指示进行操作。
页面错误被归类为错误(这并不奇怪),因此当页面错误发生时,您处于“发生之前”的状态 - 好吧不是真的,因为您处于错误处理程序中(因此 EIP 和 ESP肯定是不同的,CR2也包含地址),但是当你返回时,它将是发生之前的状态,只有处理程序所做的更改(所以,把页面放在那里,或者杀死进程)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)