硬件异常处理入口/退出代码存储位置及状态保存机制问询
硬件异常/中断发生时,状态保存的机制详解
这个问题问得特别精准——毕竟函数调用的栈帧处理我们写代码时多少能摸到门道,但异常/中断的状态保存总像个“看不见的黑盒”。其实这事儿是硬件+内核软件协同干活的结果,我给你拆解得明明白白:
硬件先自动搞定核心状态,这部分没代码,是硬逻辑
当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
相关产品推荐
相关产品推荐

