2014-11-24 88 views
2

老实说,我真的很困惑这个特定的虚拟内存相关的概念。 Q1)发生页面错误时,处理器是否首先完成当前指令的执行,然后将IP寄存器内容(下一条指令的地址)移动到堆栈?或者,它中止正在执行的当前指令并将指令指针寄存器的内容移动到堆栈? Q2)如果第二种情况为真,那么它如何恢复被中止的指令,因为如果它恢复,堆栈包含的指令指针值只是下一条指令的地址。所以它将永远不会恢复发生页面错误的指令。页面错误陷阱处理后的指令指针值

我认为
我认为第二种情况听起来不对。我在阅读Silbershatz和Galvin的“操作系统原理”时发生了混淆。在他们所写

当一个页面故障发生时,我们会在需要的页面,正确的页表带上和重启指令

但指令指针总是指向下一条指令所以这意味着地址,根据这本书在试图传达,我们正在递减知识产权的价值只是重新启动指令的执行,其中发生页面错误?

+0

那么它将如何完成生成页面错误的指令?该页面不存在。它不会发生。 – harold 2014-11-24 21:34:51

+0

@harold好吧,您是说我们中止执行并减少IP值,以便在处理页面错误陷阱后重新启动?因为据我所知通常中断会被忽略,直到当前指令的执行完成。一旦完成,就会发生上下文切换。 – Bhavyanshu 2014-11-24 21:37:33

+0

那么让我引用那个手册。这是为x86,对不对?可能还有其他的解决方案,尤其是在可能减少指令指针的机器上(在x86上,后退可能不明确) – harold 2014-11-24 21:41:11

回答

2

在Intel系统编程指南,第6.5章,它说

故障 - 故障是通常可被纠正的异常,以及一旦修正,允许程序 与不亏重新启动的连续性。当报告错误时,处理器将机器状态恢复到开始执行错误指令之前的状态为 。错误处理程序的返回地址(保存内容为 CS和EIP寄存器)指向错误指令,而不是指向错误指令后的指令 。

页面错误被列为错误(没有惊喜那里),所以当页面错误发生你在状态“它曾经发生过” - 这不是真的,因为你的错误是处理程序(所以EIP和ESP是完全不同的,CR2也包含地址),但是当你返回它时,会发生在发生之前的状态,只有通过处理程序所做的更改(所以,在那里放置页面,或者杀死过程)

+0

好吧,所以我在考虑如何正常处理中断时犯了一个错误。嗯,这很有意义。非常感谢! – Bhavyanshu 2014-11-24 21:51:54