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

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

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

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

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

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

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

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

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

 

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

 

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

 

2、  Linux 内核对中断的处理

保存中断来源号

调用 SAVE_ALL,保存各种寄存器

DSES 指向  __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 内核时的情形是一样的,也就是保存着用户空间的返回地址(CSEIP)、EFLAGS、用户空间的堆栈(SSESP)。

CPU CSEIPEFLAGS SSESP恢复,从而返回到用户空间。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
进程上下文是指在一个进程执行期间,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、付费专栏及课程。

余额充值