【发布时间】:2017-11-19 05:10:01
【问题描述】:
我正在阅读一些关于操作系统实现的论文和源代码,并且对此有疑问。
在 github 上的某些操作系统中,上下文切换是在定时器中断的中断处理中进行的。
他们保存了寄存器rbx, r12, r13, r14, r15, rbp 和rsp,并从下一个线程的保存状态中恢复了这些寄存器。
这些线程切换是在定时器中断处理例程中进行的,在调用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