深入了解Linux中的irq desc机制 (linux irq desc)

Linux操作系统的使用越来越广泛,因为它具有优秀的稳定性、安全性和开放性,而且在嵌入式系统、服务器等领域也有广泛的应用。在Linux中,中断是相当重要的成分之一,以便在保证系统响应速度和效率的同时,能够处理外设的数据和信号。IRQ(Interrupt Request,中断请求)是一种方式,可以通过向CPU发送请求,并暂停主处理器,进行一些临时的时间敏感操作,如输入输出和其他设备操作。IRQ描述符机制是Linux中处理中断请求的重要机制之一。让我们来深入了解一下Linux中的irq desc机制吧。

1. 简介

irq desc指的是中断事件的描述符(描述符是用于管理资源的抽象基本单元)。在Linux内核中,用一个专门的机制来处理中断,降低系统性能消耗的同时保证了中断的准确性和高效性。内核把硬件中断源映射到一个软中断之后,再由软中断处理程序进行进一步处理。这个过程中有一些数据结构主要有irq_desc、irq_chip和irq_domn,其中irq_desc是中断描述符。

2. 中断处理的优化

Linux内核为了满足高性能和低延迟的需求,对中断和中断处理进行了优化。主要包括两个方面:

(1)中断共享

当多个设备同时发送中断请求时,内核可以选择使用共享的方式,只需要把所有的中断源映射到一个软中断即可。这样不仅可以减少中断向量的占用,还可以减少CPU时间的浪费,从而提高系统的效率。

(2)中断波动处理

中断可能会因为某些不可预知的原因而出现波动。这时候,如果每一个中断事件都去唤醒CPU的话,那么处理器的效率就会被大大降低。为了防止这种情况发生,Linux内核采用一种称为中断波动处理的机制,可以在一定周期内进行检查,该周期叫做IRQ Stormreshold。

3. 中断描述符机制

在Linux内核中,中断和中断处理是通过中断描述符进行管理和调度的。当硬件产生中断信号的时候,中断系统将生成一个中断描述符,其中包含了中断控制器在处理特定中断时的所有相关信息。Linux中断描述符结构体(irq_desc)如下:

“`

struct irq_desc {

struct irq_common_data irq_common_data;

struct irq_data irq_data;

#ifdef CONFIG_GENERIC_IRQ_PROBE

struct device_node *of_node;

#endif

struct irq_chip *chip;

struct irq_desc *parent_irq;

struct module *owner;

const char *action_name;

#ifdef CONFIG_PROC_FS

struct proc_dir_entry *dir;

#endif

unsigned int yield_flags;

};

“`

其中,irq_common_data为公共中断信息,irq_data为通用中断处理程序所需的硬件描述,chip为处理硬件的架构依赖代码的指针,owner表示中断描述符所属的模块,action_name为中断名称,yield_flags表示是否已经被唤醒过。

4. 中断和处理程序的注册

当一个中断事件发生时,它将发出一个中断请求,并映射到中断描述符上。中断处理程序可以在系统内核中注册,它的任务是在中断事件发生时尽快被调用,以处理该事件。在内核中可以使用request_irq()函数对中断进行注册,它的声明如下所示:

“`

int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,

const char *name, void *dev);

“`

其中,irq参数是中断编号,handler是中断处理函数,flags为一个中断标志位,name是中断描述符的名称,dev是一个指向实例的指针。

5. 中断处理函数的执行过程

当某个中断发生时,对应的硬件将向处理器发送信号,处理器会暂停正在执行的工作,并跳转到与该中断相应的中断处理程序。中断处理程序执行并完成特定的操作之后,将恢复主处理器的执行。中断处理函数内包含的操作应该是尽可能简短、绝不进行复杂计算或大量I/O操作的程序。在执行中断处理程序时,它可以从IRQ_DESC状态中判断该中断是否已经被处理过,以便消除重复执行。

6.

irq desc机制是Linux中处理中断请求的重要机制之一,它可以保证系统的性能和稳定性。中断处理函数的执行过程伴随着中断描述符的注册以及一些其他的优化策略,如中断共享和中断波动处理。在系统设计和开发中,有必要深入了解其中的机制和原理,以便为系统的性能和效率提供更好的保障。

相关问题拓展阅读:

Linux如何及时响应外部中断

FPGA每隔100us给运行linux的ARM一个中断,要求在20us内响应中断,并读走2023*16bit的数据。

目前主要的问题是,当系统同时发生多个中断时,会严重影响linux对FPGA中断的响应时间。如何解决?

