中断响应分为两个阶段:中断响应阶段(硬件完成)和中断处理阶段(软件完成)。
Step 1: 中断请求 设备发出 IRQ,多个设备可能同时请求
Step 2: 中断判优 硬件判优电路决定响应哪个(链式/并行/软件)
Step 3: 中断响应(CPU)
① 关中断 (IF=0)
② 保存断点 (PC 和 PSW 压栈)
③ 识别中断源 (获取中断向量号)
④ 形成中断服务程序入口地址
Step 4: 中断服务
① 保存现场(通用寄存器压栈)
② 开中断 (IF=1,允许嵌套)
③ 执行中断服务程序
④ 关中断 (IF=0)
⑤ 恢复现场(寄存器出栈)
Step 5: 中断返回
① 开中断 (IF=1)
② 恢复断点 (PC 和 PSW 出栈)
③ 返回断点继续执行
| 关中断时机 | 目的 |
|---|---|
| 响应时关中断 | 保存断点时不能被打断,否则断点丢失 |
| 恢复现场前关中断 | 恢复现场时不能被打断,否则寄存器被覆盖 |
| 保存内容 | 时机 | 执行者 | 内容 |
|---|---|---|---|
| 保存断点 | 中断响应时 | 硬件 | PC、PSW |
| 保存现场 | 中断服务开始 | 软件 | 通用寄存器 |
硬件向量法:中断向量号 → 中断向量表(内存)→ 入口地址,硬件自动完成。
软件查询法:CPU 依次查询各设备状态寄存器,找到请求设备转入服务程序;速度慢但灵活。
每个中断源对应一个中断向量号(0-255)。中断向量表存放中断服务程序入口地址。
入口地址位置 = 中断向量表基址 + n × 每项字节数
x86 实模式:地址 = 0x0000 + n × 4
向量号 0x21 的入口在 0x0000 + 0x21×4 = 0x0084 处
CPU 响应中断必须满足:
CPU 指令平均 2μs;硬件开销 3 个时钟周期;时钟 100MHz
硬件响应时间 = 3 × (1/100MHz) = 30ns
总中断延迟 ≈ 30ns + 2μs ≈ 2.03μs
4 设备 A>B>C>D,屏蔽字 1110(只允许 D)
bit0(A)=1 屏蔽 / bit1(B)=1 屏蔽 / bit2(C)=1 屏蔽 / bit3(D)=0 允许
→ 仅 D 可被响应
改 0100:允许 A、C,屏蔽 B、D
优先级 A>B>C>D,初始中断开启
D请求→服务D;B请求→打断D服务B;A请求→打断B服务A
A完→回B;B完→回D;D完→回主程序
嵌套栈:主程序→D→B→A
时间→
┌──────┐ ┌────┐ ┌────┐ ┌─────────┐ ┌────┐ ┌────┐
指令执行:│当前指令│ │保存PC│ │取向│ │ 保存现场 │ │中断│ │恢复│
└──────┘ └────┘ └────┘ └─────────┘ └────┘ └────┘
硬件自动 硬件 软件(服务程序) 软件
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。