1

我正在研究操作系统上的 xv6上下文切换:三件简单书。我无法完全理解第 6 章(第 8 页)的保存和恢复上下文部分。

  • 为什么在上下文切换协议期间会发生两种类型的寄存器保存/恢复?
  • 提到的用户寄存器内核寄存器有什么区别?
  • 是什么意思:

    通过切换堆栈,内核在一个进程(被中断的进程)的上下文中进入对切换代码的​​调用,并在另一个进程(即将执行的进程)的上下文中返回。

4

1 回答 1

1

为什么在上下文切换协议期间会发生两种类型的寄存器保存/恢复?

假设你在谈论 p。10. 文字有点误导(但不像我在某些书中看到的那么糟糕)。他们正在将中断中的寄存器保存与上下文切换进行比较。这真的不是一个很好的比较。

在中断处理中保存寄存器的方式与在函数调用中的方式相同(而不是在上下文切换中完成)。您必须保留在开始中断处理时要使用的任何寄存器值,然后在中断处理程序返回之前恢复它们。您也只处理通用寄存器(即不是过程控制寄存器)。

上下文切换中的寄存器保存是整体完成的。所有进程的寄存器都会立即保存。一个中断服务例程可能会保存 4 个寄存器,而上下文切换可能会保存超过 30 个。

提到的用户寄存器和内核寄存器有什么区别?

一些寄存器在用户模式下是可以访问和修改的。通用寄存器肯定是用户寄存器。处理器状态好坏参半,因为它可以在用户模式下读取,它可以在用户模式下通过执行指令以某种方式进行修改,但通常只能在用户模式下读取。您可能会称其为用户注册,也可能不会。

还有其他寄存器只能在内核模式下访问。例如,将有定义进程的页表的寄存器。其他寄存器将定义系统调度表。

注意这里只有一些内核模式寄存器是进程寄存器(例如那些设置页表的寄存器)并且需要与进程一起保存和恢复。其他内核寄存器是系统范围的(例如那些用于定时器和系统调度表的)。这些不会随着过程而改变。

通过切换堆栈,内核在一个进程(被中断的进程)的上下文中进入对切换代码的​​调用,并在另一个进程(即将执行的进程)的上下文中返回。

这在摘录中有点误导,但如果我仔细阅读这本书可能会更有意义。

进程上下文切换需要将所有每个进程的寄存器更改为一个块,其结构由 CPU 定义。我在您的摘录中发现的误导是上下文切换不仅仅涉及切换堆栈。

通常,上下文更改看起来像:

SAVE_PROCESS_CONTEXT_INSTRUCTION address_of_the_current_process_context_block
LOAD_PROCESS_CONTEXT_INSTRUCTION address_of_the_next_process_context_block

加载流程上下文后,您就处于新流程中。该开关包括更改内核模式堆栈。

一些操作系统在其文档中使用的术语暗示中断(尤其是)和(有时)作为处理程序的异常不是在进程的上下文中完成的。事实上,CPU 总是在进程的上下文中执行。

一旦您执行上下文切换指令,您就在新进程中,但在内核模式下的异常或中断处理程序中。内核堆栈的变化导致从异常或中断返回以恢复新进程的用户模式代码。

所以你已经在带有 PCB 开关的进程的上下文中。内核模式堆栈指针的变化(即建立一个新的内核模式堆栈)导致从异常或中断返回以获取新进程之前的位置进入内核模式(通过异常或中断)

于 2017-04-09T18:05:32.747 回答