【技巧沙龙】AI开辟者拭魅战营-7分钟打造1个定制技能。7月22号,我们等你一路!
本文以Linux中断子体系架构为视角,旨在供给一个对Linux中断体系的全局熟悉,不涉及具体实现细节。
一、Linux中断子体系架构
在Linux中断子体系(generic irq)出现之前,内核应用__do_IRQ处理所有的中断,这意味着__do_IRQ中要处理各类类型的中断,这会导致软件的复杂性增长,层次不分明,并且代码的可重用性也不好。通用中断子体系的原型最初出现于ARM体系中,一开端内核的开辟者们把3种中断类型区搀扶来(电平中断、边沿中断、简略单纯中断),后来竽暌怪针对某些须要回应eoi(end of interrupt)的中断控制器,参加了fast eoi type,针对smp参加了per cpu type。把这些不合的中断类型抽象出来后,成为了中断子体系的流控层。要使所有的体系架构都可以重用这部分的代码,中断控制器也被进一步地封装起来,形成了中断子体系中的芯片级硬件封装层。
二、芯片级硬件封装层
中断体系与CPU硬件关系密切,linux体系为了兼容各类型号的CPU,供给了对于各类CPU的特点及个中断控制器的底层封装,如许就可以把底层的硬件实现尽可能地隐蔽起来,使得驱动法度榜样的开辟人员不消存眷底层的实现。该部分重要工作是:
- 实现不合CPU的中断人口,初始化中断向量表,该部分平日由汇编实现。
- 对中断控制器实现软件抽象(struct irq_chip),源码路径如:” arch/arm/plat-s3c24xx/irq.c”

三、中断流控层
由linux内核供给,所谓中断流控是指合理并精确地处理持续产生的中断,比如一个中断在处理中,同一个中断再次达到时若何处理,何时应当樊篱中断,何时打开中断,何时回应中断控制器等一系列的操作。该层实现了与体系和硬件无关的中断流控处理操作,它针对不合的中断电气类型(level,edge......),实现了对应的标准中断流控处理函数,在这些处理函数中,最终会把中断控制权传递到驱动法度榜样注册中断时传入的处理函数或者是中断线程中。
今朝的通用中断子体系实现了以下这些标准流控回调函数,这些函数都定义在:”kernel/irq/chip.c”中,
四、中断驱动接口层
handle_simple_irq 用于简略单纯流控处理;
handle_level_irq 用于电平触发中断的流控处理;
该部分初始化过程中,体系根据设备应用的中断控制器的类型,实现irq_chip构造中的接口,并把该irq_chip实例注册到irq_desc.irq_data.chip字段中,如许各个irq和中断控制器就进行了接洽关系,只要知道irq编号,即可获得对应到irq_desc构造,进而可以经由过程chip指针拜访中断控制器。 其初始化流程如下图所示:
handle_edge_irq 用于边沿触发中断的流控处理;
handle_fasteoi_irq 用于须要响应eoi的中断控制器;
handle_percpu_irq 用于只在单一cpu响应的中断;
handle_nested_irq 用于处理应用线程的嵌套中断;
以下这个序列图展示了全部通用中断子体系的中断响应过程,flow_handle一栏就是中断流控层的生命周期:
由linux内核供给,驱动法度榜样的开辟者平日只会应用到这一层供给的┞封些接口即可完成驱动法度榜样的开辟工作,其他的细节都由别的几个软件层较好地“隐蔽”起来了,驱动法度榜样开辟者无需再存眷底层的实现。该部分向驱动法度榜样供给的一系列的编程,用于向体系申请/释流放断,打开/封闭中断,设置中断类型和中断唤醒体系的特点等操作。常用的一些接口如:
- l request_irq(unsigned int irq, irq_handler_t handler,
【编辑推荐】
- Linux_基于Docker搭建Redis集群
- 若何修补和保护Linux内核客栈冲突马脚CVE-2017-1000364
- 游戏版Linux :Ubuntu GamePack
- Linux的EXT4 文件体系的汗青、特点以及最佳实践
- Linux的date敕令用法
unsigned long irqflags, const char *devname, void *dev_id)
用来向Linux申请中断。
irq是要申请的硬件中断号。
handler是向体系注册的中断处理函数。
irqflags是中断处理的属性,一般用来指定响应的中断流控。
devname设置中杜绫躯称,平日是在cat /proc/interrupts中可以看到此名称。
dev_id在中断共享时会用到,一般设置为这个设备的设备构造体或者NULL。
- enable_irq(unsigned int irq)
用来打开中断。
- disable_irq(unsigned int irq)
有了前几层所做的供献,使得我们进行linux中断驱动设计变得异常简单。一般情况下,我们只须要应用”request_irq”函数向内核注册响应的中断号及个中断办事法度榜样,然后调用“enable_irq”“disable_irq”开开或封闭中断即可。其流程如下图所示:
用来封闭中断。
- irq_set_chip(irq, *chip)
设置中断控制器
- irq_set_handler(irq,handle)
设置中断流控
中断子体系内部定义了几个重要的数据构造,这些数据构造的各个字段控制或影响着中断子体系和各个irq的行动和实现方法。例如:irq_desc,irq_chip,irq_data,irqaction,等等。个中 irq_desc[NR_IRQS]数组是linux内核顶用于保护IRQ资本的治理单位,它记录了某IRQ号对应的流控处理函数,中断控制器、中断办事法度榜样、IRQ自身的属性、资本等,是内核中断子体系的一个核心数组,中断驱动接口“request_irq()”就是经由过程修改该数组以实现中断的注册。
推荐阅读
受亚马逊、微软青睐 Bespin Global 获上亿A轮融资,君联资本领投
根据麦肯锡2016年宣布的IT as a Service(ITaaS)Cloud and Enterprise Cloud Infrastructure 市场查询拜访显示,将IaaS作为应用根本情况的企业用户将大年夜2015年的10%增长到2018年的51%。将来,企业传统IT将被云IT颠>>>详细阅读
本文标题:Linux的IRQ中断子系统分析
地址:http://www.17bianji.com/lsqh/36231.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示