ARM设备树interrupts属性三值含义及中断处理注册偏移问询
关于Cortex-A9 GIC中断控制器中
interrupts = <0x0 0x3 0x4>的含义及用户态中断响应的偏移说明 嘿伙计,咱们来拆解一下你设备树里这个中断配置的细节,还有用户态用signal.h/csignal处理中断时的关键点:
一、interrupts = <0x0 0x3 0x4>三个值的具体含义
你的中断控制器是arm,cortex-a9-gic(属于GICv2架构),它的#interrupt-cells = <3>指定了每个中断项需要用3个整数来描述,三个值的意义分别是:
第一个值:0x0(中断类型)
这个值用来区分两种核心中断类型:0x0代表共享外设中断(SPI):这类中断是所有CPU核都能响应的外设中断,比如你示例里的OCMC内存控制器中断就属于这类。- 如果是
0x1则代表私有外设中断(PPI):这类中断是每个CPU核独有的,比如核内定时器、看门狗的中断。
第二个值:0x3(中断编号,类型内偏移)
这个值是对应中断类型下的编号,要结合GIC的硬件规则来看:- 对于SPI(类型0x0):GICv2把前32个中断ID(0-31)留给了PPI和核间中断(SGI),所以SPI的硬件中断ID = 32 + 这个偏移值。示例里的0x3对应的硬件中断ID就是32+3=35,也就是OCMC控制器的实际硬件中断号。
- 对于PPI(类型0x1):这个值直接对应硬件中断ID 0-15,不需要加偏移。
第三个值:0x4(中断触发属性)
这个值是位掩码,用来指定中断的触发方式和极性,对应Linux内核的中断标志定义:0x4对应IRQF_TRIGGER_HIGH,表示这是一个高电平触发的电平敏感中断。
常见的其他取值还有:0x1:上升沿触发(IRQF_TRIGGER_RISING)0x2:下降沿触发(IRQF_TRIGGER_FALLING)0x8:低电平触发(IRQF_TRIGGER_LOW)
二、通过signal.h/csignal注册中断处理的偏移量说明
首先得明确一个关键前提:Linux用户态程序不能直接注册硬件中断的处理函数,硬件中断必须由内核态代码(比如内核模块)处理。不过如果你想让用户态程序响应中断事件,通常是内核处理完中断后,通过信号、管道或irqfd等方式通知用户态。
如果用signal.h里的实时信号(SIGRTMIN到SIGRTMAX)来传递中断事件,这里的"偏移量"是指硬件中断ID到实时信号编号的自定义映射:
- 实时信号的编号范围通常是
SIGRTMIN(一般是34)到SIGRTMAX(一般是64)。 - 你可以用「硬件中断ID - 32(SPI的起始偏移)」作为信号的偏移量,再加上
SIGRTMIN得到对应的信号编号。比如示例中的硬件中断ID是35,对应的信号就是SIGRTMIN + (35-32) = SIGRTMIN+3。
注意:
- 这种映射是需要你自己在内核模块中实现的——内核不会自动把中断映射为信号,你需要在中断处理函数里调用
send_sig()或send_sig_info()给目标进程发送对应的实时信号。 - 别用普通信号(比如
SIGINT)来传递中断事件,普通信号不支持排队,无法处理频繁触发的中断。
另外,如果你用irqfd机制(Linux 2.6.30以上支持),可以直接关联硬件中断ID(比如35),通过poll()监听事件,这种方式不需要信号偏移量,比信号更高效可靠。
内容的提问来源于stack exchange,提问作者Moritz
相关产品推荐
相关产品推荐

