我正在阅读有关操作系统实施的一些文章和源代码,并对此有疑问。
在github上的某些操作系统中,上下文切换是在来自定时器中断的中断处理中进行的。
他们保存了寄存器rbx, r12, r13, r14, r15, rbp
和rsp
,并从下一个线程的已保存状态中恢复了这些寄存器。
这些线程切换是在调用iret
之前在定时器中断处理例程中进行的。我的问题是:当提到的寄存器由中断处理程序恢复时,为什么调用iret
?在切换线程时,下一个线程将立即启动 - 或者是在使用iret
调用完成中断处理程序后启动?
答案 0 :(得分:3)
当提到的寄存器由中断处理程序恢复时,为什么要调用iret?
IRET将进程返回到异常或中断之前的状态,导致进入内核模式。
您看到的寄存器开关会更改进程上下文,但这是处理内核模式处理程序时的进程状态。然后,IRET指令将进程状态返回到用户模式的状态。
答案 1 :(得分:1)
当中断处理程序恢复上述寄存器时,为什么要调用iret?在切换线程时,下一个线程将立即启动
你说,“在切换线程时”,但iret
指令是使线程切换发生的。
或者他是在用iret调用完成中断处理程序后启动的?
不要把iret想象成“从中断回来”。可以把它想象成“恢复执行上下文”。它将来自堆栈的单词弹出到重要的上下文寄存器中,始终包括程序计数器,并且可能包括定义虚拟地址空间和权限级别的寄存器。在iret
之后CPU执行的下一条指令将是来自新恢复的上下文的指令。
iret
弹出堆栈的保存上下文恰好与硬件中断推送的格式相同,但这并不意味着您只能弹出上下文被最新的硬件中断所推动。您可以弹出一段时间之前推送的上下文,然后保存在某些“线程”数据结构中。您甚至可以弹出一个全新的上下文,该上下文是从零开始生成的,以便开始一个新的线程。