【问题标题】:Instruction pointer value after the page fault trap has been handled处理缺页陷阱后的指令指针值
【发布时间】:2020-08-04 03:01:42
【问题描述】:

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

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

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

我的想法
我认为第二种情况听起来不对。当我阅读 Silbershatz 和 Galvin 的操作系统原理时,发生了混乱。因为他们写了

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

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

【问题讨论】:

  • 那么它将如何完成产生页面错误的指令呢?页面不存在。这不可能发生。
  • @harold 好吧,你是说我们在处理页面错误陷阱后中止执行并减少 IP 值只是为了重新启动?因为据我所知,中断通常会被忽略,直到当前指令的执行完成。一旦完成,就会发生上下文切换。
  • 好吧,让我引用一下手册。这是针对 x86 的,对吧?可能还有其他解决方案,特别是在可以递减指令指针的机器上(在 x86 上,后退可能会模棱两可)
  • 好的,但是如果递减不是正确的方法,你能帮我理解在 x86 上它是如何完成的吗?可能会向我指出您知道的一些在线资源?

标签: operating-system page-fault


【解决方案1】:

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

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

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

【讨论】:

  • 好的,所以我在考虑通常如何处理中断方面犯了一个错误?嗯,现在这很有意义。非常感谢!
猜你喜欢
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多