1、首先想到了ARM的FIQ,它可以打断IRQ中断服务程序,保证对外部FIQ的及时响应。但是发现linux只实现了IRQ,没有显示FIQ。

linux是从devicetree读取中断号,加入中断向量表的。

interrupts = ;中的之一个字段0表示非共享中断,非零表示共享中断,SDK产生的dts统一为0,此时第二字段的值比XPS中的小32;如果之一字段非零,则第二字段比XPS小16.

最后字段表示中断的触发方式。

IRQ_TYPE_EDGE_RISING =0x,

IRQ_TYPE_EDGE_FALLING =0x,

IRQ_TYPE_LEVEL_HIGH =0x,

IRQ_TYPE_LEVEL_LOW =0x,

很明显,devicetree根本没有提供通知linux有FIQ的渠道。

2、再来看linux的IRQ

linux的中断分为上半部清伏和下半部,上半部运行在IRQ模式,会屏蔽所有中断,下半部运行在SVC模式,会重新打开中断。

也就是说,当一个中断的上半部正在运行时(不能再次响应中断),FPGA的中断是不能被linux响应的;

反过来,当FPGA中断的上半部正在运行时(不能再次响应中断),其他的中断也不能被linux响应;

unsigned long flags;

local_irq_save(flags);

….

local_irq_restore(flags);

3.

ARM有七种模式,我们这里只讨论SVC、IRQ和FIQ模式。

我们可以假设ARM核心有两根中断引脚(实际上是看不见的),一根叫 irq pin, 一根叫fiq pin.

在ARM的cpsr中,有一个I位和一个F位,分别用来禁止IRQ和FIQ的。

先不说中断控制器,只说ARM核心。正常情况下,ARM核都只是机械地随着pc的指示去做事情,当CPSR中的I和F位为1的时候,IRQ和FIQ全部处于禁止状态。无论你在irq

pin和fiq pin上面发什么样的中断信号,ARM是不会理你的,你根本不能打断他,因为他耳聋了,眼也瞎了。

在I位和F位为0的时候,当irq

pin上有中断信号过来的时候,就会打断arm的当前工作,并且切换到IRQ模式下,并且跳到相应的异常向量表(vector)位置去执行代码。这个过程是自动的,但是返回到被中断打断的地方就得您亲自动手了。当你跳到异常向量表,处于IRQ的模式的时候,这个时候如果irq

pin上面又来中断信号了,这个时候ARM不会理你的,irq

pin就跟秘书一样,ARM核心就像老板,老板本来在做事,结果来了一个客户,秘书打断它,让客户进去了。而轿樱这个时候再来一个客户,要么秘书不断去敲门问,要么客户走人。老板之一个客户没有会见完,是不会理你的。

但是有一种情况例外,当ARM处在IRQ模式,这个时候fiq pin来了一个中断信号,fiq

pin是什么?是快速中断呀,比如是公安局的来查刑事案件,那才不管你老板是不是在会见闭正丛客户,直接打断,进入到fiq模式下,并且跳到相应的fiq的异常向量表处去执行代码。那如果当ARM处理FIQ模式,fiq

pin又来中断信号,又就是又一批公安来了,那没戏,都是执法人员,你打不断我。那如果这个时候irq

pin来了呢?来了也不理呀,正在办案,还敢来妨碍公务。

所以得出一个结论: IRQ模式只能被FIQ模式打断,FIQ模式下谁也打不断。

在打不断的情况下,irq pin 或 fiq pin随便你怎么发中断信号,都是白发。

所以除了fiq能打断irq以外,根本没有所谓中断嵌套的情况。

Linux不用FIQ,只用到了IRQ。但是我们有时候一个中断需要处理很长时间,那我们就需要占用IRQ模式那么长的时间吗?没有,linux在IRQ模式下只是简单的记录是什么中断,马上就切换回了SVC模式,换句话说,Linux的中断处理都是在SVC模式下处理的。

只不过SVC模式下的ISR上半部关闭了当前中断线,下半部才重新打开

请教linux irq 中断能使用mutex互斥锁吗

从 Backtrace 来看,应该是 i2c_transfer 中调用 mutex_lock 导致 schedule 调用而产生 进程调度,导致死机. 而哗运在中断上下文,这种情况乱好梁是绝对不允许发生的.换句袜洞话说是不允许

睡眠的,不允许进程调度. 

你可以 把 mutex_lock 注释掉再试试 .

关于linux irq desc的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 深入了解Linux中的irq desc机制 (linux irq desc)