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

計組-中斷與子程序調用的區別

核心区别总结

特性中断处理程序子程序
触发方式异步、被动。由外部硬件事件或CPU异常强制发生,与当前正在执行的代码无关。同步、主动。由程序中的特定指令(如 CALLBL主动调用,是程序流程的一部分。
调用源外部硬件(如定时器、键盘、网卡)或CPU内部异常(如除零错误、页故障)。同一程序中的另一段代码。
发生时机不可预测。理论上可以在任何指令执行期间发生。可预测。调用点完全由程序逻辑决定。
保护现场的目的保存“被中断者”的完整状态,以便在中断结束后能无缝衔接,仿佛什么都没发生过。保存“调用者”的局部状态,以便在子程序执行完毕后能恢复调用者的工作
保护现场的上下文更全面、更底层。包括程序计数器(PC)、程序状态字(PSW)、以及可能被破坏的所有通用寄存器相对较少、有约定。通常只保存需要被子程序破坏的寄存器(由调用约定规定,如Callee-saved registers)。
返回指令专用的中断返回指令(如 x86 的 IRET)。它会恢复PC和PSW。普通的返回指令(如 x86 RET)。它只恢复PC。
栈的使用通常是内核栈。每个进程可能有自己的内核栈,用于处理中断。通常是用户栈。是进程自身内存空间的一部分。
权限级别通常运行在更高的内核态/特权级通常运行在与调用者相同的权限级别(通常是用户态)。

深入解析

1. 本质与触发方式:被动响应 vs. 主动调用
  • 中断处理程序:想象一下你正在专心看书,突然电话铃响了。你必须放下书去接电话。这个“电话铃”就是中断信号,它异步地打断了你当前的工作。中断处理程序是系统对突发事件的一种被动响应机制。CPU在执行完当前指令后,会检查是否有中断请求,如果有,就强制转入中断处理流程。

  • 子程序:这就像你在看书时,遇到一个不认识的单词,你主动去翻字典。查字典这个行为是你计划内的,是你程序逻辑的一部分。子程序调用是程序流程中同步、可预测的一环。

2. 保护现场:保存“整个世界” vs. 保存“工作进度”

这是两者最关键的区分点。

  • 中断处理程序:它的目标是“透明”。当中断发生时,当前正在运行的程序(我们称之为“被中断进程”)对此一无所知。中断处理程序必须在执行前,把被中断程序的完整执行现场保存到栈上。这包括:

    • 程序计数器(PC):下一条要执行的指令地址。

    • 程序状态字(PSW):包含条件码、中断允许位等关键状态信息。

    • 所有通用寄存器:因为中断处理程序可能会使用任何寄存器,为了不破坏被中断程序的环境,必须全部保存。
      这就像是接电话前,你不仅要在书里夹个书签(PC),还要记录下你当前的思绪、笔的位置等等所有状态(寄存器和PSW),确保挂掉电话后能完全回到之前的状态。

  • 子程序:它的调用是“约定好的”。编译器和编程规范会定义一个调用约定,明确规定调用者和被调用者(子程序)各自需要保存哪些寄存器。

    • 调用者保存:如果调用者希望某些寄存器的值在子程序调用后保持不变,它需要在调用前自己保存这些寄存器。

    • 被调用者保存:子程序承诺,在它返回前,会恢复某些指定的寄存器(通常是EBXESIEDI等)到调用前的状态。
      子程序通常只保存它将要使用的那些需要被保存的寄存器。这就像你去查字典,你只需要记住你正在看的是哪一页(返回地址),并且如果你用了字典旁的便签纸,用完后要把它恢复原样(被调用者保存的寄存器)。

3. 返回方式:恢复完整状态 vs. 恢复指令流
  • 中断返回(如 IRET:这是一个“重量级”的指令。它不仅仅从栈中弹出返回地址(像RET那样),还会弹出程序状态字(PSW)。恢复PSW至关重要,因为它可能重新允许中断,并将CPU模式从内核态切换回用户态。

  • 子程序返回(如 RET:这是一个“轻量级”的指令。它通常只从栈中弹出返回地址,并跳转到那里继续执行。它不涉及权限级别的变更。

一个形象的比喻

  • 中断:你(CPU)在办公室写报告(运行用户程序)。突然,你的老板冲进来(硬件中断),要求你立刻处理一份紧急文件。你不得不:

    1. 在报告上做个精确的标记,记录下写到哪里了(保存PC)。

    2. 把报告、参考资料、草稿纸的当前状态全部整理好(保存所有寄存器)。

    3. 去处理老板的任务(执行中断处理程序)。

    4. 处理完后,回到座位,按照之前记录的状态,把所有东西恢复原样,然后从标记的地方继续写报告(IRET)。

  • 子程序调用:你写报告时,需要计算一个复杂的数据。你:

    1. 在报告上做个简单的标记(CALL指令自动压入返回地址)。

    2. 走到计算器旁(跳转到子程序),开始计算。你可能会用掉几张草稿纸(使用寄存器),但用完后你会把借来的东西放回原处(恢复被调用者保存的寄存器)。

    3. 计算完毕,你回到书桌前,从标记的地方继续写(RET)。

结论

总结来说,中断处理程序是为了响应不可预测的外部事件,需要保存和恢复一个“完整的、未知的”执行环境,其行为更像一个“劫持”过程;而子程序是程序内部可预测的流程控制,它在一个“已知的、有约定的”框架内协作,只负责保存和恢复约定的那部分上下文。

中断处理程序一定会保存PSW,而子程序调用通常不需要也不应该由编译器生成的代码来保存它。


详细解释

1. 什么是程序状态字(PSW)?

PSW是一个特殊的CPU寄存器,它包含了当前执行环境的全局状态信息。其具体内容因架构而异,但通常包括:

  • 条件码/标志位

    • 进位标志(C):算术运算后的进位或借位。

    • 零标志(Z):结果是否为零。

    • 溢出标志(V):结果是否发生了溢出。

    • 符号标志(N):结果的符号是正还是负。

  • 中断使能位:表示CPU是否允许响应外部硬件中断。

  • CPU工作模式位:表示当前是运行在内核态(特权级) 还是用户态

  • 其他架构相关的系统状态位。

2. 为什么中断处理必须保存PSW?
  1. 中断是异步的,会破坏状态:中断可能发生在任何两条指令之间。被中断的程序可能刚刚执行完一条比较指令(CMP),其后续的分支指令(如 JEJNE)正依赖于PSW中的条件码(Z标志)来决定是否跳转。如果中断处理程序修改了PSW,当程序返回时,分支判断就会出错,导致灾难性后果。

  2. 权限级别变更:大多数情况下,中断会导致CPU从用户态切换到内核态。PSW中记录了当前的权限级别。为了在中断返回时能正确切换回用户态,必须将中断发生时的PSW(包含用户态信息)保存起来。

  3. 中断控制:PSW中包含中断允许位。在进入关键的中断处理时,CPU可能会自动禁用中断,以防止被更高优先级的中断嵌套打扰。在返回时,必须恢复之前的中断状态(可能是“允许”),否则系统可能再也无法响应中断。

因此,保存和恢复PSW是保证被中断程序能够“无缝衔接”、继续正确运行的生命线。

3. 为什么子程序调用不保存PSW?
  1. 状态是同步且预期的:子程序调用是程序流程的一部分。编译器清楚地知道在 CALL 指令前后,PSW中的条件码是如何被设置和使用的。

    • 调用前:调用者知道哪些指令会影响PSW,并根据需要自己管理这些状态。

    • 调用后:子程序可以自由地使用PSW。例如,它内部的 ADDCMP 等指令会覆盖之前的状态,这是完全正常和预期的行为。

    • 返回后:调用者不会期望PSW在调用前后保持不变。它会根据后续逻辑,通过新的指令来设置所需的PSW状态。

  2. 性能开销:保存和恢复PSW需要额外的指令。对于频繁调用的子程序(如一个小的循环内的函数),这会带来巨大的性能损失,而收益为零。

  3. 无权限变更:普通的子程序调用通常不发生CPU特权级的切换,因此不需要处理权限状态的保存。


总结与对比表

特性中断处理程序子程序调用
对PSW的假设被中断程序的状态是未知且必须保留的PSW状态是已知、可变、可覆盖的
是否保存PSW一定保存。这是中断机制硬件/软件流程的一部分。不保存。由编译器生成的代码不会主动保存它。
保存位置通常由CPU硬件自动压入内核栈,或由软件首先保存。不适用。
恢复方式通过专用的 IRET 指令从栈中弹出并恢复。不适用。
类比接电话前,必须记录下自己所有的思绪和注意力状态(PSW),以便回来后能立刻接上。去查字典时,你不需要记录自己刚才在想什么,查完回来重新集中注意力即可。

结论: 您问题中提到的那个“中断处理一定会保存而子程序调用不需要保存”的特定寄存器,就是程序状态字(PSW)。这是区分这两者上下文保存范围的最关键标志。

http://www.dtcms.com/a/512089.html

相关文章:

  • 做牛津布面料在哪个网站找客户八大员继续教育入口
  • SD-WAN是什么?与MPLS,MSTP,IPSEC,SSL 有什么区别?
  • 【操作系统】408操作系统核心考点精讲:宏内核、微内核与外核架构全解析​
  • EXCEL文本数字如何批量转换为数字
  • Linux 文件权限深度解析:从原理到实战管理
  • SpringMVC 数据校验和BindingResult以及自定义校验注解
  • [明道云专栏·里程碑] 从第一篇到第一百篇:这是一场属于“低代码实战者”的长跑
  • Ubuntu 安装 Harbor
  • 网站屏蔽ip地址河南网站备案系统短信
  • 中科院网站做的好的院所双鸭山网站建设公司
  • Linux配置Samba文件共享并访问Windows文件
  • Cursor配置markdown转Word的MCP工具教程
  • 常见springboot相关注解
  • ◆comfyUI教程◆第2章13节 XL模型专用工作流与refiner精炼
  • PostIn V1.3.1版本发布,新增在线更新程序命令,新增请求体json支持引用变量
  • asp网站作业下载二级建造师报名时间2022年官网
  • 信息平台网站建设微信商城网站方案
  • OpenCV计算机视觉库
  • 区块链的效率引擎:梅克尔树原理解析与应用
  • TF-A CMake构建系统
  • PowerShell下载和安装图解(附安装包,适合新手)
  • 分析网易严选网站开发wordpress类别图标
  • 元服务上架自检
  • 8款企业微信SCRM工具功能对比分析
  • 个人网站建设小江网站建设做网站需要多少钱
  • 蚂蚁集团开源的万亿参数模型Ling-1T和Ring-1T-preview
  • 南宁希噢网站开发工作室wordpress打造官网
  • 区块链的基石:深入解析哈希指针与链表数据结构
  • Windows 系统下使用 Docker 安装 Milvus 向量数据库
  • 【TDengine TSDB】使用DBeaver客户端访问