在 x86 软件中断期间,究竟何时进行上下文切换?
During an x86 software interrupt, when exactly is a context switch made?
我问这个是因为我试图在我的玩具内核中实现中断。所以,我知道当中断发生时,CPU 会将各种信息位压入堆栈。但是,我在网上搜索的所有地方都以不同的顺序显示不同的信息。我也知道如果中断发生在用户模式(Ring 3),CPU 必须切换到内核模式(Ring 0)才能执行 ISR。我认为它与 TSS
和 ss
以及 esp
有关,但我不确定。我在互联网上阅读了各种不同的解释,但尚未发现其中任何一个有任何一致性。
所以 我的问题是, (x86) CPU 以什么 exact 顺序将数据推入堆栈一个中断,它什么时候执行,它在什么时间点通过 TSS
进行上下文切换,这如何影响压入堆栈的数据(如果有的话)?
到目前为止我从研究中学到的东西(如果错误请纠正我): 我很确定处理器会推动 eflags
、cs
和 eip
入栈,必要时在中断期间加入 error code
。然而,这就是推动的全部吗?我在别处读到 ss
和 esp
被推送,但我不知道这种情况是否一直发生,或者 为什么 它被推送。
此外,我相信 CPU 会在 TSS
中查找 Ring0 ss
和 esp
以及 在某些时候加载它们,但我不确定什么时候。也许它在中断发生后立即执行此操作?此外,在所有这些过程中如何处理 cs
和 ds
? cs
是否由 CPU 从 IDT
中的条目加载? ds
呢?我必须手动加载吗?
抱歉,如果问错了地方,我不确定我还应该问哪里。
只需拿起 Intel Manual 3 并阅读:
- 第 6 章中断和异常处理
- 第 5.8.5 节堆栈切换
- 5.8.6 从调用过程返回。
这是在中断时推送的内容
请记住,中断是通过任务门、陷阱门和中断门[=32处理的=],每一个都有不同的语义,最后两个非常接近 Call gates。
我问这个是因为我试图在我的玩具内核中实现中断。所以,我知道当中断发生时,CPU 会将各种信息位压入堆栈。但是,我在网上搜索的所有地方都以不同的顺序显示不同的信息。我也知道如果中断发生在用户模式(Ring 3),CPU 必须切换到内核模式(Ring 0)才能执行 ISR。我认为它与 TSS
和 ss
以及 esp
有关,但我不确定。我在互联网上阅读了各种不同的解释,但尚未发现其中任何一个有任何一致性。
所以 我的问题是, (x86) CPU 以什么 exact 顺序将数据推入堆栈一个中断,它什么时候执行,它在什么时间点通过 TSS
进行上下文切换,这如何影响压入堆栈的数据(如果有的话)?
到目前为止我从研究中学到的东西(如果错误请纠正我): 我很确定处理器会推动 eflags
、cs
和 eip
入栈,必要时在中断期间加入 error code
。然而,这就是推动的全部吗?我在别处读到 ss
和 esp
被推送,但我不知道这种情况是否一直发生,或者 为什么 它被推送。
此外,我相信 CPU 会在 TSS
中查找 Ring0 ss
和 esp
以及 在某些时候加载它们,但我不确定什么时候。也许它在中断发生后立即执行此操作?此外,在所有这些过程中如何处理 cs
和 ds
? cs
是否由 CPU 从 IDT
中的条目加载? ds
呢?我必须手动加载吗?
抱歉,如果问错了地方,我不确定我还应该问哪里。
只需拿起 Intel Manual 3 并阅读:
- 第 6 章中断和异常处理
- 第 5.8.5 节堆栈切换
- 5.8.6 从调用过程返回。
这是在中断时推送的内容
请记住,中断是通过任务门、陷阱门和中断门[=32处理的=],每一个都有不同的语义,最后两个非常接近 Call gates。