Linux内核中断之中断调用流程

Linux内核中断之中断调用流程,第1张

本文虚卜基于 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 中增加 dump_stack() 调用( 注:仅限于调试验证 )。

插入 HDMI 线,系统启动后,显示中断调用流程的肆芦日志如下:

51的C语言中断是函数,那这个中断是否可以调用?如果能,怎么调用?

只从计算机原理来讲,是可以的。

理论上,中断函数也是一个程序的入口,只要把程序指令指针指向这个中断的入口地址,

就可以执行相应的代码,从这个角度来讲,是可 *** 作的。

但在实际问题处理中,通常不行,因为中断是提供给系统处理应急事件的,

并非设计来作为常规函数呼叫。

如果只是想要使用中断处理中的某些功能,可把那些功能封装为独立的函数,

供给中断处理和一般流程来调用。

应用程序直接调用中断,是有违中断设计的初衷的,

不建议这样使用,易导肆穗埋致原本正常的流程的莫名异裂蚂常,

因为调用中断处理,会占用中断的相族薯关资源,导致正常的中断无法执行,出现异常。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12323595.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存