Linux的IRQ中断子系统分析

简介:

本文以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”

该部分初始化过程中,系统根据设备使用的中断控制器的类型,实现irq_chip结构中的接口,并把该irq_chip实例注册到irq_desc.irq_data.chip字段中,这样各个irq和中断控制器就进行了关联,只要知道irq编号,即可得到对应到irq_desc结构,进而可以通过chip指针访问中断控制器。 其初始化流程如下图所示:

三、中断流控层

由linux内核提供,所谓中断流控是指合理并正确地处理连续发生的中断,比如一个中断在处理中,同一个中断再次到达时如何处理,何时应该屏蔽中断,何时打开中断,何时回应中断控制器等一系列的操作。该层实现了与体系和硬件无关的中断流控处理操作,它针对不同的中断电气类型(level,edge......),实现了对应的标准中断流控处理函数,在这些处理函数中,最终会把中断控制权传递到驱动程序注册中断时传入的处理函数或者是中断线程中。

目前的通用中断子系统实现了以下这些标准流控回调函数,这些函数都定义在:”kernel/irq/chip.c”中,

handle_simple_irq 用于简易流控处理;

handle_level_irq 用于电平触发中断的流控处理;

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,

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)

用来关闭中断。

  • 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()”就是通过修改该数组以实现中断的注册。

五、中断驱动程序设计

有了前几层所做的贡献,使得我们进行linux中断驱动设计变得异常简单。一般情况下,我们只需要使用”request_irq”函数向内核注册相应的中断号及其中断服务程序,然后调用“enable_irq”“disable_irq”开开或关闭中断即可。其流程如下图所示:

六、中断服务程序设计

当CPU收到中断,就会执行相应中断服务程序,我们知道CPU在执行中断服务程序时是不能执行其他程序的,甚至此时CPU不能响应某些优先级比它低的中断,如果CPU一直长时间执行某个中断服务程序,势必影响系统的响应速度,降低了系统性能。为此Linux中断子系统将中断分为了中断上文和中断下文,中断上文用来执行一些紧迫的程序,中断下文用来执行一些不紧急的可延后执行的程序。Linux提供了三种机制来处理中断下文:Soft irq(软中断)、Tasklet、work_queue(工作队列)。

Ø 软中断

Ø Tasklet

Ø Work_queue




本文作者:佚名
来源:51CTO
目录
相关文章
|
9天前
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
|
10天前
|
算法 Linux 编译器
技术笔记:LINUX2.6.32下的进程分析
技术笔记:LINUX2.6.32下的进程分析
|
10天前
|
运维 监控 网络协议
Linux 下的性能监控与分析技巧
在Linux环境中,命令行工具助力服务器管理和故障排查。通过示例展示如何监控网络、TCP连接、CPU及内存使用。例如,用`netstat`结合`awk`查TOP 20高频率IP访问80端口,识别DDoS迹象;`netstat -nat`统计TCP状态;`ps -aux`排序列出CPU和内存消耗大的进程;`find`加`tar`查找并压缩`.conf`文件。掌握这些命令提升运维效率。
13 1
|
13天前
|
Linux 数据处理 开发者
深入解析Linux中的paste命令:数据处理与分析的得力助手
`paste`命令在Linux中是数据处理的利器,它按列拼接多个文件内容,支持自定义分隔符和从标准输入读取。例如,合并`file1.txt`和`file2.txt`,使用`paste file1.txt file2.txt`,默认以制表符分隔;若要使用逗号分隔,可运行`paste -d ',' file1.txt file2.txt`。当文件行数不同时,较短文件后会填充空白行。结合管道符与其他命令使用,如`cat file1.txt | paste -s`,可按行合并内容。注意文件大小可能影响性能。
|
14天前
|
Linux 编译器 测试技术
探索Linux中的objcopy命令:数据处理与分析的得力助手
`objcopy`是GNU工具集中的实用程序,用于复制和转换二进制目标文件,如ELF到S-record。它支持格式转换、内容提取和修改,如移除调试信息。命令参数包括指定输入/输出格式和复制特定段。示例用途有:`objcopy -O binary input.elf output.bin`(ELF转二进制)和`objcopy -j .text input.elf output.o`(复制.text段)。使用时注意文件格式、备份原始文件并查阅文档。对于处理和分析二进制数据,`objcopy`是不可或缺的工具。
|
14天前
|
移动开发 数据挖掘 Linux
探索Linux命令之nl:数据处理与分析的得力助手
`nl`命令是Linux下用于为文本文件添加行号的工具,支持自定义格式和空行处理。它可以显示行首或行尾的行号,并能处理逻辑页。常用参数包括`-b`(控制空行行号)、`-n`(设定行号位置和是否补零)、`-w`(设定行号宽度)。示例用法如`nl -b a -n rz -w 3 filename.txt`。在处理大文件时需谨慎,并注意备份原始文件。nl是数据分析时的实用工具。
|
3天前
|
监控 Unix Linux
Linux中AWK命令的高级应用与案例分析
Linux中AWK命令的高级应用与案例分析
|
5天前
|
监控 Unix Linux
Linux中AWK命令的高级应用与案例分析
Linux中AWK命令的高级应用与案例分析
|
9天前
|
数据管理 Linux 数据处理
探索Linux中的printf命令:数据处理与分析的利器
`printf`是Linux命令行中的文本格式化工具,类似C语言函数,用于数据处理和分析。它接受格式字符串和参数,格式化输出,支持字符串、整数、浮点数等类型。常用格式说明符有%s、%d、%f等。例如,`printf "Hello, %s!\n" "World"`会输出"Hello, World!"。配合字段宽度和对齐,可用于制作表格。在脚本中,printf常与循环和其它命令结合,实现复杂文本操作。
|
12天前
|
JSON Linux 数据处理
探索Linux中的pinky命令:数据处理与分析的得力助手
探索Linux的pinky命令,非标准工具,专用于文本数据处理和分析。提供直观界面,擅长日志、CSV处理。特点包括:易于使用、强筛选、灵活转换和自定义输出。示例:筛选`access.log`中IP为192.168.1.1的记录并转为CSV。注意文件格式、筛选条件、输出格式和性能优化,处理前备份数据。