在用户空间发生中断时,上下文切换的过程

先引用一篇博文,再总结一下相关问题。

所谓上下文切换,实质就是寄存器堆的切换过程。这其中一部分需要硬件来切换,一部分需要软件来处理。

当在用户空间发生中断时,首先由 x86 CPU 从硬件角度进行处理,然后才是 linux 内核的处理。当中断处理完毕,返回到用户空间时,最后的步骤也是交给 CPU 硬件来处理的。

1、  X86 CPU 对中断的硬件支持

CPU 从中断控制器取得中断向量

根据中断向量从 IDT 中找到对应的中断门

根据中断门,找到中断处理程序

在进入中断处理程序前,需要将堆栈切换到内核堆栈。也就是将 TSS 中的 SS0、ESP0装入SS、ESP

然后将原来的用户空间堆栈(SS, ESP)、EFLAGS、返回地址(CS, EIP)压入新的堆栈。

 以上这一系列动作都由硬件完成

 最后,才进入中断处理程序,接下来,由 linux 内核处理

 2、  Linux 内核对中断的处理

保存中断来源号

调用 SAVE_ALL,保存各种寄存器

将 DS、ES 指向  __KERNEL_DS

将返回地址 ret_from_intr入栈

调用 do_IRQ进行中断处理

中断处理完毕,返回到 ret_from_intr

3、 ret_from_intr

所有的中断处理程序在处理完之后都要走到这里;

判断进入中断前是用户空间还是系统空间

如果进入中断前是系统空间,则直接调用  RESTORE_ALL

如果进入中断前是用户空间,则可能需要进行一次调度;如果不调度,则可能有信号需要处理;最后,还是走到 RESTORE_ALL

RESOTRE_ALL 和 SAVE_ALL 是相反的操作,将堆栈中的寄存器恢复

最后,调用 iret 指令 ,将处理权交给 CPU

4、  iret 指令使 CPU 从中断返回

此时,系统空间的堆栈和CPU在第1步处理完之后,交给 linux 内核时的情形是一样的,也就是保存着用户空间的返回地址(CS、EIP)、EFLAGS、用户空间的堆栈(SS、ESP)。

CPU将 CS、EIP、EFLAGS 、SS、ESP恢复,从而返回到用户空间。


总结一下:

一个CPU同一时刻只能在用户空间和内核空间的一个中运行。在CPU运行在用户空间的过程中,可能以以下两种方式陷入内核 1)系统调用:这其实是一种同步中断,也称“软件中断”(注意,不是软中断),或者称为“异常”,通过int指令来实现;陷入内核后,内核代码运行在进程上下文中。2)中断(也称异步中断),是由I/O设备产生的中断,它会触发中断服务例程的执行,并往往伴随着软中断的执行,此时,CPU运行在中断上下文中。上文中描述了CPU从中断返回用户空间的过程。

当内核即将返回用户空间时,内核会检查need_resched是否设置,如果设置,则调用schedule(),此时,发生用户抢占。一般来说,用户抢占发生几下情况:
(1)从系统调用返回用户空间;
(2)从中断(异常)处理程序返回用户空间。

与用户抢占相对应的是内核抢占,在内核2.6版本以前并不支持内核抢占,现在我们用的默认一般都是抢占式内核,这可以通过编译时设定编译选项来选择是否使用抢占式内核。对于非内核抢占系统,内核代码可以一直执行,直到完成,也就是说当进程处于内核态时,是不能被抢占的。而对于抢占式内核,在硬中断返回,软中断重新使能,解锁函数,以及开启了内核抢占的系统调用中等一系列情况下都可能发生抢占和CPU的重新调度。详细内容见下一篇博客。

进程上下文是指在一个进程执行期间,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容的总和。它包括用户级上下文和系统级上下文。用户级上下文包括用户的程序块、数据块、运行的堆和用户栈等组成的用户空间信息。而系统级上下文包括进程标识信息、进程现场信息、进程控制信息(包含进程表、页表、打开文件表等)和系统内核栈等组成的内核空间信息。 线程上下文与进程上下文类似,但是线程之间共享同一进程的地址空间,所以在切换线程上下文,不需要切换地址空间,只需要切换线程的寄存器状态即可。一次线程上下文切换发生在一个进程内的不同线程之间。 中断上下文是发生在CPU响应硬件中断,保存当前正在执行的上下文,然后切换到中断处理程序的上下文。中断上下文保存了中断前的进程上下文信息,以及中断处理程序执行所需要的寄存器和堆栈等。 中断上下文的切换是由硬件自动完成的,它会保存当前正在执行的进程或线程的上下文,切换到中断服务程序的上下文,等中断处理完成后再切换回原来的上下文。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Linux:上下文,进程上下文和中断上下文概念,上下文切换](https://blog.csdn.net/W546556/article/details/126300300)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [系统调用,上下文切换(cpu上下文,进程上下文,线程上下文,中断上下文,进程切换,线程切换)](https://blog.csdn.net/aa541850383/article/details/125363264)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值