输入“/”快速插入内容

一起读《奔跑吧Linux内核(第2版)卷2:调试与案例分析》- 中断管理

2024年4月6日修改
学习完前面的并发与同步后,我们再一起来简单学习了解下内核中的中断!
一、什么是中断?为什么要有中断
在Linux内核中,中断是一种硬件机制,用于在处理器与设备之间传递异步事件的信号。
当设备完成某个操作、出现错误或需要处理某个事件时,会发送一个中断信号给处理器,处理器会立即中断当前正在执行的程序,转而执行与中断相关的处理程序。
中断的存在主要是为了提高系统的响应性和效率。
没有中断的话,处理器需要不断地轮询设备的状态,这样会消耗大量的处理器时间,并且会导致系统资源的浪费。而中断机制可以让处理器在有需要处理的事件时立即响应,从而减少了轮询的开销,提高了系统的效率和响应速度。
当然凡事都不是绝对的,轮询机制也不完全比中断机制差。
在网络吞吐量大的情况下,网卡驱动采用轮询机制比中断机制效率要高。
二、在ARM架构下,中断是如何管理的?
在ARM架构下,中断管理主要涉及以下几个方面:
一)中断控制器(Interrupt Controller):
ARM处理器通常集成了中断控制器,用于接收并管理来自外部设备的中断信号。
在ARM体系结构中,常见的中断控制器包括GIC(Generic Interrupt Controller)和VIC(Vectored Interrupt Controller),它们负责中断的优先级处理、中断调度等。
Linux内核支持众多的处理器架构,从系统角度看,Linux内核的中断管理可以分成如下四层:
硬件层:如CPU和中断控制器的连接。
处理器架构管理层:如CPU中断异常处理。
中断控制器管理层:如IRQ号的映射。
Linux内核通用中断处理器层:如中断注册和中断处理。
不同的架构对中断控制器有不同的设计理念,这里只针对讲ARM Vexpress V2P-CAIS-CA7版本,它支持GIC Version2。
二)中断向量表(Interrupt Vector Table):
ARM处理器在中断发生时会根据中断类型查找对应的中断处理程序的入口地址,这些入口地址被保存在中断向量表中。中断向量表中存储了一系列中断向量(interrupt vector),每个中断向量指向对应中断处理程序的入口地址。
这里需要注意的是,中断处理程序的入口地址指的是处理特定中断事件时,系统将跳转执行的代码段的地址,即异常向量表。
当系统发生中断事件时,硬件会将控制权交给操作系统中断处理程序的入口地址,然后操作系统会根据该中断的类型去执行相应的中断处理程序。
这个入口地址一般会存储在异常向量表中,当中断事件发生时,CPU会根据中断向量号找到相应的异常描述符,从而确定中断处理程序的入口地址。
异常向量表:异常向量表是从0x0地址开始,一共32个字节,包含8个表项,其中有1个保留不用,其他7个表项对应7种异常发生后的跳转位置,这7种异常发生后分别对应到5种异常模式。每个表项里面放的一般都是一条跳转指令,用来跳转到真正的异常处理程序入口,通过B指令,或者LDR PC,[PC, #?] 的方式都可以实现此类跳转。
三)中断处理程序(Interrupt Service Routine,ISR):
中断处理程序是在中断响应时执行的代码块,用于处理具体的中断事件。