我问这个是因为我试图在我的玩具内核中实现中断。所以,我知道当发生中断时,CPU会将各种信息压入堆栈。但是,我在网上搜索的每个地方都会以不同的顺序显示不同的信息。我也知道如果中断发生在用户模式(Ring 3),CPU必须切换到内核模式(Ring 0)才能执行ISR。我认为它与TSS
和ss
以及esp
有关,但我不确定。我已经在互联网上阅读了各种不同的解释,但尚未找到任何一致性。
所以我的问题是,以什么完全顺序,(x86)CPU在中断期间将数据推送到堆栈上以及何时执行此操作,以及它是通过TSS
进行上下文切换的时间点,如果有的话,这会如何影响推送到堆栈的数据?
到目前为止我从研究中学到了什么(如果错误,请纠正我):我非常确定处理器会将eflags
,cs
和eip
推到在中断期间,如果需要,堆栈以及error code
。然而,这一切都被推了吗?我在其他地方读过ss
和esp
被推,但我不知道这是否一直发生,或为什么被推送。
此外,我相信CPU会在TSS
中查找Ring0 ss
和esp
以及在某些时候加载它们,但我是不知道什么时候。也许它在中断发生后立即执行此操作?此外,在所有这些过程中如何处理cs
和ds
? CPU是否从cs
的条目加载IDT
?那么ds
呢?我必须手动加载吗?
对不起,如果这是一个错误的地方,我不知道我应该在哪里。
答案 0 :(得分:4)
选择Intel Manual 3并阅读:
这是在中断上推送的内容
请记住,中断是通过任务门,陷阱门和中断门来处理的,每个都有不同的语义和最后一个两个非常靠近呼叫门。