MIPS32异常处理
看清异常触发到ERET返回的每一步:CP0状态切换、向量分流与现场恢复
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
MIPS32异常处理
看清异常触发到ERET返回的每一步:CP0状态切换、向量分流与现场恢复
什么是MIPS异常
你正在写代码,同事拍你肩膀问问题——你必须暂停手头工作回应,处理完再继续。CPU执行指令时也会遇到类似情况,MIPS把所有这类'正在做的事被强行打断'的事件,统称为异常。
同事叫你=外部中断;发现代码bug=内部异常;都让你暂停手头工作
异常类型详解
CPU 逐条执行指令时,可能被各种事件打断:硬件敲门、电话响起、算账溢出……异常种类繁多,本页按触发方式给它们分类。
客人突然来访(中断)vs 同事按铃求助(系统调用)vs 账目算错(溢出)
异常分类结构图
树状图展示各类型异常的包含关系
异常向量基础
认识了那么多异常类型——中断、syscall、TLB miss——CPU 在异常发生的那一瞬间,是怎么知道该跳到哪段代码去处理的?这就要靠「异常向量」了。
急症先到分诊台统一登记,再由护士按症状分发到对应科室
异常向量内存布局
从0x80000000起,4个向量槽以0x80字节为间距顺次排列。
向量模式与地址计算
上一节我们看到异常入口被摆在固定地址。但同一类异常里可能混着多个设备在喊,CPU 怎么知道是谁?两种「寻路模式」给出了不同答案。
所有访客先到前台,再由前台引导到对应部门
硬件自动行为
硬件接管异常瞬间,会自动完成五件关键动作,软件无需插手。
EPC寄存器详解
上页讲到硬件自动保存现场,最关键的是 EPC。它不是简单备份 PC,而是定义了"异常处理完后从哪里恢复执行"。这个寄存器在精确/非精确异常、延迟槽等边界场景下有讲究。
书签标记"被打断的那一页"。EPC标记"闯祸的指令",ERET把书签插回原处
Cause与Status寄存器
前面 EPC 保存了『从哪里来』,但处理器还要回答两个问题:『异常是什么类型』、『当前处理器处于什么状态』。分别由 Cause 和 Status 两个寄存器承担。
Cause=病历诊断(什么病、在哪发作);Status=病人当前状态与可用的治疗权限
软件处理流程
进入异常向量后,软件接管,按顺序完成五件事。
异常处理完整时序图
硬件到软件的全流程时序
基础异常处理代码
最小可运行的异常处理框架
系统调用异常处理
一段 MIPS32 syscall 处理汇编:硬件自动保存上下文后,内核按 o32 约定分发。
L7 提取 BD 位;L20-L22 是 o32 约定——v0 传 syscall 号,a0/a1 装参数;L35 eret 原子清 EXL 跳回 EPC。
实例流程分析
从执行syscall到返回用户态,按时序看硬件与软件如何接力。
核心概念自测
MIPS 异常若发生在分支延迟槽内,硬件自动保存到 EPC 寄存器的是哪条指令的地址?
MIPS32异常处理要点
- ✓向量入口地址由硬件固定映射,软件只需放置处理例程
- ✓硬件只保存PC与状态位,通用寄存器全靠软件压栈
- ✓EPC返回靠jr写回PC,rfe弹出Status栈恢复旧状态
- ✓Cause区分异常来源,Status栈位实现中断嵌套屏蔽
- ✓异常与中断共享同一向量机制,区别仅在触发来源
课后思考
先独立思考再看参考答案,三题对应回顾、应用与边界三个层次。
参考答案硬件自动保存让关键状态不依赖软件正确性——即便handler有bug导致崩溃,现场也已保留;纯软件保存则可能在崩溃时丢失上下文,本质是信任边界的划分。
参考答案EPC和Cause会被覆盖为新异常的现场,但Status.EXL使CPU进入内核态并屏蔽后续异常;handler必须显式清除EXL才能重新允许嵌套,本质是状态机保护。
参考答案三个维度:①缩小保存寄存器集,只save实际用到的;②handler紧致排布并对齐i-cache减少miss;③用EPC+4直接跳转,跳过向量表查表开销。