文章插图
它就是个中转站,里面有irq_chip指针 irq_domain指针,都是指向别的结构体 。
比较有意思的是irq、hwirq,irq是软件中断号,hwirq是硬件中断号 。比如上面我们举的例子,在GPIO中断B是软件中断号,可以找到irq_desc[B]这个数组项;GPIO里的第x号中断,这就是hwirq 。
谁来建立irq、hwirq之间的联系呢?由irq_domain来建立 。irq_domain会把本地的hwirq映射为全局的irq,什么意思?比如GPIO控制器里有第1号中断,UART模块里也有第1号中断,这两个“第1号中断”是不一样的,它们属于不同的“域”──irq_domain 。
4.irq_domain结构体irq_domain结构体在include/linux/irqdomain.h中定义,主要内容如下图:

文章插图
当我们后面从设备树讲起,如何在设备树中指定中断,设备树的中断如何被转换为irq时,irq_domain将会起到极大的作用 。
这里基于入门的解读简单讲讲,在设备树中你会看到这样的属性:
interrupt-parent = <&gpio1>;interrupts = <5 IRQ_TYPE_EDGE_RISING>;它表示要使用gpio1里的第5号中断,hwirq就是5 。但是我们在驱动中会使用request_irq(irq, handler)这样的函数来注册中断,irq是什么?它是软件中断号,它应该从“gpio1的第5号中断”转换得来 。
谁把hwirq转换为irq?由gpio1的相关数据结构,就是gpio1对应的irq_domain结构体 。
irq_domain结构体中有一个irq_domain_ops结构体,里面有各种操作函数,主要是:
① xlate
用来解析设备树的中断属性,提取出hwirq、type等信息 。
② map
把hwirq转换为irq 。
5.irq_chip结构体irq_chip结构体在include/linux/irq.h中定义,主要内容如下图:

文章插图
【分析Linux中断系统的重要数据结构】
这个结构体跟“chip”即芯片相关,里面各成员的作用在头文件中也列得很清楚,摘录部分如下:
* @irq_startup:start up the interrupt (defaults to ->enable if NULL)* @irq_shutdown:shut down the interrupt (defaults to ->disable if NULL)* @irq_enable:enable the interrupt (defaults to chip->unmask if NULL)* @irq_disable:disable the interrupt* @irq_ack:start of a new interrupt* @irq_mask:mask an interrupt source* @irq_mask_ack:ack and mask an interrupt source* @irq_unmask:unmask an interrupt source* @irq_eoi:end of interrupt我们在request_irq后,并不需要手工去使能中断,原因就是系统调用对应的irq_chip里的函数帮我们使能了中断 。我们提供的中断处理函数中,也不需要执行主芯片相关的清中断操作,也是系统帮我们调用irq_chip中的相关函数 。
但是对于外部设备相关的清中断操作,还是需要我们自己做的 。
就像上面图里的“外部设备1“、“外部设备n”,外设备千变万化,内核里可没有对应的清除中断操作 。
推荐阅读
- 为什么少女会长白头发 少女长白发的原因分析
- 调饮玩味普洱茶膏,普洱茶膏DNA分析
- 做自媒体如何写爆文?自媒体爆文分析,自媒体文章写作技巧
- 漏洞分析之thinkPHP反序列化:这就是黑客的世界吗
- 高桥银峰的作用有哪些,高桥银峰营养成分分析
- 渗透测试常用Linux命令总结
- 通过深度系统学习Linux用户和组
- Linux定位c++程序运行异常的经历《实操》
- 详解linux多线程——互斥锁、条件变量、读写锁、自旋锁、信号量
- Linux系统网络相关的常用命令集合
