老实说,我对这个特定的虚拟内存相关概念感到困惑。
Q1)当发生页面错误时,处理器是否首先完成当前指令的执行,然后将IP寄存器内容(下一条指令的地址)移动到堆栈?或者,它会中止当前正在执行的指令并将指令指针寄存器的内容移到堆栈中?
Q2)如果第二种情况为真,那么它如何恢复被中止的指令,因为如果它恢复,则堆栈包含指令指针值,该值只是下一条指令的地址。因此它永远不会恢复发生页面错误的指令。
我的想法
我认为第二种情况听起来不对。当我阅读Silbershatz和Galvin的操作系统原则时,出现了混乱。因为他们写了
发生页面错误时,我们必须引入所需的页面,更正页面表并重新启动指令。
但是指令指针始终指向下一条指令的地址,所以根据本书试图传达的内容,我们只是为了重新启动发生页面错误的指令的执行而递减IP的值。 ?
答案 0 :(得分:2)
在英特尔系统编程指南的第6.5章中,它说
故障 - 故障是一种通常可以纠正的异常,一旦纠正,就允许该程序 重新启动而不失去连续性。报告故障时,处理器将机器状态恢复为 在开始执行断层指令之前的状态。返回地址(保存的内容) 故障处理程序的CS和EIP寄存器指向故障指令,而不是指令 遵循错误指示。
页面错误被归类为错误(在那里没有意外),因此当发生页面错误时,您会在状态发生之前发生错误" - 不是真的,因为你在故障处理程序中(所以EIP和ESP肯定是不同的,CR2也包含地址),但是当你返回时它将成为发生之前的状态,只有处理程序所做的更改(因此,将页面放在那里,或者终止进程)