首页 理论教育中断处理框架简介-深入剖析Linux内核与设备驱动

中断处理框架简介-深入剖析Linux内核与设备驱动

【摘要】:1基本中断处理流程Linux内核的中断处理框架当然要满足之前提到的各种需求。对Linux内核来说,每个中断号都是通过irq_desc进行描述的,可以说irq_desc是中断处理的核心。通过这些抽象结构就可以实现整个中断处理的框架。2中断处理延时操作下面介绍系统如何解决中断中大数据量时的延时处理问题。图4-28是Linux内核中断处理流程。

1ᤫ基本中断处理流程

Linux内核的中断处理框架当然要满足之前提到的各种需求。对Linux内核来说,每个中断号都是通过irq_desc进行描述的,可以说irq_desc是中断处理的核心。下面来看看相应的内容:

978-7-111-49426-3-Chapter04-111.jpg

978-7-111-49426-3-Chapter04-112.jpg

每个irq_desc是对中断号的抽象描述;而irq_chip是对中断控制器的抽象描述;affinity则是对中断处理在哪些处理器上执行的抽象描述;还有对中断信号的处理方式则是通过han-dle_irq来进行描述;最后需要抽象出来的就是不同设备特别地处理了,这个工作就由action来完成。其他的都是表明相关操作的属性以及和中断在哪个执行实体上运行相关。通过这些抽象结构就可以实现整个中断处理的框架。当然随着Linux内核的演进,这些抽象数据结构的具体形式会有变化(如结构中注释所说),但是要满足中断处理的需求,框架中必然会有物理实体的抽象,这个是不会发生变化的。明白了这些抽象结构表示的物理实体,也就比较容易理解框架的执行过程和逻辑了,图4-27以ARM为例展示了中断处理代码的流程和抽象结构之间的关系。

中断处理的基本操作逻辑就是先获得正确的中断号,然后由相应中断信号处理方式han-dle_irq处理。handle_irq会根据需要,对中断控制器进行操作,以保证中断控制器仍然能够正确地上报中断,另外根据action中的操作完成设备申请的操作逻辑。

2ᤫ中断处理延时操作

下面介绍系统如何解决中断中大数据量时的延时处理问题。图4-28是Linux内核中断处理流程。

978-7-111-49426-3-Chapter04-113.jpg

图4-27 Linux内核中断处理代码流程和抽象结构的关系

978-7-111-49426-3-Chapter04-114.jpg

图4-28 Linux内核中断处理流程

从图4-28中可见,Linux内核中断处理分为两部分,分别为hardirq和softirq。hardirq部分决定中断控制器是否能继续上报中断的时间,可以理解为硬件的中断延时时间,中断处理系统将需要进行大量数据处理的工作放到了softirq中进行。这样将完整的中断处理分为两部分进行,既保证了硬件的最小时延又保证了数据的处理。softirq是Linux内核采用的比较老的机制,是对中断数据处理的一种延时操作,也可将其作为延时处理来考虑,相应的介绍有很多,这里就不进行说明了。中断的数据处理部分采用内核线程处理是一种很直接的方式,内核也提供了该方式相应接口request_threaded_irq。通过ps查看任务时,若见到如下信息([irq/中断号-名字]),就说明是中断处理线程。

978-7-111-49426-3-Chapter04-115.jpg

下面对request_threaded_irq接口进行一下介绍:

request_threaded_irq(unsigned in tirq,irq_handler_t handler,irq_handler_t thread_fn,un-signed long flags,const char * name,void * dev);

●irq———需要申请的中断号。

●handler———中断处理逻辑接口。该接口运行在中断上下文中,只是执行需要快速响应的操作,执行时间尽可能短小,耗时的工作留给线程处理接口。

●thread_fn———如果该参数不为NULL,内核会为该irq创建一个内核线程。当中断发生时,如果handler返回值是IRQ_WAKE_THREAD,内核将会激活中断线程,在中断线程中,thread_fn指向的接口函数将被调用。该接口函数运行在进程上下文中,允许进行阻塞操作。

●flags———控制中断行为的位标志,形式为IRQF_XXXX,例如:IRQF_TRIGGER_RIS-ING、IRQF_TRIGGER_LOW、IRQF_SHARED等。

