所有WIKI > I字母 > 什么是中断处理程序?

什么是中断处理程序?

API分层

基于更广义的API外延,计算机中断是最底层的API接口,它通过汇编语言进行编程,实现硬件接口交互,是整个计算体系的基础。

  • 驱动程序接口
  • 操作系统接口
  • 局域网应用接口
  • 互联网应用接口

中断定义

(下面的内容来自wikipedia)

在计算机系统编程中,中断处理程序也称为中断服务例程或ISR ,是与特定中断条件相关的特殊代码块。中断处理程序由硬件中断、软件中断指令或软件异常启动,用于实现设备驱动程序或受保护操作模式之间的转换,例如系统调用。

中断处理程序的传统形式是硬件中断处理程序。硬件中断由电气条件或数字逻辑中实现的低级协议引起,通常通过硬编码的中断向量表进行分派,与正常执行流异步(在中断屏蔽级别允许的情况下),通常使用单独的堆栈,并且在中断处理程序执行期间自动进入不同的执行上下文(权限级别)。一般来说,硬件中断及其处理程序用于处理需要中断处理器正在执行的当前代码的高优先级条件。

后来发现软件可以方便地通过软件中断(同步中断的一种形式)来触发相同的机制。软件中断通常在操作系统级别以回调函数的形式实现,而不是在硬件级别使用硬编码的中断调度表。

中断处理程序具有多种功能,这些功能根据触发中断的原因以及中断处理程序完成其任务的速度而有所不同。例如,按下计算机键盘上的按键[1]或移动鼠标,会触发中断,该中断会调用读取按键或鼠标位置的中断处理程序,并将相关信息复制到计算机内存中。[2]

中断处理程序是事件处理程序的低级对应部分。然而,中断处理程序有一个不寻常的执行上下文,在时间和空间上有许多严格的限制,而且它们本质上的异步性质使得它们很难通过标准实践进行调试(可重现的测试用例通常不存在),因此需要专门的技能组——系统编程的重要子集——从事硬件中断层的软件工程师。
一个简单的用户操作行为案例示意图(来源:《图解系统》小林):
案例

中断标志

与其他事件处理程序不同,中断处理程序应将中断标志设置为适当的值,作为其核心功能的一部分。

即使在支持嵌套中断的 CPU 中,通常也会通过 CPU 硬件操作全局屏蔽所有中断来到达处理程序。在这种架构中,中断处理程序通常会保存所需的最少量的上下文,然后在第一时间重置全局中断禁用标志,以允许更高优先级的中断来中断当前处理程序。对于中断处理程序来说,通过某种方法消除当前中断源(通常在外设寄存器中切换某种标志位)也很重要,这样当前中断不会在处理程序退出时立即重复,从而导致无限循环。

在每种情况下,退出中断处理程序并使中断系统处于完全正确的状态有时可能是一项艰巨而艰巨的任务,并且其处理不当是许多严重错误的根源,这种错误会导致系统完全停止。这些错误有时是间歇性的,处理不当的边缘情况在连续运行数周或数月后不会发生。中断处理程序的正式验证非常困难,而测试通常只能识别最常见的故障模式,因此中断处理程序中微妙的间歇性错误通常会传递给最终客户。

执行上下文

在现代操作系统中,进入硬件中断处理程序的执行上下文是微妙的。

出于性能原因,处理程序通常会在正在运行的进程的内存和执行上下文中启动,与该进程没有特殊的连接(中断本质上是侵占运行上下文——进程时间计算通常会累积处理中断所花费的时间中断的进程)。然而,与被中断的进程不同,中断通常由硬编码的CPU机制提升到足够高的特权级别以直接访问硬件资源。

堆栈空间注意事项
在低级微控制器中,芯片可能缺乏保护模式并且没有内存管理单元(MMU)。在这些芯片中,中断处理程序的执行上下文本质上与被中断的程序相同,后者通常在固定大小的小堆栈上运行(传统上,低端的内存资源极其匮乏)。通常会提供嵌套中断,这会加剧堆栈的使用。在此编程工作中,中断处理程序的主要约束是在最坏情况下不超过可用堆栈,要求程序员全局推理每个已实现的中断处理程序和应用程序任务的堆栈空间要求。

