Multithreading 中断和上下文切换

Multithreading 中断和上下文切换,multithreading,operating-system,x86-64,interrupt-handling,Multithreading,Operating System,X86 64,Interrupt Handling,我正在阅读一些关于操作系统实现的论文和源代码,对此我有一些疑问。 在github上的一些操作系统中,上下文切换是在计时器中断的中断处理中进行的。 他们保存了寄存器rbx、r12、r13、r14、r15、rbp和rsp,并从下一个线程的保存状态恢复这些寄存器 这些线程开关是在调用iret之前在计时器中断处理例程中进行的。我的问题是:当所提到的寄存器由中断处理程序恢复时,为什么调用iret?切换线程时,下一个线程将立即启动,或者是在用iret调用完成中断处理程序后启动 当中断处理程序恢复上述寄存器时

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

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

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

您会说,“在切换线程时”,但是
iret
指令是线程切换发生的原因

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

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

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

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

您会说,“在切换线程时”,但是
iret
指令是线程切换发生的原因

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

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

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

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

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

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

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

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


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

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