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

时间:2016-06-27 23:51:34

标签: assembly x86 stack cpu interrupt

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

所以我的问题是,以什么完全顺序,(x86)CPU在中断期间将数据推送到堆栈上以及何时执行此操作,以及它是通过TSS进行上下文切换的时间点,如果有的话,这会如何影响推送到堆栈的数据?

到目前为止我从研究中学到了什么(如果错误,请纠正我):我非常确定处理器会将eflagscseip推到在中断期间,如果需要,堆栈以及error code。然而,这一切都被推了吗?我在其他地方读过ssesp被推,但我不知道这是否一直发生,或为什么被推送。

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

对不起,如果这是一个错误的地方,我不知道我应该在哪里。

1 个答案:

答案 0 :(得分:4)

选择Intel Manual 3并阅读:

  • 第6章中断和例外处理
  • 第5.8.5节“堆叠切换”
  • 5.8.6从被叫程序返回

这是在中断上推送的内容

ISR stack

请记住,中断是通过任务门陷阱门中断门来处理的,每个都有不同的语义和最后一个两个非常靠近呼叫门