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

Posted

技术标签:

【中文标题】在 x86 软件中断期间,究竟何时进行上下文切换?【英文标题】:During an x86 software interrupt, when exactly is a context switch made? 【发布时间】:2016-10-30 02:48:54 【问题描述】:

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

所以我的问题是, (x86) CPU 在中断期间以什么确切 顺序将数据推送到堆栈上,它是在什么时候进行的,以及在什么情况下时间点是否通过TSS 进行上下文切换,如果有的话,这对推入堆栈的数据有何影响?

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

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

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

【问题讨论】:

不要相信互联网上的随机事物。使用官方手册:Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide, Part 1, CHAPTER 6 INTERRUPT AND EXCEPTION HANDLING @Jester :我们是否应该相信随机发布非官方 cmets 并引导他们获取官方信息的人? ;) 【参考方案1】:

只需拨打Intel Manual 3 并阅读:

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

这是在中断时推送的内容

请记住,中断是由 Task GatesTrap gatesInterrupt gates 处理的,每一个都有不同的语义,最后一个两个非常靠近呼叫门

【讨论】:

以上是关于在 x86 软件中断期间,究竟何时进行上下文切换?的主要内容,如果未能解决你的问题,请参考以下文章

结合中断上下文切换和进程上下文切换分析Linux内核一般执行过程

结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程

结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程

一文讲透!Windows内核 & x86中断机制详解

实验3前篇——X86的中断管理

实验3前篇——X86的中断管理