You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

硬件异常处理入口/退出代码存储位置及状态保存机制问询

硬件异常/中断发生时,状态保存的机制详解

这个问题问得特别精准——毕竟函数调用的栈帧处理我们写代码时多少能摸到门道,但异常/中断的状态保存总像个“看不见的黑盒”。其实这事儿是硬件+内核软件协同干活的结果,我给你拆解得明明白白:

  • 硬件先自动搞定核心状态,这部分没代码,是硬逻辑
    当CPU检测到异常或者外部中断触发时,会立刻启动一套内置的硬件操作,完全不需要任何用户代码甚至内核代码参与:

    • 把当前正在执行的程序计数器(PC)、程序状态字(PSW,比如标志寄存器这类记录CPU状态的寄存器)直接压入栈(一般是内核栈,因为异常处理程序肯定跑在内核态)
    • 紧接着从你提到的异常向量表里找到对应处理程序的地址,把这个地址加载到PC里,直接跳过去执行
      这部分就像CPU执行push指令时的底层逻辑一样,是硬件电路硬编码好的,没有所谓的“代码存储在某个地方”——就是CPU天生会做的动作。
  • 内核软件再补全剩下的状态保存
    硬件只会帮你保存最关键的那几个寄存器,剩下的通用寄存器、浮点寄存器这些,就得靠异常处理程序开头的汇编代码来搞定了。比如在x86架构下,内核的异常入口点会有一段汇编,用pusha或者逐个push的方式把所有通用寄存器都压栈,这样后面用C写的异常处理逻辑就能放心用这些寄存器,不会把原来的状态搞丢。

  • 和函数调用的本质区别
    函数调用里谁压返回地址、谁保存寄存器,是靠调用约定(比如cdecl、fastcall)这种软件层面的规则来定的;但异常/中断的核心状态保存是硬件强制完成的——毕竟异常是突发状况,必须瞬间暂停当前执行流,要是等软件代码来做,搞不好关键状态就丢了,系统直接崩了。

  • 返回时的逆向操作
    等异常处理完了,先由内核代码把之前保存的通用寄存器啥的从栈里恢复回来,然后执行一条专门的硬件指令(比如x86的iret、ARM的subs pc, lr, #4),这条指令会让CPU自动从栈里把之前保存的PC和PSW恢复回去,直接回到异常发生前的那个点继续跑。

内容的提问来源于stack exchange,提问作者Engineer999

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:58:59