2

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

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

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

我认为
我认为第二种情况听起来是错误的。我在阅读 Silbershatz 和 Galvin 的操作系统原理时发生了困惑。他们已经写了

当发生页面错误时,我们将不得不引入所需的页面,更正页表并重新启动指令

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

4

1 回答 1

2

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

故障——故障是一种通常可以纠正的异常,一旦纠正,程序就可以在不丧失连续性的情况下重新启动。当报告故障时,处理器将机器状态恢复到故障指令开始执行之前的状态。故障处理程序的返回地址(保存的 CS 和 EIP 寄存器的内容)指向故障指令,而不是故障指令之后的指令。

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

于 2014-11-24T21:46:56.080 回答