【问题标题】:Interrupts and context switches中断和上下文切换
【发布时间】:2017-11-19 05:10:01
【问题描述】:

我正在阅读一些关于操作系统实现的论文和源代码,并且对此有疑问。 在 github 上的某些操作系统中,上下文切换是在定时器中断的中断处理中进行的。 他们保存了寄存器rbx, r12, r13, r14, r15, rbprsp,并从下一个线程的保存状态中恢复了这些寄存器。

这些线程切换是在定时器中断处理例程中进行的,在调用iret 之前。我的问题是:当中断处理程序恢复提到的寄存器时,为什么会调用iret?在切换线程时,下一个线程将立即启动 - 还是在使用 iret 调用完成中断处理程序后开始?

【问题讨论】:

  • 中断处理程序可能会更改堆栈上下文并恢复寄存器以与打算运行的线程一致。 IRET 是结束中断例程所必需的。在 IRET 完成执行之前,线程不会真正运行。它最终会从堆栈中弹出 CS:RIP 等等。 CS:RIP 将是线程内的指令指针,事情将在其中恢复。本质上,直到 IRET 完成返回,您的线程才真正开始执行。这是没有看代码的一般猜测。
  • 我们肯定最近收到了很多关于中断和上下文切换的问题。不知道这可以归因于什么,因为学校停课了,这似乎不是一个特别引人注目的暑期学习项目。无论如何,不​​清楚你的问题是什么。从中断处理程序返回的正常方式是iret。它还应该叫什么?
  • 感谢你们俩。问题是:线程会在调用iret 之前开始运行吗,@MichaelPetch 回答了它。谢谢:)
  • 中断处理程序与线程或上下文切换没有任何关系。它们在低得多的级别上运行,中断只是将控制权转移给处理程序,只保留当前指令指针和标志寄存器。 IRET 再次恢复它们,中断的代码继续执行,就好像什么都没发生一样。在受保护模式的操作系统中,它变得更加复杂,ISR 在环 0 上运行,并且经常要求操作系统安排一个稍后执行的任务,在 ISR 被处理之后。这肯定会导致启动线程以处理 I/O 完成。

标签: multithreading operating-system x86-64 interrupt-handling


【解决方案1】:

当提到的寄存器被中断处理程序恢复时,为什么要调用 iret?

IRET 将进程返回到导致其进入内核模式的异常或中断之前的状态。

您看到的寄存器开关会更改进程上下文,但这是进程在内核模式处理程序中时的状态。然后 IRET 指令将进程状态返回到它在用户模式下的状态。

【讨论】:

    【解决方案2】:

    当提到的寄存器被中断处理程序恢复时,为什么要调用 iret?在切换线程时,下一个线程将立即启动

    您说“切换线程”,但iret 指令是使线程切换发生的原因。

    或者他是在使用 iret 调用完成中断处理程序后开始的?

    不要将 iret 视为“从中断中返回”。将其视为“恢复执行上下文”。它将字从堆栈弹出到重要的上下文寄存器中,总是包括程序计数器,并且可能包括定义虚拟地址空间和特权级别的寄存器。 CPU 在iret 之后执行的下一条指令将是来自新恢复的上下文的指令。

    iret 从堆栈中弹出的已保存上下文恰好与硬件中断推送的格式相同,但这并不意味着您只能弹出已推送的上下文由最近的硬件中断。您可以弹出一个之前推送的上下文,然后保存在某个“线程”数据结构中。您甚至可以弹出一个从无到有的全新上下文,以启动一个新线程。

    【讨论】:

      猜你喜欢
      • 2017-06-01
      • 1970-01-01
      • 2015-12-20
      • 2017-06-20
      • 1970-01-01
      • 2017-09-09
      • 2014-02-23
      • 1970-01-01
      • 2021-04-07
      相关资源
      最近更新 更多