发布网友 发布时间:2023-01-05 09:46
共1个回答
热心网友 时间:2023-05-08 17:22
本文基于 RockPI 4A 单板Linux4.4内核介绍中断调用流程。
ARMv8包括两种运行状态:AArch64和AArch32。
AArch64中不再使用AArch32中的7种特权模式,而是提出了Exception Levels的概念,包括:
1)EL0:用于用户态程序,权限最低
2)EL1:给内核使用,权限稍高
3)EL2:虚拟化相关,权限更高
4)EL3:安全相关,权限最高
Linux内核中一般只使用EL0和EL1。
AArch64异常向量表中的异常包括:
1)Synchronous exception(同步异常)
2)SError
3)IRQ
4)FIQ
注:SError、IRQ和FIQ属于异步异常。
在Linux内核中,在 arch/arm64/kernel/entry.S 文件中定义了异常向量表,内容如下:
选取 el1_irq() 函数介绍Linux内核中断的调用流程。
文件: arch/arm64/kernel/entry.S ,调用流程如下:
1、handle_irq()初始化
在 DTS 解析阶段完成 handle_irq() 函数的初始化,流程如下:
gic_irq_domain_map() 函数中完成了 handle_irq() 函数的赋值,具体执行如下:
2、handle_irq()实现
以共享外设中断 SPI 的中断处理函数 handle_fasteoi_irq() 为例,继续跟踪中断的执行过程。
handle_irq_event_percpu() 函数会调用已经注册的中断处理函数,同时唤醒 irq_thread 线程。
3、中断处理线程
在使用 request_threaded_irq() 函数申请中断时,会创建一个 irq_thread 线程,调用流程如下:
irq_thread 线程平时在睡眠状态,等待 handle_irq_event_percpu() 函数唤醒,进一步执行已注册的中断处理线程函数。
使用 DRM 框架中 HDMI 中断验证中断调用流程。
文件: drivers\gpu\drm\bridge\synopsys\dw-hdmi.c
在中断处理函数 dw_hdmi_hardirq() 和中断处理线程函数 dw_hdmi_irq 中增加 mp_stack() 调用( 注:仅限于调试验证 )。
插入 HDMI 线,系统启动后,显示中断调用流程的日志如下:
和