当前位置: 首页 > news >正文

十六、异常和中断的响应过程

目录
  • 第一阶段:硬件自动响应(CPU负责)
  • 第二阶段:软件处理(操作系统负责)
  • 第三阶段:硬件返回(CPU负责)
  • 总结特点


异常和中断的响应过程是计算机系统最核心的机制之一。这个过程是硬件和操作系统紧密协同的结果,其设计目标是高效、透明地处理突发事件,并能够正确返回到被打断的地方。

虽然不同架构的CPU在细节上有所不同,但其核心流程是基本一致的。下图清晰地展示了从触发到返回的完整流程:

flowchart TD A[中断/异常触发] --> B["CPU硬件: 检测事件<br>产生向量号"]; B --> C["CPU硬件: 保存现场<br>(压栈)"]; C --> D["CPU硬件: 关中断(可选)"]; D --> E["CPU硬件: 查IDT表<br>加载处理程序地址"]; E --> F["CPU硬件: 跳转至<br>软件处理程序"]; F --> G["操作系统软件: 执行具体处理<br>(如系统调用服务, 缺页处理)"]; G --> H["操作系统软件: 执行中断返回指令(IRET)"]; H --> I["CPU硬件: 恢复现场<br>(弹栈)"]; I --> J["CPU硬件: 开中断(可选)<br>返回到断点继续执行"];

以下是每个阶段的详细说明:


第一阶段:硬件自动响应(CPU负责)

这部分完全由CPU硬件自动完成,不需要执行任何软件指令。

  1. 检测与识别

    • 对于中断:CPU在每个指令周期的末尾检查中断引脚是否有信号。如果有,并且没有被屏蔽,则确认中断,并从硬件控制器读取一个中断向量号
    • 对于异常:CPU在执行指令的过程中,其内部执行单元检测到错误(如除零、缺页),随即根据错误类型产生一个固定的异常向量号
  2. 保存现场

    • 为了将来能正确返回,CPU必须立即保存当前程序的执行状态(上下文)。通常,CPU会自动将以下内容压入当前的内核栈(注意,是切换到内核栈,而不是用户栈):
      • 程序计数器:即下一条即将要执行的指令的地址(EIP / RIP)。
      • 处理器状态字:包含当前中断开关状态、CPU特权级等关键标志的寄存器(EFLAGS / RFLAGS)。
      • 错误码:对于某些异常(如页故障),CPU还会压入一个错误码,为软件提供更详细的错误信息。
    • 关键点:此时保存的现场信息是最小集,只保证能够正确返回。
  3. 切换模式

    • CPU会自动从用户态切换到内核态,将特权级提升到最高(Ring 0)。这样,后续的处理代码就可以执行任何特权指令,访问整个内存空间。
  4. 查找处理程序

    • CPU使用之前产生的向量号作为索引,去查询一个在内存中预先由操作系统设置好的表——中断描述符表
    • IDT的每个表项都包含一个中断/异常处理程序的入口地址(代码段选择子和偏移量)。
  5. 跳转执行

    • CPU根据从IDT表中取出的地址,跳转到对应的中断/异常处理程序开始执行。至此,硬件的工作全部完成,控制权交给操作系统软件。

第二阶段:软件处理(操作系统负责)

现在开始执行操作系统内核的代码。

  1. 保存完整现场

    • 之前CPU只保存了很少的几个寄存器。现在,操作系统代码需要手动保存所有可能会被用到的通用寄存器的值(如EAX, EBX, ECX, EDX等)到内核栈上。这是一个标准的函数调用 prologue,但保存的是用户程序的寄存器。
  2. 执行具体处理

    • 这是最核心的一步,根据不同的中断或异常类型,执行相应的处理程序。
    • 处理中断:例如,如果是键盘中断,就从键盘控制器读取按键数据;如果是时钟中断,就可能触发进程调度。
    • 处理异常:例如,如果是缺页异常,操作系统需要将缺失的页面从磁盘加载到内存;如果是系统调用陷阱,操作系统就根据寄存器中的参数调用相应的内核函数。
  3. 调度(可选)

    • 在处理过程中(尤其是在时钟中断处理中),操作系统可能会发现当前进程的时间片用完了,或者有一个更高优先级的进程就绪了。这时,它可能会做出进程调度的决定。
  4. 恢复现场并返回

    • 具体处理完成后,操作系统执行与第6步相反的操作:手动恢复所有之前保存的通用寄存器的值。
    • 最后,操作系统执行一条特殊的指令:IRET。这条指令是中断处理的“返回指令”,它告诉CPU硬件:“中断处理结束了,你现在可以恢复最初的现场了”。

