Linux 内核学习(3) --- 内核中断机制

中断来源

根据中断的来源,中断可以分为外部中断内部中断,
内部中断的来源是 CPU 内部(软件中断指令,溢出,除法错误等), 例如操作系统从用户态切换到内核态, 需要借助于CPU的软件中断,
外部中断的中断源来自于外设,由外设提出请求。

根据中断是否可以被屏蔽分为可屏蔽中断不可屏蔽中断(NMI),可屏蔽中断可以通过屏蔽字进行屏蔽,屏蔽后该中断不再得到响应,不可屏蔽中断不能被屏蔽

根据中断入口的跳转方法不同,中断可以分为 向量中断非向量中断 ,采用向量中断的 CPU 通常为不同的中断
分配不同的中断号,当检测到某个中断号到来之后,自动跳转到该中断对应的地址去执行,不同的中断有不同的入口地址

非向量中断多个中断共享一个入口地址,进入该地址后,通过软件判断中断标志来识别具体是哪个中断
(类型于微机原理中提到的中断拓展的做法)

中断处理程序

当响应一个特定的中断的时候,内核会执行一个函数,该函数称为中断处理程序(interrupt handler)或者中断服务例程(interrupt service routine ISR)

Linux 内核中,中断处理函数也是普通的C函数, 只不过执行函数要按照特性的类型声明,以便于内核能够按照标准方式传递处理程序的信息,
区别在于:中断服务程序是被内核调用来相应中断的,它运行在中断上下文中,中断上下文也称为原子上下文,不可以被阻塞

中断随时可能发生,那么中断服务程序就有可能随时执行,所以必须保证中断服务程序的快速执行,
这样才能尽可能的恢复中断代码的执行,但是,中断处理程序往往还需要完成其他大量的工作,
比如网络设备的驱动程序:除了对硬件进行应答,还需要把来自硬件的网络数据包拷贝到内存等,因此需要在中断处理时间和 中断完成工作量之间有一个平衡

Linux 中断处理程序架构

下图描述了 Linux 的中断处理机制,为了在中断执行时间尽量短和中断处理需要完成的工作尽量大之间找到一个平衡点,
interrupt
顶半部(top half) 用于完成比较小的紧急功能,往往只是简单读取寄存器状态,并清除中断标志后进行 登记中断 的工作,
登记中断意味着将底半部处理程序挂到底半部的执行队列中去,这样,顶半部的执行速度回很快,可以服务
更多的中断请求

底半部(bottom half) 几乎做了中断处理程序所有的事情,而且可以被新的中断打断,这也是顶半部(top half)和底半部(bottom half)的最大不同,
因为顶半部往往设计成不可中断,底半部相对来说并不是非常紧急的,而且相对比较耗时,不在硬件中断服务
程序中执行

获取中断信息

Linux 中可以通过 cat /proc/interrupts 文件获取系统的中断统计信息,并统计处每个中断号上中断
在每个CPU上发生的次数,具体如下所示:
中断说明
读取到的内容从左到右,分别为:1、逻辑中断号,2、中断在各CPU发生的次数,3、中断所属设备类名称,4、硬件中断号,5、中断处理函数

ARM GIC

在 ARM 多核系统中最常用的中断控制器是 GIC(Generic Interrupt Controller),它支持三种类型的中断
ARM_GIC

SGI(software Generated Interrupt):
软件产生的中断,可以用于多核之间的通信,一个CPU 可以通过
GIC 的寄存器给另一个 CPU 产生中断,多核通信的 IPI_WAKEUP, IPI_TIMER … 都是由 SGI 产生

PPI(Priavte Peripheral Interrupt):
某个 CPU 私有外设的中断,这类中断只能交给绑定的CPU

SPI(Shared Peripheral Interrupt):
共享外设中断,这类外设的中断可以路由到任何一个CPU

(设置在哪个CPU上触发中断)
对于 SPI 类型的中断,内核可以通过下面的 API

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值