Linux kernel 多个中断处理程序如何共享地址0x00000018

Linux kernel 多个中断处理程序如何共享地址0x00000018,linux-kernel,arm,linux-device-driver,interrupt-handling,Linux Kernel,Arm,Linux Device Driver,Interrupt Handling,我正在阅读ARM中如何处理中断的内容,并了解到每当出现任何硬件中断时,都会执行地址为0x00000018的指令,这通常是到受尊重的中断处理程序的跳转,但对于不同的模块,可能会有许多中断处理程序 那么,这些不同的处理程序如何映射到地址0x00000018 另外,arm cpu如何知道中断提升是irq还是fiq,谁来决定它,哪个设备引发了中断,如何映射到此中断的受尊敬的处理程序 有谁能告诉我一个简单的中断处理程序代码,在这里我可以看到所有的中断处理程序都做了什么?ARM CPU通常有两个引脚(FIQ

我正在阅读ARM中如何处理中断的内容,并了解到每当出现任何硬件中断时,都会执行地址为0x00000018的指令,这通常是到受尊重的中断处理程序的跳转,但对于不同的模块,可能会有许多中断处理程序

那么,这些不同的处理程序如何映射到地址0x00000018

另外,arm cpu如何知道中断提升是irq还是fiq,谁来决定它,哪个设备引发了中断,如何映射到此中断的受尊敬的处理程序


有谁能告诉我一个简单的中断处理程序代码,在这里我可以看到所有的中断处理程序都做了什么?

ARM CPU通常有两个引脚(FIQ和IRQ),当设备想要生成中断时,它们会被断言。发生这种情况时,CPU只需切换模式并跳转到地址
0x00000018

然而,由于设备的数量通常超过中断引脚的数量,因此通常在CPU和设备之间有一个中断控制器。您可以将其视为将更多中断连接到CPU的集线器。中断控制器可以配置为对其接收的特定类型的中断断言FIQ

中断处理程序通常询问中断控制器哪个引脚导致了中断,然后调用相应的处理程序

这是我在一个小项目中使用的中断处理程序代码的精简版本,没有错误检查

#include <types.h>
#include <irq.h>

static void (*irq_handlers[32])(void);

void __attribute__((interrupt)) handle_irq() {
    int irq = irq_hw_get_and_ack();

    if (irq_handlers[irq]) {
        irq_handlers[irq]();
    }
}

void setup_irq() {
    irq_hw_init();
    cpu_enable_irq();
}

void irq_request(int irq, void (*func)(void)) {
    irq_handlers[irq] = func;
    irq_hw_enable(irq);
}

void irq_unrequest(int irq) {
    irq_hw_disable(irq);
    irq_handlers[irq] = NULL;
}
#包括
#包括
静态无效(*irq_处理程序[32])(无效);
void uuu属性uuu((中断))句柄irq(){
int irq=irq_hw_get_和_ack();
if(irq_处理器[irq]){
irq_处理器[irq]();
}
}
无效设置_irq(){
irq_hw_init();
cpu_enable_irq();
}
无效irq_请求(内部irq,无效(*func)(无效)){
irq_处理器[irq]=func;
irq_硬件_启用(irq);
}
无效irq_未请求(内部irq){
irq_hw_禁用(irq);
irq_处理器[irq]=NULL;
}

处理器通常只有一个中断。x86曾经是这样的一段时间,也许现在仍然是这样。Arm传统上有两个内核,但较新的内核现在有很多,如32、256等等

当您有一条共享中断线时,正如tangrs所提到的,您通常会在处理器之外,在arm的情况下,在芯片内部,但在arm内核本身之外。有许多中断输入和一次或几次中断进入处理器的输出的东西。当处理器中断发生时,您可以检查处理器/内核外部的逻辑/硬件,看看是谁导致了中断,然后就开始了

有嵌套的中断控制器也不是非典型的,例如一个8输入一输出。对于这8个输入中的一些或每个输入,另一个8:1中断控制器。然后,软件将需要简单地遵循这条路径。检查第一级中断控制器,看看是哪一个触发了中断,然后从那里你知道你需要与下一层控制器对话,依此类推,直到你隔离了单独的中断

还要知道并理解,对于这些共享中断系统,基本上从程序开始停止并调用中断向量,然后执行中断启动操作并最终读取中断状态寄存器开始,“同时”发生多个中断是很有可能的,不止一个可以进来。您需要决定如何处理这个问题,如果您要从其中一个返回,则取决于系统/逻辑,其他被断言的可能会将您带回中断处理程序,这样执行将/可能只处理其中一个挂起。其他逻辑可能要求您在返回之前处理所有悬而未决的问题


由于arm不一定控制与中断线或fiq线相关的内容,您可以从不同的供应商处获得各种解决方案,了解中断系统如何为特定的arm芯片工作。

谢谢@dwelch,当处理器中断发生时,您使用处理器/内核外部的逻辑/硬件检查,以查看是谁造成的。您的意思是使用中断控制器检查是谁造成的?我猜只有一个中断处理程序映射到地址0x0000018,该处理程序负责处理其他处理程序特定于模块。我刚刚找到一个中断处理程序代码,我猜在第69行,有跳转到特定于模块的中断处理程序代码。这理解正确吗?是的,软件与中断控制器和/或外围设备进行检查(最终与可生成中断的外围设备进行检查)。非常感谢@tangrs。我也对我要求的dwelch表示怀疑,我猜只有一个中断处理程序映射到地址0x0000018,该处理程序负责处理特定于模块的其他处理程序?另外,如果您能为我推荐一些代码,那就太好了中断处理程序通常会询问中断控制器是哪个引脚导致了中断,然后调用相应的处理程序“,我的意思是中断处理程序如何询问中断控制器哪个引脚导致了中断?这取决于您使用的确切SoC和配置,但通常涉及读取某种内存映射IO寄存器。精细tangrs,请确认我的理解,只有一个中断处理程序映射到地址0x0000018,该处理程序负责处理特定于模块的其他处理程序?