1. 中断系统到底在解决什么问题
1.1 从一道408真题说起
24年408那道45题,考的就是I/O设备与主机之间信息传送的控制方式。很多同学看到“程序中断方式”几个字,脑子里第一反应是“CPU执行程序的时候被设备打断,然后去处理设备”,这个理解方向没错,但真到了做题和写代码层面,光知道这个远远不够。题目往往会深入到中断响应条件、中断隐指令、中断向量、中断屏蔽字这些细节,而这些细节全部依赖一个前置知识——中断系统本身是怎么运转的。
我当年复习这一块的时候,最大的感受是:教材上把中断系统拆成了好几个零散的知识点,中断请求、中断判优、中断响应、中断服务、中断返回,每个部分单独看都能看懂,但合在一起就串不起来。后来我逼着自己画了一张完整的时序图,把每个阶段CPU在干什么、设备在干什么、接口电路在干什么全部标出来,才算真正打通了。这篇文章我就按照这个思路,把中断系统从头到尾拆一遍,重点放在程序中断方式为什么需要中断系统、中断系统内部怎么协作、以及考试和实际中容易踩的坑。
1.2 程序中断方式在I/O控制方式中的位置
I/O设备与主机之间传送信息,一共有五种控制方式:程序查询方式、程序中断方式、DMA方式、通道方式、I/O处理机方式。程序中断方式是第二种,它的核心改进在于:CPU不再需要反复轮询设备状态,而是由设备在准备好之后主动“通知”CPU。这个“通知”的机制,就是中断。
你可以这样理解:程序查询方式像是你在厨房做饭,每隔几秒就跑去门口看看快递到了没有;程序中断方式像是你装了个门铃,快递员到了按门铃,你听到铃声再去开门。门铃系统就是中断系统,铃声就是中断请求信号,你放下锅铲去开门的过程就是中断响应和服务。
这个类比里有一个关键点容易被忽略:你听到门铃后,需要记住刚才炒菜炒到哪一步了,回来之后才能接着炒。CPU也一样,中断服务程序执行完之后要能准确回到原程序的断点继续执行,这就需要保存和恢复现场。很多同学做题时只关注“中断服务程序做了什么”,忽略了“现场保存和恢复”这个环节,结果遇到考中断隐指令的题目就懵了。
1.3 中断系统需要解决的核心矛盾
中断系统本质上要解决三个矛盾。第一个是实时性与开销的矛盾:设备希望CPU尽快响应,但CPU每次响应中断都要付出保存现场、跳转、恢复现场的开销,如果中断太频繁,CPU大部分时间都在做上下文切换,真正干活的时间反而少了。第二个是优先级与公平性的矛盾:多个设备同时请求中断时,CPU先响应谁?如果永远先响应高优先级设备,低优先级设备可能永远得不到服务。第三个是嵌套与简单性的矛盾:高优先级中断能否打断正在执行的低优先级中断服务程序?允许嵌套能提高实时性,但会让现场保存变得复杂。
这三个矛盾贯穿了整个中断系统的设计。理解了它们,你再看中断屏蔽字、中断优先级、中断嵌套这些概念,就不是死记硬背了,而是能推导出为什么这么设计。
2. 中断系统核心组件逐个拆解
2.1 中断请求触发器与中断屏蔽触发器
每个I/O接口电路中都有这两类触发器。中断请求触发器(INTR)的作用很简单:设备准备好数据或者完成一次传输后,把它置1,表示“我有事找CPU”。中断屏蔽触发器(MASK)的作用是:决定这个设备的中断请求能不能被送到CPU。
这里有一个容易混淆的点:中断请求触发器是设备自己置1的,CPU不能直接改它;中断屏蔽触发器是CPU通过程序来设置的,比如在中断服务程序里修改屏蔽字。考试中经常考“某设备的中断请求能否被响应”,判断依据就是:中断请求触发器为1,且中断屏蔽触发器为0,且CPU的中断允许触发器EINT为1,且该设备优先级高于当前正在服务的中断。
我见过很多同学把中断屏蔽触发器和中断允许触发器搞混。记住一个简单的区分:中断允许触发器EINT是CPU级别的总开关,相当于家里的总电闸;中断屏蔽触发器是设备级别的分开关,相当于每个房间的灯开关。总闸不拉,所有灯都不亮;总闸拉了,某个房间的开关关了,那个房间的灯不亮,但其他房间不受影响。
2.2 中断判优电路:谁先谁后
多个设备同时发出中断请求时,需要一个判优电路来决定先响应哪个。判优可以用硬件实现,也可以用软件实现。硬件判优常见的是链式排队电路,也叫菊花链。它的原理很简单:所有设备串在一条链上,优先级最高的设备离CPU最近。当多个设备同时请求时,信号沿着链依次传递,先到达的设备先截获信号,后面的设备就被挡住了。
链式排队电路的优点是结构简单、扩展方便,缺点是优先级固定,离CPU近的设备永远优先。如果某个低优先级设备频繁请求,高优先级设备反而不怎么请求,那低优先级设备还是得等。软件判优则是通过查询顺序来决定优先级,灵活但速度慢。
408考试中,硬件判优和软件判优的对比是一个常见考点。我个人的记忆方法是:硬件判优快但死板,软件判优慢但灵活。做题时如果题目强调“响应速度快”,选硬件;如果强调“优先级可动态调整”,选软件。
2.3 中断向量与中断向量表
中断向量是中断服务程序的入口地址。中断向量表是所有中断向量的集合,通常放在内存的固定区域。CPU响应中断后,需要根据中断类型号去中断向量表里查出对应的入口地址,然后跳转过去执行。
这里有一个关键细节:中断向量表里存放的到底是入口地址本身,还是入口地址的地址?不同教材和不同架构有不同的约定。在408考试中,通常约定中断向量表存放的是中断服务程序的入口地址。CPU拿到中断类型号后,用类型号乘以4(每个向量占4字节)得到偏移量,再加上中断向量表的基址,就找到了对应的表项,读出入口地址,送入PC。
我当年在这里踩过一个坑:把中断向量和中断向量地址搞混了。中断向量是入口地址,中断向量地址是存放这个入口地址的内存单元的地址。考试中如果问“中断向量地址”,你要回答的是表项的地址,不是入口地址本身。这个区别在选择题里经常出现,一不留神就选错。
2.4 中断隐指令:硬件自动完成的操作
中断隐指令不是一条真正的指令,而是CPU在响应中断时由硬件自动完成的一系列操作。它主要包括:关中断、保存断点、引出中断服务程序。关中断是为了防止在保存断点的过程中被新的中断打断;保存断点通常是把当前PC的值压入栈或者保存到特定寄存器;引出中断服务程序就是根据中断类型号去中断向量表查入口地址并送入PC。
很多同学不理解为什么叫“隐指令”。其实很简单:这些操作对程序员来说是透明的,你在程序里看不到对应的指令,但CPU确实执行了这些操作。就像你按了电梯按钮,电梯自动完成关门、启动、加速、减速、开门这一系列动作,你不需要手动控制每一步。
考试中经常考中断隐指令完成了哪些操作,选项里会混入“保存通用寄存器内容”“设置中断屏蔽字”这些干扰项。记住:保存通用寄存器和设置屏蔽字是中断服务程序自己要做的事,不是中断隐指令。中断隐指令只做三件事:关中断、保存断点、引出中断服务程序。
3. 中断处理全流程逐步还原
3.1 中断请求阶段:设备什么时候发出请求
设备在完成一次数据传送后,或者在准备好接收新数据时,会置位中断请求触发器。这个时机很关键:如果是输入设备,通常在数据已经放入数据缓冲寄存器后发出中断请求;如果是输出设备,通常在数据缓冲寄存器为空、可以接收新数据时发出中断请求。
这里有一个常见的误解:很多同学以为设备一启动就发中断请求。实际上设备需要一定的时间来完成工作,比如键盘需要等用户按键,磁盘需要等磁头定位到指定扇区。设备完成工作后才发中断请求,这个时间是不确定的,所以CPU不能靠轮询来等,必须用中断。
3.2 中断响应阶段:CPU什么时候可以响应
CPU响应中断需要满足几个条件:当前指令执行完毕、没有更紧急的任务(如DMA请求)、中断允许触发器EINT为1、有中断请求且未被屏蔽。注意“当前指令执行完毕”这个条件:CPU不会在一条指令执行到一半的时候响应中断,必须等这条指令做完。这是为了保证指令的原子性,否则程序状态会混乱。
但有一个例外:如果当前指令是关中断指令或者开中断指令,CPU会在执行完这条指令后才响应中断。这个细节在考试中偶尔会出现,属于拔高题。
CPU响应中断后,首先关中断,然后保存断点,然后根据中断类型号查中断向量表,最后跳转到中断服务程序。这一系列操作就是中断隐指令,全部由硬件自动完成,不需要软件干预。
3.3 中断服务阶段:服务程序做了什么
中断服务程序是软件层面的东西,它的结构通常是:保护现场、开中断、执行设备服务、关中断、恢复现场、开中断、中断返回。保护现场是把中断服务程序中要用到的寄存器内容保存到栈里;开中断是为了允许更高级的中断打断当前服务,实现中断嵌套;执行设备服务是真正干活的部分,比如从数据缓冲寄存器读数据;关中断是为了在恢复现场时不被干扰;恢复现场是把之前保存的寄存器内容还原;开中断和中断返回是最后一步,让CPU回到原程序继续执行。
这里有一个非常容易出错的点:保护现场和恢复现场的顺序。保护现场时,先保存的寄存器后恢复;恢复现场时,先恢复后保存的寄存器。这就像叠盘子,先放的盘子在最下面,最后才能拿出来。如果顺序搞反了,寄存器的值就乱了。
3.4 中断返回阶段:怎么回到原程序
中断返回通常是一条专门的指令,比如x86架构里的IRET指令。这条指令会从栈里弹出之前保存的断点地址送入PC,同时恢复标志寄存器的内容。执行完这条指令,CPU就回到了原程序的断点处继续执行。
这里有一个细节:中断返回时,CPU会自动开中断吗?不一定。有些架构的中断返回指令会自动恢复中断允许触发器的状态,有些则需要软件显式开中断。408考试中通常约定中断返回后CPU处于开中断状态,但具体要看题目描述。
4. 中断屏蔽字与中断嵌套的实操分析
4.1 中断屏蔽字怎么设置
中断屏蔽字是一个二进制串,每一位对应一个设备的中断屏蔽触发器。某位为1表示屏蔽该设备的中断请求,为0表示允许。在中断服务程序中,通过修改屏蔽字可以动态调整优先级。
举个例子:假设有四个设备A、B、C、D,优先级从高到低。当CPU正在处理设备C的中断时,如果希望A和B可以打断C,但D不能打断C,那么C的中断服务程序中应该把屏蔽字设置为:A对应位为0,B对应位为0,C对应位为1(屏蔽自己,防止同一设备重复中断),D对应位为1。这样A和B的中断请求可以送到CPU,D的被屏蔽。
这个设置过程在考试中经常以表格形式出现,要求你写出每个设备中断服务程序的屏蔽字。我的经验是:先画出优先级顺序,然后对每个设备,把优先级比它高的设备对应位设为0,比它低的和它自己的设为1。这个规律适用于大多数题目。
4.2 中断嵌套的实际执行过程
中断嵌套是指高优先级中断可以打断低优先级中断服务程序。实现嵌套的关键是在中断服务程序中适时开中断。如果整个服务程序都不开中断,那就不会发生嵌套,高优先级中断只能等低优先级服务程序执行完才能被响应。
嵌套的执行过程可以用一个栈来理解:每进入一层中断,就把当前的状态压栈;每退出一层中断,就弹栈恢复。嵌套层次越多,栈越深。如果嵌套层数过多,可能导致栈溢出,这是实际系统中需要注意的问题。
考试中经常考嵌套的执行顺序。比如设备A优先级高于B,B正在服务时A发出请求,CPU响应A,A服务完后回到B继续服务,B服务完后回到原程序。这个顺序要能准确画出。
4.3 中断屏蔽字与优先级的关系
中断屏蔽字和优先级是两个相关但不同的概念。优先级决定了多个中断同时请求时先响应谁;屏蔽字决定了某个中断请求能不能被送到CPU。优先级是硬件判优电路决定的,屏蔽字是软件设置的。
一个设备优先级高,不代表它不能被屏蔽。CPU可以通过设置屏蔽字来屏蔽任何设备的中断请求,包括高优先级设备。这在某些场景下很有用,比如在执行一段关键代码时,不希望被任何中断打扰,就可以把所有设备都屏蔽掉。
但要注意:屏蔽字只能屏蔽可屏蔽中断,不能屏蔽不可屏蔽中断。不可屏蔽中断通常用于紧急情况,比如电源故障,CPU必须立即响应。
5. 程序中断方式与其他I/O控制方式的对比
5.1 与程序查询方式的对比
程序查询方式是CPU主动轮询设备状态,程序中断方式是设备主动通知CPU。前者的CPU利用率低,因为CPU大部分时间都在等待和查询;后者的CPU利用率高,因为CPU可以在设备工作期间去做其他事情。
但程序中断方式也有开销:每次中断都要保存现场、恢复现场,如果设备频繁中断,CPU可能大部分时间都在做上下文切换。所以程序中断方式适合设备工作频率不高的场景,比如键盘、鼠标。对于高速设备如磁盘,通常用DMA方式。
5.2 与DMA方式的对比
DMA方式的核心是数据传送不经过CPU,由DMA控制器直接控制内存和I/O设备之间的数据传送。CPU只在传送开始前和结束后参与,传送过程中完全不干预。所以DMA方式的CPU开销比程序中断方式小得多。
但DMA方式也有缺点:DMA控制器需要占用总线,可能会和CPU争抢内存访问权。而且DMA方式只能传送数据,不能处理复杂的控制逻辑。程序中断方式虽然开销大,但灵活性强,可以处理各种复杂情况。
考试中经常考三者的对比,我整理了一个表格方便记忆:
| 对比维度 | 程序查询方式 | 程序中断方式 | DMA方式 |
|---|---|---|---|
| CPU参与程度 | 全程参与 | 传送前后参与 | 仅传送前后参与 |
| 数据传送路径 | 经过CPU | 经过CPU | 不经过CPU |
| CPU利用率 | 低 | 较高 | 高 |
| 响应速度 | 慢 | 较快 | 快 |
| 适用场景 | 简单低速设备 | 中低速设备 | 高速设备 |
| 中断次数 | 无 | 每次传送一次 | 每批传送一次 |
5.3 程序中断方式的适用场景
程序中断方式最适合那些工作频率不高、但需要CPU及时响应的设备。比如键盘:用户按键的时间间隔是不确定的,CPU不可能一直轮询,用中断方式最合适。再比如网络接口:数据包的到达时间不确定,用中断方式可以让CPU在没数据包的时候去做其他事情。
但如果是高速设备,比如固态硬盘,每秒可能产生几十万次中断,CPU根本来不及处理。这时候就需要DMA方式,让DMA控制器批量传送数据,减少中断次数。
6. 常见问题与排查技巧实录
6.1 中断响应条件判断总是出错
这是最常见的失分点。题目给出多个设备的中断请求状态、屏蔽字、CPU的中断允许触发器状态,问CPU会响应哪个中断。很多同学只看中断请求触发器,忽略了屏蔽字和EINT。
我的排查方法是按顺序检查四个条件:第一,EINT是否为1;第二,设备的中断请求触发器是否为1;第三,设备的屏蔽触发器是否为0;第四,该设备优先级是否高于当前正在服务的中断。四个条件全部满足才能响应。任何一个不满足,该设备的中断请求就不会被响应。
6.2 中断隐指令和中断服务程序的操作混淆
中断隐指令是硬件自动完成的,包括关中断、保存断点、引出中断服务程序。中断服务程序是软件完成的,包括保护现场、开中断、设备服务、关中断、恢复现场、开中断、中断返回。
考试中经常把这两者的操作混在一起出选项。我的记忆口诀是:隐指令做三件事——关、存、引;服务程序做七件事——保、开、服、关、恢、开、返。虽然口诀有点土,但考场上很管用。
6.3 中断屏蔽字设置错误
设置屏蔽字时,最容易犯的错误是把优先级顺序搞反。记住一个原则:屏蔽字中,优先级比当前设备高的位设为0(允许打断),优先级比当前设备低的位和当前设备自己的位设为1(禁止打断)。
还有一个细节:屏蔽自己的位一定要设为1,否则同一设备会反复中断,导致死循环。这个细节在考试中经常作为陷阱出现。
6.4 中断嵌套顺序画错
画中断嵌套顺序时,关键是记住“后进先出”。高优先级中断打断低优先级中断后,先执行高优先级的服务程序,执行完再回到低优先级继续执行。如果有多层嵌套,就按照栈的顺序依次返回。
我建议做题时画一个时间轴,横轴是时间,纵轴是中断层次。每进入一层中断就往上画一层,每退出一层就往下画一层。这样不容易出错。
6.5 中断向量和中断向量地址混淆
中断向量是中断服务程序的入口地址,中断向量地址是存放这个入口地址的内存单元的地址。题目问“中断向量”时,回答入口地址;问“中断向量地址”时,回答表项地址。
这个区别在选择题中经常出现,而且选项往往很接近。我的方法是:看到“向量”两个字,先想它是“内容”还是“位置”。向量本身是内容,向量地址是位置。内容放在位置里。
7. 从408真题看中断系统的考法
7.1 选择题的常见套路
408选择题中,中断系统相关的题目通常考以下几个点:中断响应条件的判断、中断隐指令的操作、中断屏蔽字的设置、中断嵌套的顺序、中断向量和中断向量地址的区别。这些点我在前面都详细拆解过了。
有一个套路值得注意:题目会给出一个场景,比如“CPU正在执行某设备的中断服务程序,此时另一设备发出中断请求”,然后问CPU会不会响应。这种题的关键是判断优先级和屏蔽字。如果新设备优先级高于当前设备且未被屏蔽,就会响应;否则不会。
7.2 综合题的考法
综合题中,中断系统通常和I/O控制方式结合在一起考。比如给出一个I/O系统,要求计算在程序中断方式下CPU用于I/O的时间占比,或者比较不同控制方式下的CPU效率。
这类题的关键是搞清楚每种控制方式下CPU的参与时间。程序查询方式下,CPU全程参与;程序中断方式下,CPU只在中断响应和服务时参与;DMA方式下,CPU只在传送前后参与。把每种方式的时间算清楚,再对比就能得出结论。
7.3 24年45题的详细拆解
24年那道45题考的是程序中断方式下CPU执行时间与I/O时间的比例关系。题目给出了设备传送一个数据的时间、CPU执行一次中断服务程序的时间、以及CPU的主频,要求计算CPU用于I/O的时间占比。
解题的关键是:先算出每次中断的开销时间,再算出设备两次中断之间的间隔时间,然后用开销时间除以总时间得到占比。这道题的难点在于中断服务程序中包含了保护现场和恢复现场的时间,很多同学漏算了这部分。
我当时的做法是:把中断服务程序的时间拆成固定开销(保护现场、恢复现场、中断返回)和可变开销(实际数据传送),然后分别计算。这样不容易漏项。
8. 复习中断系统的实操建议
8.1 画图比背书有效
中断系统的知识点很碎,光靠背书很容易记混。我的建议是画三张图:第一张是中断系统的硬件结构图,标出中断请求触发器、屏蔽触发器、判优电路、中断向量表的位置;第二张是中断处理的流程图,从设备发出请求到CPU返回原程序,每个步骤标清楚;第三张是中断嵌套的时序图,用时间轴表示多层中断的进入和退出。
这三张图画熟之后,大部分题目你都能在脑子里快速定位到对应的知识点。
8.2 做题时先判断题型
中断系统的题目大致分三类:概念辨析题、条件判断题、计算题。概念辨析题考的是你对基本概念的理解,比如中断隐指令和中断服务程序的区别;条件判断题考的是中断响应条件的判断;计算题考的是中断开销的计算。
拿到题目后先判断属于哪一类,然后调用对应的解题方法。概念辨析题靠记忆,条件判断题靠逻辑,计算题靠公式。分类之后,解题效率会高很多。
8.3 整理自己的错题本
中断系统的题目陷阱很多,而且很多陷阱是反复出现的。我建议专门整理一个错题本,把每次做错的题目和错误原因记下来。比如“忘记判断EINT”“屏蔽字设反了”“中断向量和向量地址搞混了”,这些都是高频错误。
整理错题本的时候,不要只抄题目和答案,要写清楚自己当时是怎么想的、为什么错了、正确的思路是什么。这样复习的时候才能针对性纠正。
8.4 结合实际系统理解
如果有条件,可以结合实际的系统来理解中断。比如在Linux系统下查看/proc/interrupts文件,可以看到每个中断号对应的设备、中断次数等信息。虽然408考试不考Linux,但实际观察中断的工作过程,能帮助你更直观地理解中断系统。
我在学习这一块的时候,曾经用一块简单的开发板做过实验:配置一个定时器中断,在中断服务程序里翻转一个LED灯。通过调整定时器的周期和中断服务程序的内容,我直观地看到了中断频率对CPU利用率的影响。这个实验让我对中断开销有了切身的体会,比看书印象深刻得多。
8.5 注意教材之间的差异
不同教材对中断系统的描述有一些差异。比如唐朔飞老师的教材和白中英老师的教材,在中断向量表的地址计算上可能有所不同。考试时以目标院校指定的教材为准,不要混用。
如果目标院校没有指定教材,那就以王道或者天勤的辅导书为准。这些辅导书通常会把不同教材的差异点标注出来,方便你对照复习。
9. 中断系统的扩展知识
9.1 多重中断与中断嵌套的区别
多重中断和中断嵌套经常被混用,但严格来说有区别。多重中断是指CPU在处理一个中断的过程中又响应了另一个中断;中断嵌套是指多重中断形成了层次结构,高优先级中断的服务程序嵌套在低优先级中断的服务程序内部。
简单说:多重中断强调“又响应了一个”,中断嵌套强调“形成了层次”。考试中如果问“是否支持多重中断”,回答“是”或“否”;如果问“嵌套了几层”,回答具体的层数。
9.2 中断与异常的对比
中断通常指来自CPU外部的异步事件,比如I/O设备请求;异常通常指来自CPU内部的同步事件,比如除零错误、缺页。两者在处理方法上有相似之处,都会保存断点、跳转到处理程序,但触发源和处理时机不同。
408考试中,中断和异常的对比也是一个考点。记住:中断是外部的、异步的;异常是内部的、同步的。中断可以在指令执行完毕后响应,异常通常在指令执行过程中检测到。
9.3 中断在实时系统中的应用
实时系统对中断响应时间有严格要求。比如工业控制系统,如果传感器发出中断请求后CPU不能及时响应,可能导致生产事故。所以实时系统通常会设置中断优先级、使用中断嵌套、优化中断服务程序来减少响应时间。
虽然408考试不深入考实时系统,但理解中断在实时系统中的应用,能帮助你更好地理解中断系统的设计目标。中断系统的很多设计决策,比如判优电路、屏蔽字、嵌套,都是为了在实时性和开销之间找到平衡。
10. 我踩过的坑和总结的经验
10.1 不要死记硬背屏蔽字
我一开始学中断屏蔽字的时候,试图把每种情况的屏蔽字都背下来,结果题目稍微变一下就不会了。后来我总结了一个规律:屏蔽字中,优先级比当前设备高的位设为0,其余位设为1。这个规律适用于所有情况,不需要死记硬背。
但要注意一个例外:如果题目明确说“不允许嵌套”,那么所有位都设为1,包括优先级更高的设备。这个例外在考试中出现过,要特别留意。
10.2 中断隐指令的“关中断”容易被忽略
中断隐指令的三个操作中,关中断是最容易被忽略的。很多同学只记得保存断点和引出中断服务程序,忘了关中断。关中断的目的是防止在保存断点的过程中被新的中断打断,导致断点信息不完整。
考试中如果问“中断隐指令完成了哪些操作”,一定要把关中断写上。这个细节虽然小,但经常作为得分点。
10.3 中断服务程序的“开中断”时机很关键
中断服务程序中,开中断的时机决定了是否支持中断嵌套。如果在保护现场之前开中断,那么新的中断可能会破坏现场;如果在保护现场之后开中断,就能保证现场的安全。所以标准的做法是:先保护现场,再开中断。
这个顺序在考试中经常考,而且容易记反。我的记忆方法是:先穿好盔甲再上战场,保护现场就是穿盔甲,开中断就是上战场。顺序不能反。
10.4 计算题要注意单位换算
中断开销的计算题中,时间单位经常是微秒、纳秒、毫秒混用,频率单位是赫兹、兆赫兹。计算时一定要统一单位,否则结果会差几个数量级。
我习惯把所有时间统一换算成纳秒,把所有频率统一换算成赫兹。这样计算的时候不容易出错。算完之后再根据题目要求换算回原来的单位。
10.5 多画图,少空想
中断系统的很多概念是动态的、有时序的,光靠脑子想很容易乱。我强烈建议多画图,把中断请求、响应、服务、返回的整个过程画出来,把每个时刻CPU在做什么、设备在做什么标清楚。画一遍比看十遍书都管用。
我当年复习的时候,把中断系统的流程图前前后后画了十几遍,到最后不用看书就能默画出来。这个过程虽然花时间,但效果非常好,考试时遇到中断相关的题目,脑子里自动就能浮现出那张图。
10.6 注意区分不同教材的术语
不同教材对同一个概念可能用不同的术语。比如“中断隐指令”在有些教材里叫“中断响应周期”,“中断向量表”在有些教材里叫“中断入口地址表”。复习时要以目标院校的指定教材为准,遇到不熟悉的术语先查清楚对应关系。
如果目标院校没有指定教材,那就以王道辅导书为准。王道辅导书对术语的处理比较规范,而且会标注不同教材的差异。
10.7 做题时先看问题再看题干
中断系统的题目题干通常很长,信息量很大。如果先看题干再看问题,很容易被无关信息干扰。我的做法是先看问题,明确题目问的是什么,然后带着问题去题干里找相关信息。这样效率高,而且不容易漏掉关键条件。
比如题目问“CPU会响应哪个中断”,我就带着这个问题去题干里找EINT状态、中断请求状态、屏蔽字、优先级信息。找到这些信息后,按顺序判断就能得出结论。
10.8 定期回顾,防止遗忘
中断系统的知识点很多,而且容易忘。我建议每隔一周就回顾一次,把之前画过的图重新画一遍,把错题本重新看一遍。回顾的时候不要只看,要动手写、动手画,这样才能真正记住。
我当年复习的时候,把中断系统的知识点做成了闪卡,正面写问题,背面写答案。每天花十分钟过一遍闪卡,效果很好。闪卡的好处是可以利用碎片时间,而且强迫你主动回忆,比被动看书效果好得多。
10.9 不要忽视基础概念
很多同学复习中断系统的时候,直接跳到中断嵌套、屏蔽字这些复杂内容,忽略了基础概念。结果做题时发现,复杂题目做不出来,往往是因为基础概念不扎实。
我的建议是先把基础概念搞清楚:什么是中断、什么是中断源、什么是中断请求、什么是中断响应、什么是中断服务、什么是中断返回。这些概念看起来简单,但真正理解透不容易。基础打牢了,后面的复杂内容才能学得顺。
10.10 结合实际场景理解抽象概念
中断系统的很多概念比较抽象,比如中断隐指令、中断向量表。如果单纯死记硬背,很容易忘。我的方法是结合实际场景来理解。
比如中断隐指令,你可以想象成你正在看书,突然电话响了。你下意识地做了三件事:把书签夹在书里(保存断点)、把手机调成静音(关中断)、走到电话旁边接听(引出中断服务程序)。这三件事你不需要思考就做了,就像CPU的硬件自动完成中断隐指令一样。
再比如中断向量表,你可以想象成一本电话簿。每个联系人有名字(中断类型号)和电话号码(中断服务程序入口地址)。你要打电话给某人,先查电话簿找到号码,然后拨号。CPU响应中断时,也是先查中断向量表找到入口地址,然后跳转。
这种结合实际场景的理解方式,能让抽象概念变得具体,记忆也更牢固。