第三阶段:硬件返回(CPU负责)

CPU再次接管控制权,完成收尾工作。

  1. 恢复现场并返回
    • 执行IRET指令后,CPU硬件会自动执行与第一阶段保存现场相反的操作:
      • 从内核栈中弹出之前保存的程序计数器处理器状态字
      • 这意味着CPU的特权级和中断开关状态也恢复了。
    • CPU接着从弹出的程序计数器地址开始执行指令。于是,被中断的程序就仿佛什么都没发生过一样,继续运行。

总结特点

  • 透明性:对于被中断的程序来说,整个过程是透明的(除了执行时间变长)。它的状态被完美保存和恢复。
  • 高效性:硬件完成了最紧迫的现场保存和跳转工作,保证了响应的及时性。
  • 安全性:通过切换到内核态和查询预设的IDT表,确保了用户程序无法随意篡改中断处理流程,构成了系统安全的基础。
  • 协同性:整个过程是硬件机制和操作系统软件完美配合的典范。硬件提供了基础框架,软件则提供了具体的处理逻辑。
http://www.wxhsa.cn/company.asp?id=2726

相关文章:

  • 直播平台搭建,浏览器中的事件循环与Node中的事件循环 - 云豹科技
  • Redisson 分布式锁的实现原理 - 教程
  • 关于前端的一些疑问整理(标签属性值和符号)
  • 深入解析:免费的SSL和付费SSL 证书差异
  • 领嵌iLeadE-588网关AI边缘计算盒子智能安防监控
  • 十五、异常和中断事件的初始检测、识别和处理
  • 十四、异常和中断的分类
  • 思考 | 躺平者的本质和区别
  • ros2--service/服务--接口 - 教程
  • c++
  • LayerMask的使用规范
  • 存在,是终极的神奇。ECT-OS-JiuHuaShan 框架正是这份神奇的自我觉醒、自我阐述与自我捍卫
  • 深入解析:【Unity基础】枚举AudioType各个枚举项对应的音频文件类型
  • 十三、异常和中断的基本概念
  • 【关注可白嫖源码】25046基于SpringBoot的少儿编程管理系统设计与达成
  • 2024-2025第二学期计算机网络助教工作总结
  • 信息搜集、物联网搜索引擎、ARL灯塔系统、Nmap
  • 工具链部署实用技巧 7|模型设计帧率推理时耗时与带宽分析
  • 基于Django的“社区爱心养老管理系统”设计与开发(源码+数据库+文档+PPT) - 实践
  • 关于导出bangumi.tv用户收藏/观看数据
  • ECT-OS-JiuHuaShan框架元推理,为何超乎想象,难以置信?
  • 实用指南:Excel转图片excel2img库bug修复:AttributeError ‘parent‘ 问题解决方案
  • ECT-OS-JiuHuaShan框架元推理,其运行与推理,是自指自洽性的唯一证明
  • 数据结构与算法-32.图-加权无向图最小生成树
  • 找到字符串中所有字母异位词-leetcode
  • 配置gemini
  • 基于chrony的NTP校时配置方法
  • windows能过注册表修改c盘默认目录
  • ECT-OS-JiuHuaShan框架元推理,就是普罗米修斯主义,穷神知化
  • UI/UX 桌面操作系统应该做好的几个功能