成功案例

免费咨询热线

400-888-8256

成功案例
您的位置:主页»成功案例»

本文主要的议题是作为一个普通的驱动工程师,在撰写本身认真的驱动的时候,如何向Linux Kernel中的间断子系统注册间断处理惩罚函数?为了领略注册间断的接口,必需相识一些间断线程化(threaded interrupt handler)的基本常识,这些在第二章描写。第三章主要描写了驱动申请 interrupt line接口API request_threaded_irq的规格。第四章是进入request_threaded_irq的实现细节,阐明整个代码的执行进程。

二、和间断相关的linux及时性阐明以及间断线程化的配景先容

1、非抢占式linux内核的及时性

在遥远的已往,linux2.4之前的内核是不支持抢占特性的,详细可以参考下图:

sxw

工作的开始源自高优先级任务(橘色block)由于要期待外部事件(譬喻网络数据)而进入睡眠,调治器调治了某个低优先级的任务(紫色block)执行。该低优先级任务欢喜的执行,直到触发了一次系统挪用(譬喻通过read()文件接口读取磁盘上的文件等)而进入了内核态。仍然是熟悉的配方,仍然是熟悉的味道,低优先级任务正在执行不会变革,只不外从user space切换到了kernel space。外部事件老是在你不想让它来的时候到来,T0时刻,高优先级任务期待的那其间断事件产生了。

间断固然产生了,但软件不必然立即响应,大概由于在内核态执行的某些操纵不但愿被外部事件打断而主动封锁了间断(或是封锁了CPU的间断,可能MASK了该IRQ number),这时候,间断信号没有立即获得响应,软件仍然在内核态执行低优先级任务系统挪用的代码。在T1时刻,内核态代码由于退出临界区而打开间断(留意:上图中的比例是不协调的,一般而言,linux kernel不会有那么长的关间断时间,上面主要是为了暗示清楚,同理,从间断触发到详细间断处事措施的执行也没有那么长,都是为了表述清楚),间断一旦打开,立即跳转到了异常向量地点,interrupt handler抢占了低优先级任务的执行,进入间断上下文(固然这时候的current task是低优先级任务,可是间断上下文和它没有任何关系)。

从CPU开始处理惩罚间断到详细间断处事措施被执行还需要一个分发的进程。这个期间系统要做的主要操纵包罗确定HW interrupt ID,确定IRQ Number,ack可能mask间断,挪用间断处事措施等。T0到T2之间的delay被称为间断延迟(Interrupt Latency),主要包罗两部门,一部门是HW造成的delay(硬件的间断系统识别外部的间断事件并signal到CPU),别的一部门是软件原因(内核代码中由于要掩护临界区而封锁间断引起的)。

该间断的处事措施执行完毕(在其执行进程中,T3时刻,会叫醒高优先级任务,让它从sleep状态进入runable状态),返回低优先级任务的系统挪用现场,这时候并不存在一个抢占点,低优先级任务要完成系统挪用之后,在返回用户空间的时候才呈现抢占点。漫长的期待之后,T4时刻,调治器调治高优先级任务执行。有一个术语叫做任务响应时间(Task Response Time)用来描写T3到T4之间的delay。

2、抢占式linux内核的及时性

2.6内核和2.4内核显著的差异是提供了一个CONFIG_PREEMPT的选项,打开该选项后,linux kernel就支持了内核代码的抢占(虽然不能在临界区),其行为如下:

pre

T0到T3的操纵都是和上一节的描写一样的,差异的处所是在T4。对付2.4内核,只有返回用户空间的时候才有抢占点呈现,可是对付抢占式内核而言,即即是从间断上下文返回内核空间的历程上下文,只要内核代码不在临界区内,就可以产生调治,让最高优先级的任务调治执行。

在非抢占式linux内核中,一个任务的内核态是不行以被其他历程抢占的。这里并不是说kernel space不行以被抢占,只是说历程通过系统挪用陷入到内核的时候,不行以被其他的历程抢占。实际上,间断上下文虽然可以抢占历程上下文(无论是内核态照旧用户态),更进一步,间断上下文是拥有登峰造极的权限,它甚至可以抢占其他的间断上下文。引入抢占式内核后,系统的平均任务响应时间会缩短,可是,及时性更存眷的是:无论在任何的负载环境下,任务响应时间是确定的。因此,更需要存眷的是worst-case的任务响应时间。这里有两个因素会影响worst case latency:

(1)为了同步,内核中总有些代码需要持有自旋锁资源,可能显式的挪用preempt_disable来克制抢占,这时候不答允抢占

(2)间断上下文(并非只是间断handler,还包罗softirq、timer、tasklet)老是可以抢占历程上下文

此文关键词:Linux,kernel,间断,子系统,驱动,申请