Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

中断系统

复习

  • 中央处理器:CPU 由运算器、寄存器和控制器构成,循环取指译码执行
  • 计算机总线:总线让 CPU、存储器与外设共享一组通信线路
  • 输入输出系统:I/O 接口连接外设,支持查询、中断和 DMA

TL;DR

  • 中断让 CPU 暂停当前程序,先处理突然到来的事件
  • 离开前要保存现场,处理后再恢复
  • 中断向量帮助 CPU 找到对应的处理程序

正文

  你正读到一本好书的精彩处,门铃突然响了。去开门并不难,真正重要的是:回来以后,你还能准确找到刚才读到的那一行。

  CPU 处理中断,也是同样的道理。

离开之前先做书签

  设备发出中断请求后,CPU 通常先把手头这条指令执行完,再依次做这些事:

  1. 保存下一条指令地址和必要的状态
  2. 根据中断编号找到对应处理程序
  3. 执行处理程序,例如读取键盘送来的字符
  4. 恢复刚才保存的状态
  5. 从原程序的下一条指令继续

  被保存的 PC、状态寄存器以及必要的通用寄存器,合起来叫作现场(context)。它就像你夹在书里的那枚书签。

  为什么要保存这么多?因为如果现场保存不完整,回来后程序就可能拿着被中断处理改过的数据继续算——它会以为一切照旧,实际却早已面目全非。

该跳到哪里

  键盘、时钟和硬盘需要不同的处理办法。机器用一张中断向量表,把中断编号映射到对应的处理程序入口。收到编号后查表,再把入口地址写入 PC。

  你会发现,这和普通跳转并没有根本区别,只是目标地址不再由指令直接给出,而是由事件和向量表共同决定。同一个跳转机制,换了一种“决定去哪儿”的方式。

同时有人敲门

  多个中断可能同时到来,因此需要优先级:更紧急的请求先处理,较低优先级的暂时等待。

  有些系统还允许高优先级中断打断正在执行的低优先级处理程序,这叫作中断嵌套。但它是有代价的——每多嵌套一层,就要多保存一层现场。能打断别人固然灵活,但每一层都要记得自己从哪儿来。

  时钟本身也能定期产生中断,让系统周期性地重新获得控制权。后面讲操作系统时,我们会看到它如何借此在多个程序之间轮流安排时间。

  现在,最后一块拼图已经放好。下一章,我们把一段程序装进内存,看整台机器第一次从头跑到尾。

思考题 1

  如果中断处理程序修改了寄存器 R1,却没有在返回前恢复它,原程序可能出现什么问题?

思考题 2

  中断处理程序为什么通常要保存“现场”,而不是简单地把 PC 改回来就完事?

小结

知识点

  • 中断处理包含保存现场、处理与恢复
  • 中断向量表给出处理程序入口
  • 优先级解决多个请求的先后

参考资料

  1. Wikipedia(zh):中断:处理器响应外部事件的方式
  2. Wikipedia(zh):中断向量表:把中断编号映射到处理程序入口

思考题答案(仅供参考)

思考题 1

  原程序会以为 R1 仍保存着中断前的值,实际读到的却是中断处理留下的新值。后续计算可能出错,而且这个错误看起来像凭空发生。这正是现场必须按约定保存和恢复的原因。

思考题 2

  因为程序继续运行,不仅依赖 PC,还依赖寄存器里保存的中间数据。只恢复 PC,等于只找回了书签的位置,却发现书页被人偷偷改过——读起来还是错的。所以现场要把“走到哪”和“手里正拿着什么”一起保住。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