5.1 中断基本原理


5.1 中断基本原理

本节摘要:中断是外设打断处理器执行流程、请求服务的机制——本章主线的第一站先算清中断相对轮询的效率账,再把中断家族的成员关系捋顺,为逐站剖析处理流程备好地图。

本章支柱页交代了主线的起点:一次键盘中断的旅程。本站先回答两个地基问题:为什么非中断不可,中断家族里谁是谁。

突发事件打断了CPU

设键盘每秒产生一百次按键事件,比较两种接待方式。轮询方案:主循环里安排一段查询代码,每次查询读状态端口、判断有无按键,约二十个时钟;为不漏事件,每秒至少查询十万次(避免事件间隔期内只看一眼的概率性漏报,工程上取十倍余量)——单是"看一眼"就烧掉两百万个时钟,占一颗五兆赫兹 8086 近半的算力,而其中绝大多数查询的答案是"没事"。中断方案:CPU 平时全速跑正事,按键发生时硬件把执行流拽到服务程序,每次固定付出响应与返回的开销约百来个时钟,全年下来上万时钟,占比不足千分之零点五。

这笔账的结论不是"中断快",而是控制权的归属不同:轮询让处理器当门卫,人盯人;中断让处理器当法官,无事不出庭。事件越稀疏、正事越饱满,中断的收益越大。反过来,事件密集到一来就是连续流(如磁盘成块数据),中断的每次进出开销反成负担——那是第 6 章 DMA 的舞台。选择依事件密度而定,不依潮流而定。

中断家族的名册

中断远不止"外设举手"一种,8086 的中断源分两大支。外部中断由引脚进入:可屏蔽中断 INTR 受标志位 IF 管辖,IF 为零则请求被挡在门外——这正是关中断保护临界区的原理;非屏蔽中断 NMI 不受 IF 约束,电源故障、内存校验错这类"天塌了"的事件走它,处理程序必须以最短路径保命。内部中断由指令或异常产生:除法溢出、单步调试、溢出陷阱属于异常,程序出错时处理器自己举手;INT n 软件中断则是一条普通指令,主动调用系统服务——DOS 的功能调用正是搭了这趟车。

内部中断有三个共性值得记住:不执行总线申请周期、类型码由指令或事件直接给定、不受 IF 屏蔽。它们与外部中断共用同一张向量表、同一套响应流程——机制上的统一让软件服务与硬件事件在处理器眼里别无二致。

向量:中断的身份证

多个中断源共用一套处理机制,处理器怎么知道该跳去哪?8086 的答案是向量表:内存最低端的 1KB(00000H 到 003FFH)预留给 256 个向量,每个向量占四个字节——两字节偏移加两字节段址,正好拼出服务程序的完整入口。类型码乘以四就是该向量在表中的位置:类型码 21H 的服务程序入口存放在 00084H 起的四个字节里。

; 把服务程序入口装入向量表的示意 MOV AX, 0 MOV DS, AX ; 向量表位于段 0 MOV BX, 21H*4 ; 类型码 21H 的向量位置 MOV AX, OFFSET SERVICE MOV [BX], AX ; 低字:偏移 MOV AX, SEG SERVICE MOV [BX+2], AX ; 高字:段址

这套"类型码查表跳转"的设计让响应与识别一次完成:控制器送上类型码,处理器一步跳到入口,不需要逐个设备询问"是你举的手吗"。与之相对的轮询式识别要服务程序挨个查询申请者,响应慢而逻辑散——向量式识别的效率优势,正是 5.3 节 8259 存在的理由:它替所有外设统一管理申请并送上类型码。

案例展开。背景:教学项目要在裸机上实现"定时器每毫秒点亮一次指示灯",学生把服务程序写在了任意内存位置,指示灯却按不规则间隔闪烁。操作:检查向量表内容,发现 08H 号向量(定时器通道)仍指向出厂默认入口,学生的服务程序从未被调用;把入口地址按"偏移加段址"格式写入 00020H 起的四个字节后,闪烁立刻规律。结果:一次写入修复,同时暴露第二个问题——服务程序结尾没发中断结束命令,定时器第二次申请被 8259 拒绝,灯又停了;补上结束命令后彻底正常。解读:向量表是中断的通讯录,通讯录没登记,硬件就按默认地址找人;而结束命令是"办完请销号",漏了销号,下一案永不受理。变式:若改在带操作系统的环境下做,向量表由系统统一登记,用户程序应走系统提供的注册接口——机制没变,登记的责任人变了。

响应时间的解剖与最坏情况的执念

中断响应时间不是单一数字,而是三段之和。检测延迟:处理器只在指令边界看申请线,一条最长指令的执行时间就是上限的一部分——乘除与串操作这类长指令能拖几十拍;隐操作开销:关中断、压三个字、取向量、跳转,五微操作在几十拍量级;服务到达:跳到服务程序入口后还要保存现场,真正干活前的所有准备都算进响应。把三段加总,8086 系统的中断响应典型几十微秒,最坏情形还要叠加总线被占用与同级在服务的时间。

实时设计的铁律由此而来:任何中断延迟分析都必须按最坏情况做。平均响应漂亮没有意义——按键可以偶尔慢半拍,电机保护中断慢半拍就是事故。工程上的对策清单也很固定:把长指令拆出关键路径、给关键中断开专用的快速通道(现代处理器的快速中断模式)、服务程序控制在最短、必要时用 NMI 级别的不可屏蔽通道。这些对策在 5.2 与 5.4 都会正面遇到,此处先立起"按最坏算账"的价值观。

高频追问两则

问:软中断 INT n 和跳转指令有区别吗?既然都是跳去固定入口。 区别在机制而非去向:软中断同样走"压标志、压断点、查向量表"的完整流程,因此能在不同特权级之间完成受控的"降门拜访"——系统调用的安全通道正建在这上面。普通跳转没有这套手续,也就没有这层保护。

问:中断嵌套与子程序调用嵌套很像,区别在哪? 形似神不同。子程序调用是"计划内"的进出,次序由程序员写死;中断嵌套是"计划外"的插队,谁先谁后由优先级现场裁决,且每次插入都要完整保护被插者的现场。理解了这点,你就明白为什么中断栈的深度只能估算、必须留余量——它的深度是环境决定的,不是代码写死的。

本节要点回顾

  • 中断的账:事件稀疏时中断完胜轮询,事件成流时轮询或 DMA 更合适。
  • IF 是闸门,NMI 绕闸:可屏蔽与不可屏蔽的分界,就是临界区保护的原理。
  • 异常也是中断:出错与软调用共用同一套机制,处理器统一接待。
  • 向量表在段 0 的最低 1KB:类型码乘四定位入口,向量化识别一步到位。

旅程的站点铺好了,下一站逐拍走进响应与处理流程——看硬件在那几十个时钟里替你做了什么。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U