本章节分析常用的中断分配/映射及注册函数,对这个过程有个基本的理解。后续针对不同的中断使用实例作更详细介绍。
它主要根据硬件中断号hwirq,分配virq,建立起映射,然后请求中断,设置中断处理函数及irq_chip(与中断硬件相关的操作)。这些操作在不同类型或平台上使用的操作函数大致类似。以acpi_register_gsi()为例,它可以完成上述操作。

对于GICv3,d->ops->alloc = gic_irq_domain_alloc(),详细过程如下:

后续在中断处理章节对这些中断处理函数作更详细介绍。
对于IPI/SGI中断是通过函数request_percpu_irq()进行注册,对于SPI/LPI中断是通过函数request_irq()或request_threaded_irq()进行注册。PERCPU中断只会产生在特定的CPU上。虽然不同调用,但过程大体类似。

(1)IPI/SGI设置handler回调,而LPI/SPI中断如果支持中断线程化,同时也会设置线程回调thread_fn;
(2)调用__setup_irq()设置中断,将异常情况及共享中断情况忽略,过程如下:
- 若支持中断线程化,创建中断线程,设置亲和性;
- 调用irq_activate()激活中断(domain->ops->activate()),注意对于LPI中断,在ITS的irq_chip对应的回调激活中断,对于SPI/PPI/SGI为空;
- 唤醒中断线程并等待线程ready;
- 创建中断及中断handler的PROC目录;