ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

408计算机组成原理:程序中断方式与中断系统深度解析

408计算机组成原理:程序中断方式与中断系统深度解析 1. 从一道408真题说起为什么中断系统是绕不过去的坎如果你正在啃计算机组成原理的I/O章节大概率会有这样一种体验程序查询方式看懂了DMA方式也勉强能理解但一到程序中断方式就卡住了。尤其是当教材开始讲中断响应、中断隐指令、中断向量、多重中断这些概念时很多人直接选择跳过——反正考试不一定考那么细。但现实是408统考对中断系统的考查从来不含糊。以24年45题为例题目把中断处理流程和指令执行周期揉在一起考如果你对中断的完整链路没有清晰认知那道题基本就是送分给别人。更关键的是中断系统不只是考试重点它是理解现代计算机为什么能同时处理多件事的核心钥匙。你后面学操作系统里的进程调度、设备管理底层全靠中断机制撑着。这篇文章就是要把程序中断方式的前置知识——中断系统从头到尾讲透。我会按照一个从业者复习408的视角来组织内容先搞清楚中断到底解决什么问题再拆解中断系统的硬件组成然后深入中断响应和处理流程最后把多重中断和中断屏蔽这些容易混淆的点掰开揉碎。每一部分我都会补充教材上不会明说、但做题和实际理解时特别关键的细节。不管你是刚开始复习408还是已经刷过一轮题但中断部分还是一团浆糊这篇内容都值得你花时间看完。我会尽量用生活化的类比来解释抽象概念同时保证专业术语的准确性让你在做题时能直接对应上。2. 中断到底解决了什么问题从程序查询的死等说起2.1 程序查询方式的致命缺陷要理解中断的价值得先看看没有中断的世界有多痛苦。程序查询方式的工作逻辑很简单CPU不断读取设备状态寄存器检查设备是否准备好。如果没准备好就继续读准备好了就传送一个数据然后继续循环。这种方式的效率低到什么程度假设CPU主频是1GHz一个设备准备一个字节需要1毫秒那么CPU在这1毫秒内可以执行上百万条指令但全部浪费在读状态-判断-跳转这个循环里。CPU的时间几乎全花在等待上真正干活的时间微乎其微。更糟糕的是如果有多个设备需要服务程序查询方式只能一个一个来。CPU先查设备A再查设备B再查设备C……如果设备A一直没准备好后面的设备全部被堵住。这就好比你去银行办业务只有一个窗口前面的人材料没带齐一直在翻包后面所有人干等着。这里有个容易忽略的点程序查询方式下CPU和外设是串行工作的。CPU主动去问设备设备没有发言权。这种模式在早期计算机中还能凑合因为外设种类少、速度慢CPU等等也无所谓。但随着外设越来越多、速度差异越来越大这种死等模式就成了性能瓶颈。2.2 中断的核心思想变我去问你为你来告诉我中断方式的本质改变在于主动权转移。CPU不再主动轮询设备状态而是设备在准备好之后主动向CPU发送一个信号——这就是中断请求。CPU收到请求后暂停当前正在执行的程序转去执行一段专门处理该设备的代码中断服务程序处理完再回到原来的程序继续执行。这个转变的意义有多大打个比方程序查询方式就像你每隔五分钟给快递员打电话问我的包裹到了吗打了一百个电话可能包裹还没到。中断方式则是快递员到了直接按你家门铃你听到门铃再去开门。前者你什么别的事都干不了后者你可以安心做自己的事门铃响了再去处理。从CPU利用率的角度看中断方式让CPU在设备准备数据的时间里可以继续执行其他程序。设备准备1毫秒CPU就执行1毫秒的其他指令等设备发出中断请求后再花少量时间处理数据传送。CPU的有效工作时间从接近0提升到了接近100%。2.3 中断方式与DMA方式的边界很多人学到后面会混淆中断和DMA觉得两者都是设备主动通知CPU有什么区别这里先简单划清界限后面讲中断处理流程时你会更清楚。中断方式下每次数据传送都需要CPU介入。设备准备好一个数据比如一个字节发中断请求CPU执行中断服务程序把数据读走。传送一个数据块比如1KB就需要1000次中断CPU要进出中断1000次。DMA方式则是在数据块级别上工作的DMA控制器直接在主存和设备之间传送整个数据块全部传完之后才发一次中断通知CPU。传送1KB数据CPU只需要处理1次中断。所以中断方式适合低速、少量数据的设备键盘、鼠标DMA方式适合高速、大批量的设备磁盘、网卡。这个区分在408选择题里经常考记住中断是字节级DMA是块级就不会错。3. 中断系统的硬件拼图谁在发请求谁在管优先级3.1 中断源与中断请求触发器中断源就是能够发出中断请求的设备和事件。常见的包括外部设备键盘、打印机、定时器、硬件故障电源掉电、校验错、软件中断系统调用等。每个中断源在硬件上对应一个中断请求触发器IR当设备需要CPU服务时硬件将该触发器置1表示我有请求。这个触发器通常位于接口电路中比如键盘接口里有一个中断请求触发器。CPU在每条指令执行结束时会统一采样所有中断请求触发器的状态判断是否有未处理的中断。注意这个采样时机很关键——不是随时采样而是在指令边界采样。这保证了CPU不会在执行一条指令的中途被打断避免指令执行到一半状态不一致的问题。实际考试中经常考中断响应发生在什么时候标准答案是每条指令执行结束后。但更精确地说是在当前指令执行完、下一条指令开始前。如果当前指令是长指令比如除法指令需要多个时钟周期中断要等这条指令完全执行完才能响应。3.2 中断判优多个设备同时请求怎么办现实中经常出现多个设备同时发出中断请求的情况。比如你一边敲键盘一边移动鼠标键盘和鼠标可能在同一时刻都发出了中断请求。CPU应该先处理谁这就需要中断判优机制。判优的核心依据是中断优先级。优先级高的设备先被服务优先级低的等待。优先级的设定通常遵循几个原则速度快的设备优先级高因为如果不及时处理数据可能丢失故障类中断优先级最高比如电源掉电必须立即处理实时性要求高的设备优先级高。硬件判优的实现方式主要有两种。一种是链式查询方式所有设备的中断请求线串成一条链靠近CPU的设备优先级高。当CPU发出中断响应信号时信号沿链逐个传递第一个有请求的设备截获信号后面的设备就收不到了。这种方式结构简单但优先级固定不够灵活。另一种是独立请求方式每个设备有独立的中断请求线CPU内部有一个中断优先级仲裁器。这种方式响应快、优先级灵活但需要的信号线多。实际系统中经常把两种方式结合使用比如在独立请求的基础上再用链式方式处理同一优先级内的多个设备。3.3 中断向量与中断向量表CPU响应中断后需要知道该跳转到哪里去执行中断服务程序。这个跳转地址就是中断向量。每个中断源对应一个中断向量所有中断向量集中存放在内存的固定区域形成中断向量表。在8086系统中中断向量表位于内存最低的1KB空间地址0x00000到0x003FF每个中断向量占4个字节2字节段地址2字节偏移地址所以最多支持256个中断源。CPU响应中断时根据中断类型号中断源编号计算出向量表索引从中取出对应的入口地址然后跳转执行。这里有个细节容易被忽略中断向量表的内容是在系统初始化时由操作系统填写的。也就是说中断服务程序的入口地址不是硬件固定的而是软件可以修改的。这为操作系统灵活管理中断提供了基础。比如Linux在启动时会重新设置中断向量表把BIOS设置的中断处理程序替换成自己的。中断向量和中断隐指令是两个容易混淆的概念。中断隐指令不是一条真正的指令而是CPU在响应中断时自动执行的一系列硬件操作包括关中断、保存断点、获取中断服务程序入口地址。这些操作由硬件直接完成不需要软件干预所以叫隐指令——看不见的指令。4. 中断响应到返回一条中断请求的完整生命周期4.1 中断请求的采样与响应条件CPU并不是收到中断请求就立即响应需要满足几个条件。首先当前指令必须执行完毕。其次中断没有被屏蔽后面讲中断屏蔽时会详细说。第三没有更高优先级的异常或中断正在处理中。CPU在每条指令的最后一个时钟周期采样中断请求信号。如果发现有未屏蔽的中断请求并且满足响应条件就进入中断响应周期。这个响应周期通常需要几个时钟周期用于完成关中断、保存断点、取中断向量等操作。考试中常考的一个点是中断响应周期结束后CPU开始执行中断服务程序。但此时CPU并没有保存通用寄存器的内容。通用寄存器的保存是由中断服务程序自己完成的通常用PUSH指令。这一点和子程序调用类似——硬件只保存返回地址断点其他现场由软件保存。4.2 中断隐指令的三步操作中断隐指令完成的操作可以概括为三步第一步是关中断。CPU自动将中断允许触发器IF清零禁止新的中断请求进入。这一步的目的是保护接下来的保存断点和取向量操作不被打断。如果此时允许新的中断进来可能会导致断点保存不完整或向量获取错误。第二步是保存断点。CPU将当前程序计数器PC的值压入堆栈或者保存到特定的寄存器中。断点就是被中断的程序的下一条指令地址。中断服务程序执行完后需要根据这个断点返回到原程序继续执行。第三步是获取中断服务程序入口地址。CPU根据中断类型号查询中断向量表取出中断服务程序的入口地址送入PC。这样下一条指令就会从中断服务程序开始执行。这三步全部由硬件自动完成速度极快通常只需要几个时钟周期。这也是为什么中断响应能做到即时——硬件操作比软件操作快几个数量级。4.3 中断服务程序的典型结构中断服务程序虽然由程序员编写但有固定的结构模板。一个典型的中断服务程序包含以下部分; 中断服务程序示例x86风格伪代码 ISR: PUSH AX ; 保存通用寄存器 PUSH BX PUSH CX PUSH DX ; ... 保存其他需要保护的寄存器 ; 具体的中断处理逻辑 ; 比如读取键盘扫描码、处理定时器事件等 ; 发送中断结束命令EOI给中断控制器 MOV AL, 20H OUT 20H, AL POP DX ; 恢复通用寄存器 POP CX POP BX POP AX IRET ; 中断返回这里有几个关键点。保存寄存器必须在处理逻辑之前恢复寄存器必须在IRET之前。EOI命令是发给中断控制器的告诉它当前中断已经处理完毕可以接受新的中断请求了。如果忘记发EOI同级或低级中断将永远无法被响应。IRET指令和RET指令不同。IRET除了弹出返回地址还会恢复标志寄存器的内容包括中断允许标志IF。这意味着中断服务程序执行IRET后CPU会自动重新允许中断如果中断前IF是1的话。实际写中断服务程序时最容易犯的错误就是忘记保存某个寄存器导致返回原程序后该寄存器的值被破坏。在408考试中通常会给出中断服务程序的代码让你分析问题重点看它保存了哪些寄存器、有没有发EOI、IRET用得对不对。4.4 中断返回与断点恢复中断返回是中断处理的最后一步。CPU执行IRET指令后从堆栈中弹出断点地址送入PC同时恢复标志寄存器。程序从被中断的地方继续执行就好像什么都没发生过一样。但这里有一个微妙的问题中断返回后CPU会立即响应新的中断吗答案是不一定。如果中断服务程序在IRET之前没有发EOI中断控制器可能仍然认为当前中断在处理中不会转发新的中断请求。另外如果中断服务程序执行了关中断操作但没有恢复IRET会恢复中断前的IF状态所以中断返回后中断是否开启取决于中断前的状态。这个细节在分析多重中断时特别重要。如果中断服务程序在开头关中断、结尾开中断那么中断返回后中断是开启的可以响应新的中断。如果中断服务程序全程关中断那么中断返回后中断仍然是关闭的需要等下一次开中断操作。5. 多重中断嵌套处理与屏蔽技术的实战拆解5.1 多重中断的产生条件多重中断是指一个中断服务程序正在执行时又有一个新的中断请求到来并被响应。这种情况在实际系统中非常常见。比如CPU正在处理键盘中断此时定时器中断到来了如果定时器优先级更高CPU应该暂停键盘中断处理转去处理定时器中断。多重中断的产生需要满足两个条件第一中断服务程序执行期间中断是开启的至少在处理完关键部分后开启第二新来的中断优先级高于当前正在处理的中断。如果中断服务程序全程关中断那么任何新的中断都无法被响应这就是单重中断。单重中断实现简单但实时性差——一个低速设备的中断处理可能阻塞高速设备的中断响应。5.2 中断屏蔽字的设计逻辑中断屏蔽字是实现多重中断控制的核心工具。每个中断源都有一个屏蔽位当屏蔽位为1时该中断被禁止为0时该中断被允许。CPU内部有一个中断屏蔽寄存器存放当前的中断屏蔽字。通过动态修改中断屏蔽字可以实现灵活的优先级控制。比如在处理A设备中断时把A的屏蔽位设为1禁止同级中断再次进入把比A优先级低的设备屏蔽位设为1禁止低级中断干扰把比A优先级高的设备屏蔽位设为0允许高级中断嵌套。这种机制比固定的硬件优先级更灵活。硬件优先级决定了谁先被响应屏蔽字决定了响应后谁能打断谁。两者配合才能实现完整的多重中断控制。408考试中经常给出一张中断屏蔽字表让你分析中断处理顺序。解题的关键是先看硬件优先级确定初始响应顺序再看屏蔽字确定嵌套关系。屏蔽字中为1的位对应的中断不能被响应为0的位对应的中断可以被响应。5.3 多重中断的嵌套过程实例假设有四个中断源A、B、C、D硬件优先级从高到低为ABCD。当前CPU正在执行用户程序此时B和C同时发出中断请求。第一回合CPU响应B优先级高于C。进入B的中断服务程序假设B的屏蔽字为1 1 1 1全屏蔽则B处理期间不响应任何新中断。B处理完后返回用户程序。第二回合CPU响应C。假设C的屏蔽字为0 1 1 1只屏蔽自己和低级则C处理期间A可以打断CB和D不能。如果此时A发出请求CPU暂停C转去处理A。A处理完后返回C继续执行。这个过程中C的中断服务程序被A打断形成了两层嵌套。堆栈中保存了用户程序的断点和C的断点IRET会逐层返回。如果C的屏蔽字是1 1 1 1则C处理期间A也无法打断这就是单重中断的效果。所以屏蔽字的设计直接决定了系统的中断嵌套能力。5.4 中断嵌套的堆栈管理多重中断的断点保存依赖于堆栈。每次中断响应时硬件自动将当前PC压栈每次IRET时从栈顶弹出PC。多层嵌套时堆栈中会依次保存用户程序断点、C程序断点、B程序断点等。堆栈的大小必须足够容纳最坏情况下的嵌套层数。如果堆栈溢出断点信息会被覆盖中断返回时就会跳转到错误的地址导致程序崩溃。这是实际系统设计中必须考虑的问题。在408考试中堆栈管理通常以分析题的形式出现给出中断发生顺序和屏蔽字让你画出堆栈中断点的变化过程。解题时注意每次中断响应压入一个断点每次IRET弹出一个断点后进先出。6. 那些教材不会明说但考试总考的细节6.1 中断与异常的区别408考纲中中断和异常是放在一起讲的但两者有本质区别。中断通常指来自CPU外部的事件如设备请求异常指CPU内部在执行指令时检测到的特殊情况如除零、缺页、溢出。从处理时机看中断在指令边界响应异常在指令执行过程中检测到。从返回行为看中断返回后执行下一条指令异常返回后可能重新执行当前指令如缺页异常或终止程序如除零异常。考试中经常把中断和异常混在一起出选择题关键区分点是中断是外部来的异常是内部产生的。中断请求信号来自CPU外部的中断控制器异常信号来自CPU内部的执行单元。6.2 中断响应时间的计算有些题目会让你计算从设备发出中断请求到CPU开始执行中断服务程序的时间。这个时间包括设备发出请求到CPU采样到请求的时间取决于采样周期、CPU完成当前指令的时间最坏情况是当前指令刚开始执行、中断响应周期的时间关中断、保存断点、取向量。如果当前指令是长指令如乘法指令需要几十个时钟周期中断响应时间会显著增加。这也是为什么实时系统中要避免在关键路径上使用长指令。6.3 中断向量与子程序调用的对比中断向量和子程序调用都涉及跳转和返回但机制不同。子程序调用由CALL指令发起返回地址由CALL指令压栈跳转地址由指令直接给出或通过寄存器间接给出。中断响应由硬件发起返回地址由硬件自动压栈跳转地址通过中断向量表获取。另一个区别是子程序调用是程序主动发起的中断响应是被动的。子程序调用可以嵌套任意层中断嵌套受屏蔽字控制。子程序调用不涉及标志寄存器的保存除非程序自己保存中断响应会自动保存和恢复标志寄存器。6.4 中断屏蔽与中断禁止的区别中断屏蔽和中断禁止经常被混用但严格来说有区别。中断禁止通常指CPU内部的中断允许触发器IF被清零所有可屏蔽中断都被禁止。中断屏蔽指通过中断屏蔽寄存器有选择地禁止某些中断源。关中断IF0是全局性的所有可屏蔽中断都进不来。屏蔽字是选择性的只屏蔽特定的中断源。在实际系统中两者配合使用中断响应时硬件自动关中断IF0中断服务程序通过设置屏蔽字来控制哪些中断可以嵌套。7. 复习中断系统的实操建议与常见误区7.1 画图比死记更有效中断系统的流程用文字描述很抽象但画成图就一目了然。我建议你手动画三张图第一张是中断系统的硬件组成图标出中断源、中断请求触发器、判优电路、中断控制器、CPU之间的信号流向。第二张是中断响应的流程图从指令执行结束到进入中断服务程序每一步标注硬件还是软件操作。第三张是多重中断的时序图用时间轴表示不同优先级中断的嵌套关系。这三张图画熟之后大部分选择题和简答题都能直接对应上。特别是中断隐指令的三步操作画图时用不同颜色标注考试时在草稿纸上快速画出来比在脑子里空想靠谱得多。7.2 用具体例子验证理解抽象概念最容易似懂非懂。检验自己是否真正理解中断系统最好的方法是举一个具体例子从头走一遍。比如键盘按下按键键盘接口发出中断请求IR置1CPU在执行完当前指令后采样到请求判断优先级后响应中断关中断、保存断点、查中断向量表跳转到键盘中断服务程序服务程序保存寄存器、读取扫描码、发EOI、恢复寄存器、IRET返回。如果你能把这个过程完整讲出来并且能解释每一步为什么这么做那中断系统的基本框架就掌握了。如果中间有卡壳的地方那就是需要重点复习的薄弱环节。7.3 常见误区清单第一个误区是把中断隐指令当成一条真正的指令。中断隐指令是硬件自动完成的操作序列不是指令集中的指令不占指令周期。第二个误区是认为中断响应后CPU自动保存所有寄存器。实际上硬件只保存PC断点通用寄存器的保存是中断服务程序的责任。第三个误区是混淆中断优先级和屏蔽字的作用。优先级决定谁先被响应屏蔽字决定响应后谁能打断谁。两者是不同层面的控制。第四个误区是忽略EOI命令。在可编程中断控制器如8259A中中断服务程序必须发送EOI命令否则中断控制器不会转发新的中断请求。这个细节在分析多重中断时经常成为关键。第五个误区是把中断返回和子程序返回混为一谈。IRET会恢复标志寄存器RET不会。IRET的返回地址来自堆栈硬件压入RET的返回地址来自堆栈CALL指令压入。7.4 从408真题反推复习重点翻看近十年的408真题中断系统的考查集中在几个方向中断响应时机的判断指令边界、中断隐指令的操作内容、中断屏蔽字与多重中断的分析、中断向量表的计算、中断与异常的区别。其中多重中断的分析题出现频率最高通常给出一张中断屏蔽字表和中断到达顺序让你写出CPU处理这些中断的完整过程。这类题目的解题套路很固定先按硬件优先级排序再按屏蔽字确定嵌套关系最后按时间顺序写出每个中断的响应和处理过程。建议你把近五年的相关真题都找出来做一遍做完后对照答案分析自己的思路哪里出了问题。是优先级判断错了还是屏蔽字理解反了还是忘了发EOI找到错误模式后针对性补强比盲目刷题效率高得多。7.5 实际系统中的中断优化思路虽然408考试不考实际系统的中断优化但了解这些能帮你更深刻地理解中断机制。现代操作系统为了减少中断开销采用了几种优化手段中断合并把多个中断请求合并成一次处理、中断亲和性把特定中断绑定到特定CPU核心、上半部/下半部拆分紧急操作在上半部完成耗时操作推迟到下半部。这些优化思路的底层逻辑都是同一个中断处理要尽可能快因为中断期间CPU不能执行其他任务。理解了这个核心矛盾你就能理解为什么中断服务程序要尽量短小、为什么要用DMA代替中断进行大批量数据传送、为什么要有中断屏蔽字来控制嵌套。复习408的时候偶尔跳出考试框架想一想这个机制在实际中是怎么用的往往能让抽象的概念变得具体记忆也更牢固。
返回列表