我正在研究Operating Systems: Three Easy Pieces书上的xv6 上下文切换。我无法完全理解Chapter 6(第8页)的保存和恢复上下文部分。
通过切换堆栈,内核在一个进程(被中断的进程)的上下文中输入对switch代码的调用,并在另一个进程(即将执行的进程)的上下文中返回。
答案 0 :(得分:0)
为什么在Context Switch协议期间会发生两种类型的寄存器保存/恢复?
假设你在谈论p。 10.该文有点误导(但并不像我在一些书中看到的那么糟糕)。他们将中断寄存器保存与上下文切换进行比较。这真的不是一个很好的比较。
中断处理中的寄存器保存与在函数调用中执行的方式相同(而不像在上下文切换中完成)。您必须在启动中断处理时保留您将要处理的任何寄存器值,然后在中断处理程序返回之前恢复它们。您也只处理通用寄存器(即不是过程控制寄存器)。
上下文切换中的寄存器保存是集中完成的。所有进程的寄存器立即被保存。中断服务程序可能会保存4个寄存器,而上下文切换可能会节省超过30个。
上述用户寄存器和内核寄存器之间有什么区别?
某些寄存器在用户模式下可访问和修改。通用寄存器肯定是用户寄存器。处理器状态是一个混合包,因为它可以在用户模式下读取,它可以通过执行指令在用户模式下以某种方式进行修改,但通常只能在用户模式下读取。您可以将其称为用户注册,也可以不注册。
还有其他寄存器只能在内核模式下访问。例如,将有一些寄存器定义进程的页表。其他寄存器将定义系统调度表。
请注意,这里只有一些内核模式寄存器是进程寄存器(例如那些设置页表的寄存器),需要通过进程保存和恢复。其他内核寄存器是系统范围的(例如定时器和系统调度表)。那些不随着这个过程而改变。
通过切换堆栈,内核在一个进程(被中断的进程)的上下文中输入对switch代码的调用,并在另一个进程(即将执行的进程)的上下文中返回。
这在摘录中有点误导,但如果我仔细阅读这本书可能会更有意义。
进程上下文切换需要将所有每进程寄存器更改为其结构由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开关的过程环境中。内核模式堆栈指针的结果变化(即建立新的内核模式堆栈)导致从异常返回或中断以获取新进程的位置在它进入内核模式之前(通过异常或中断)