【问题标题】:Hardware and Sotfware saves during Context Switch in xv6xv6 中上下文切换期间的硬件和软件保存
【发布时间】:2017-09-04 16:24:16
【问题描述】:

我正在研究Operating Systems: Three Easy Pieces 书上的 xv6 上下文切换。我无法完全理解Chapter 6保存和恢复上下文部分(第 8 页)。

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

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

【问题讨论】:

    标签: unix operating-system kernel context-switch xv6


    【解决方案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切换的进程的上下文中。由此产生的内核模式堆栈指针的变化(即建立一个新的内核模式堆栈)导致从异常或中断返回到新进程的位置在进入内核模式之前(通过异常或中断)

    【讨论】:

    • 最好说硬件中断的初始执行发生在一个未知的进程上下文中,(好吧,除非只有一个进程在运行:)。
    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多