大家好,我是大禾。每天进步一点点!
最近,想写下Linux内核子系统系列的文章,一是对自己认知进行汇总,二也是分享出来和大家交流。话不多说,开始今天正题。大家有没有想过当外部中断信号来临之后,信号是如何传递的,以至最终传给内核的中断c处理?下面是信号序列图,相信从感官上你能有个大体认知。
从中断管理来看,会发现它触及硬件、汇编、以及c整套逻辑,而具体实现起来代码相当复杂。所以我的学习方式是只要明白其底层逻辑,将来再根据实际情况阅读相应代码即可。况且各个芯片架构也有不同。
(一)外设中断信号
物理层:设备通过中断引脚(IRQ Line)或MSI(消息信号中断)发出电信号。传统PCI设备共享引脚,PCIe设备多用MSI。
- 拉高/拉低中断线(物理信号 / 传统INTx)
这是最传统的方式,设备通过改变一根专用物理引脚的电平来通知CPU。这种方式的关键在于电平触发和边沿触发两种模式。
- 发MSI消息(数据包 / 现代标准)
MSI(Message Signaled Interrupt)是一种更现代的方式,设备不再拉信号线,而是通过向一个特定的内存地址写入数据来“邮寄”一个中断请求。工作原理:系统在初始化时,会为支持MSI的设备分配一块“专属地址”(通常是中断控制器的地址)和一个“专属数据”(即中断向量号),并写入设备的配置空间。当设备需要触发中断时,它直接发起一次内存写事务(Memory Write TLP),向这个地址写入指定的数据。这个写操作本身,就是中断信号。