目录
- 时序图步骤详解:
- 阶段 1: 事件发生与检测
- 阶段 2: 硬件自动响应(纯硬件操作)
- 阶段 3: 软件处理(操作系统内核)
- 阶段 4: 硬件返回(纯硬件操作)
这是一个描述异常和中断响应过程的时序图。它清晰地展示了硬件(CPU)和软件(操作系统)之间如何协同完成整个响应和处理流程。
sequenceDiagramparticipant H as CPU Hardwareparticipant OS as OS Software (Kernel)participant P as User ProcessNote over H, P: 1. 事件发生与检测H->>H: 每个指令周期末检查中断引脚<br>或执行单元检测异常alt 中断发生H->>H: 从设备获取中断向量号else 异常发生H->>H: 根据错误类型生成异常向量号endNote over H, P: 2. 硬件自动响应(瞬间完成)H->>H: 保存现场: EFLAGS, CS, EIP, ErrorCode(可选)H->>H: 关中断(若为异常)H->>H: 切换至内核态(Ring 0)<br>切换内核栈H->>H: 查IDT表,获取处理程序地址H->>OS: 跳转至中断/异常处理程序Note over OS, P: 3. 软件处理(操作系统)OS->>OS: 保存所有通用寄存器OS->>OS: 开中断(若为中断)alt 处理中断OS->>OS: 读取设备数据,发送应答等else 处理异常alt 故障 (Fault)OS->>OS: 修复错误(如加载缺失页)else 陷阱 (Trap)OS->>OS: 提供服务(如系统调用)else 中止 (Abort)OS->>OS: 终止程序/系统endendOS->>OS: 可能进行进程调度决策OS->>OS: 恢复所有通用寄存器OS->>H: 执行IRET指令Note over H, P: 4. 硬件返回H->>H: 从内核栈弹出EIP, CS, EFLAGSH->>H: 切换回用户态(原特权级)<br>切换回用户栈H->>H: 开中断(若之前关闭)H->>P: 跳回原EIP地址继续执行<br>(用户进程无感知)
时序图步骤详解:
阶段 1: 事件发生与检测
- CPU硬件在每个指令执行周期的末尾,都会自动检查中断请求引脚。如果外部设备(如键盘、硬盘)发来中断信号,CPU会从中断控制器读取一个中断向量号。
- 同时,CPU的执行单元在运行指令时,会实时检测是否有异常(如除零、非法地址访问)。一旦发现,立即产生一个异常向量号。
阶段 2: 硬件自动响应(纯硬件操作)
这是最关键且完全由硬件自动完成的瞬间步骤,保证了响应的及时性:
- 保存最小现场:CPU将当前进程的EFLAGS(状态寄存器)、CS(代码段寄存器)、EIP(下一条指令地址)自动压入内核栈。对于某些异常,还会压入错误码。
- 关中断:如果是异常,CPU可能会自动清除
EFLAGS
中的IF
位,关闭中断,以避免在处理一个严重错误时被新的中断打断。 - 切换模式:CPU从用户态切换到内核态,并将栈指针从用户栈切换到当前进程的内核栈。
- 查找处理程序:CPU使用向量号作为索引,查询中断描述符表,找到对应的中断/异常处理程序的入口地址。
- 跳转:CPU跳转到操作系统内核的相应处理程序开始执行。
阶段 3: 软件处理(操作系统内核)
现在开始执行操作系统的代码:
6. 保存完整现场:操作系统代码首先手动将所有的通用寄存器(EAX, EBX, ECX...)的值压入内核栈。这是为了确保在处理过程中不会破坏用户进程的状态。
7. 开中断:如果是处理中断,操作系统此时可能会重新打开中断,允许更高优先级的中断嵌套。
8. 执行具体处理:
* 处理中断:例如,读取键盘缓存区的数据、向硬盘控制器发送下一个读写命令等。
* 处理异常:
* 故障:尝试修复问题(如为缺页异常分配物理页),修复成功后,返回重试原指令。
* 陷阱:执行系统调用服务,完成后返回执行下一条指令。
* 中止:终止出错的进程。
9. 调度决策:在处理过程中(尤其是时钟中断),操作系统可能会判断是否需要执行进程调度。
10. 恢复现场:处理完毕后,操作系统代码手动将之前保存的通用寄存器值从栈中弹出,恢复到CPU中。
11. 返回指令:操作系统执行IRET
指令。这条指令是告诉CPU:“软件处理完毕,你可以恢复硬件现场了”。
阶段 4: 硬件返回(纯硬件操作)
- 恢复最小现场:CPU执行
IRET
指令,自动从内核栈中弹出之前保存的EIP、CS、EFLAGS的值。 - 切换回用户态:根据恢复的
CS
寄存器,CPU特权级从内核态切换回原来的用户态,栈指针也切换回用户栈。 - 恢复执行:CPU根据恢复的EIP地址,继续执行被中断的用户进程。整个过程中,用户进程对此毫无感知,就像什么都没发生过一样。