●name———申请本中断服务的设备名称,同时也作为中断线程的名称。

●dev———作为handler和thread_fn的参数,通常设置为设备的管理实体。

3ᤫ内核提供的通用接口

为了方便开发,内核为访问中断处理框架中抽象的控制结构提供了一些接口函数:

●irq_set_chip(irq,∗chip)/irq_get_chip(irq)———每个中断号irq_chip的操作接口。

●irq_set_handler_data(irq,∗data)/irq_get_handler_data(irq)———每个中断号内中断处理逻辑的私有数据,保存handler所需要的特殊数据,例如中断控制器级联时,进行级联的中断号,用该字段保存下一级中断号的管理实体。

●irq_set_chip_data(irq,∗data)/irq_get_chip_data(irq)———每个中断号内操作中断控制器的私有数据,用于不同的中断控制器管理信息。

●irq_set_irq_type(irq,type)———用于设置中断的触发类型,可选的类型有IRQ_TYPE_EDGE_RISING、IRQ_TYPE_EDGE_FALLING、IRQ_TYPE_EDGE_BOTH、IRQ_TYPE_LEVEL_HIGH、IRQ_TYPE_LEVEL_LOW。

●irq_set_handler(irq,handle)———设置中断处理逻辑,参数handle的类型是irq_flow_handler_t。

●irq_set_chip_and_handler(irq,∗chip,handle)———同时设置中断处理逻辑和中断控制器属性。(www.chuimin.cn)

●irq_set_chained_handler(irq,∗chip,handle)———进行级联的中断号,设置级联的中断处理逻辑,其中会设置标志IRQ_NOREQUEST、IRQ_NOPROBE、IRQ_NOTHREAD。通常用于中断控制器的级联,设置上述三个标志位会使得父控制器的相应中断号不允许被驱动程序申请。

另外内核还提供了一些中断信号处理的方式:

●handle_level_irq。

●handle_edge_irq。

●handle_fasteoi_irq。

●handle_simple_irq。

●handle_percpu_irq。

●handle_edge_eoi_irq。

●handle_bad_irq。

为设备开发提供的中断请求的接口是request_irq和request_threaded_irq。

中断子系统还提供一些接口用于动态申请/扩展中断号(需要配置CONFIG_SPARSE_IRQ),分别如下:

●irq_alloc_desc(node)———申请一个irq,node是对应内存节点的编号。

●irq_alloc_desc_at(at,node)———在指定位置申请一个irq,如果指定位置已经被占用则失败。

●irq_alloc_desc_from(from,node)———从指定位置开始搜索,申请一个irq。

●irq_alloc_descs(irq,from,cnt,node)———申请多个连续的irq编号,从from位置开始搜索。

●irq_free_descs(irq,cnt)———释放irq资源。

这些只是申请函数,要想中断能够正常工作,还需要通过接口对必要的字段进行设置,如irq_set_chip_and_handler_name、irq_set_handler_data、irq_set_chip_data。

中断处理系统还提供了接口,可以方便其他模块查询当前所在的中断处理状态,利于模块做出正确的处理。其接口如下:

●in_irq()———判断当前是否在硬件中断上下文。

●in_softirq()———判断当前是否在软件中断上下文。

●in_interrupt()———判断当前是否进行中断处理,包括在硬件、软件、底半部中断上下文。

这些接口函数是实现具体处理器及设备中断处理的基础,为各种驱动和处理器提供了良好的操作框架。

4ᤫ电源管理相关接口

以上主要是中断处理框架的通用功能。在电源管理方面,中断还是有一定作用的。中断可以作为唤醒系统的信号,使得系统在进入待机时能够被唤醒,而这需要中断控制器的支持。为了实现该功能,系统在中断控制器的抽象实体irq_chip中进行了相关的设计。下面列出了irq_chip中的主要接口:

978-7-111-49426-3-Chapter04-116.jpg

978-7-111-49426-3-Chapter04-117.jpg

其中,irq_set_wake是和唤醒相关的功能,主要是打开或关闭相应中断唤醒系统的功能。

内核提供对某个中断进行电源管理唤醒功能的操作接口,接口为int set_irq_wake(un-signed int irq,unsigned int on);

可见内核中断处理框架提供了包括功能、性能和电源管理相关的完整系统方案。