在 x86 软件中断期间,究竟何时进行上下文切换?

During an x86 software interrupt, when exactly is a context switch made?

我问这个是因为我试图在我的玩具内核中实现中断。所以,我知道当中断发生时,CPU 会将各种信息位压入堆栈。但是,我在网上搜索的所有地方都以不同的顺序显示不同的信息。我也知道如果中断发生在用户模式(Ring 3),CPU 必须切换到内核模式(Ring 0)才能执行 ISR。我认为它与 TSSss 以及 esp 有关,但我不确定。我在互联网上阅读了各种不同的解释,但尚未发现其中任何一个有任何一致性。

所以 我的问题是, (x86) CPU 以什么 exact 顺序将数据推入堆栈一个中断,它什么时候执行,它在什么时间点通过 TSS 进行上下文切换,这如何影响压入堆栈的数据(如果有的话)?

到目前为止我从研究中学到的东西(如果错误请纠正我): 我很确定处理器会推动 eflagscseip 入栈,必要时在中断期间加入 error code。然而,这就是推动的全部吗?我在别处读到 ssesp 被推送,但我不知道这种情况是否一直发生,或者 为什么 它被推送。

此外,我相信 CPU 会在 TSS 中查找 Ring0 ssesp 以及 在某些时候加载它们,但我不确定什么时候。也许它在中断发生后立即执行此操作?此外,在所有这些过程中如何处理 csdscs 是否由 CPU 从 IDT 中的条目加载? ds 呢?我必须手动加载吗?

抱歉,如果问错了地方,我不确定我还应该问哪里。

只需拿起 Intel Manual 3 并阅读:

  • 第 6 章中断和异常处理
  • 第 5.8.5 节堆栈切换
  • 5.8.6 从调用过程返回

这是在中断时推送的内容

请记住,中断是通过任务门陷阱门中断门[=32处理的=],每一个都有不同的语义,最后两个非常接近 Call gates