当超出分配的堆栈空间(称为堆栈溢出的情况)时,此类芯片在硬件中通常无法检测到这种情况。如果堆栈超出了另一个可写内存区域,处理程序通常会按预期工作,但由于处理程序内存损坏的副作用,应用程序稍后会失败(有时要晚得多)。如果堆栈超出了不可写(或受保护)的内存区域,则故障通常会发生在处理程序本身内部(通常是以后调试更容易的情况)。

在可写的情况下,可以实现一个哨兵堆栈保护——一个位于合法堆栈末尾的固定值,其值可以被覆盖,但如果系统运行正常,则永远不会被覆盖。使用某种看门狗机制定期观察堆栈防护的损坏是很常见的。这将在接近违规操作的时间点捕获大多数堆栈溢出情况。

在多任务系统中,每个执行线程通常都有自己的堆栈。如果没有为中断提供特殊的系统堆栈,则中断将消耗任何被中断的执行线程的堆栈空间。这些设计通常包含 MMU,并且用户堆栈通常配置为使堆栈溢出被 MMU 捕获,作为系统错误(用于调试)或重新映射内存以扩展可用空间。这一级别的微控制器的内存资源通常受到的限制要少得多,因此可以以较大的安全裕度来分配堆栈。

在支持高线程数的系统中,最好由硬件中断机制将堆栈切换到特殊的系统堆栈,这样所有线程堆栈都不需要考虑最坏情况的嵌套中断使用。早在 1978 年的 8 位Motorola 6809等微型 CPU就已经提供了单独的系统和用户堆栈指针。

时间和并发的限制

由于多种原因,非常希望中断处理程序执行得尽可能简短,并且强烈不鼓励(或禁止)硬件中断调用可能阻塞的系统调用。在具有多个执行核心的系统中,可重入性的考虑也是至关重要的。如果系统提供硬件DMA,即使只有一个 CPU 内核也会出现并发问题。 (中层微控制器缺乏保护级别和 MMU,但仍然提供具有多个通道的 DMA 引擎的情况并不罕见;在这种情况下,许多中断通常由 DMA 引擎本身触发,相关的中断处理程序是希望谨慎行事。)

现代实践已发展为将硬件中断处理程序分为前半部分和后半部分。前半部分(或第一级)在运行进程的上下文中接收初始中断,执行最少的工作将硬件恢复到不太紧急的情况(例如清空已满的接收缓冲区),然后标记后半部分(或第二级)在不久的将来以适当的调度优先级执行;一旦被调用,后半部分就会在其自己的进程上下文中以较少的限制进行操作,并完成处理程序的逻辑操作(例如将新接收到的数据传送到操作系统数据队列)。

原文及参考资料

Interrupt handler
Inter-processor interrupt
一文讲透计算机的“中断”
CPU中断的硬件实现原理
小林:《图解系统》设备管理

常见问题

1.什么是硬件编程?

–分两种情况,一种是单片机或者嵌入式开发,一种是数字ic设计。 前者是基于有限硬件资源基础上的开发,它也是围绕某个核心和指令集,譬如arm核,所以,其程序仍然是顺序执行地,这与软件程序一致;后者则是开发硬件,而硬件电路本质是并行的,没有围绕的core,所以其程序执行时是并发的。
–汇编语言是最原始的硬件编程语言,C语言是现代广泛用于硬件编程的高级编程语言,C语言通过直接操作内存来进行硬件编程.

2.能用硬件编程做些有趣的事?

硬件编程是一种利用电子元件和软件代码来控制硬件设备的行为的技术。你可以用硬件编程做很多有趣的事情,比如:>硬件编程是一种利用电子元件和软件代码来控制硬件设备的行为的技术。你可以用硬件编程做很多有趣的事情,比如:

  • 制作一个智能家居系统,用传感器和继电器控制灯光、温度、音乐等
  • 制作一个机器人,用电机、舵机、摄像头等实现移动、避障、人脸识别等功能
  • 制作一个游戏机,用显示屏、按键、扬声器等实现贪吃蛇、俄罗斯方块等经典游戏
  • 制作一个音乐播放器,用SD卡、解码芯片、耳机等实现音乐的存储、播放、切换等功能。
  • 如果你想学习硬件编程,你可以选择一些开源的硬件平台,比如Arduino、树莓派、FPGA等。这些平台都有丰富的教程、例程、社区等资源,可以帮助你快速入门和进阶。

3.硬件编程和软件编程之间的关键区别?

一个不错的解答

4.硬件编程入门困难吗?

一位软件工程师的实践案例
硬件编程需要学习什么技术呢?