【发布时间】:2020-08-04 03:01:42
【问题描述】:
老实说,我真的对这个特定的虚拟内存相关概念感到困惑。
Q1) 发生缺页时,处理器是否先完成当前指令的执行,然后将IP寄存器的内容(下一条指令的地址)移入堆栈?或者,它中止正在执行的当前指令并将指令指针寄存器的内容移动到堆栈?
Q2) 如果第二种情况为真,那么它如何恢复被中止的指令,因为当它恢复时,堆栈包含的指令指针值只是下一条指令的地址。所以它永远不会恢复发生页面错误的指令。
我的想法
我认为第二种情况听起来不对。当我阅读 Silbershatz 和 Galvin 的操作系统原理时,发生了混乱。因为他们写了
当发生页面错误时,我们将不得不引入所需的页面,正确的页表并重新启动指令。
但是指令指针总是指向下一条指令的地址,所以这意味着,根据本书试图传达的内容,我们正在减少 IP 的值,只是为了重新开始执行发生页面错误的指令?
【问题讨论】:
-
那么它将如何完成产生页面错误的指令呢?页面不存在。这不可能发生。
-
@harold 好吧,你是说我们在处理页面错误陷阱后中止执行并减少 IP 值只是为了重新启动?因为据我所知,中断通常会被忽略,直到当前指令的执行完成。一旦完成,就会发生上下文切换。
-
好吧,让我引用一下手册。这是针对 x86 的,对吧?可能还有其他解决方案,特别是在可以递减指令指针的机器上(在 x86 上,后退可能会模棱两可)
-
好的,但是如果递减不是正确的方法,你能帮我理解在 x86 上它是如何完成的吗?可能会向我指出您知道的一些在线资源?
标签: operating-system page-fault