中断和上下文切换

时间:2017-06-16 12:12:04

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

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

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

2 个答案:

答案 0 :(得分:3)

  

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

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

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

答案 1 :(得分:1)

  

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

你说,“在切换线程时”,但iret指令是使线程切换发生的。

  

或者他是在用iret调用完成中断处理程序后启动的?

不要把iret想象成“从中断回来”。可以把它想象成“恢复执行上下文”。它将来自堆栈的单词弹出到重要的上下文寄存器中,始终包括程序计数器,并且可能包括定义虚拟地址空间和权限级别的寄存器。在iret之后CPU执行的下一条指令将是来自新恢复的上下文的指令。

iret弹出堆栈的保存上下文恰好与硬件中断推送的格式相同,但这并不意味着您只能弹出上下文被最新的硬件中断所推动。您可以弹出一段时间之前推送的上下文,然后保存在某些“线程”数据结构中。您甚至可以弹出一个全新的上下文,该上下文是从零开始生成的,以便开始一个新的线程。