linux arm中断 arm架构linux

大家好,今天来为大家解答linux arm中断这个问题的一些问题点,包括arm架构linux也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

ARM的中断处理 [一]

本文将深入探讨ARM处理器的中断处理机制,特别是与ARM的中断控制器GIC(Generic Interrupt Controller)相关的内容。GIC在不同版本中,如v1到v4,不断扩展了功能以适应不同类型的ARM Cortex处理器,如Cortex-A5、A9至A72等。

GIC的核心功能在于连接中断源和CPU,随着多核时代的到来,它被划分为Distributor和Redistributor两个部分。Distributor类似于I/O APIC,负责根据CPU配置分发中断,Redistributor则负责将中断发送给对应的CPU。早期的GICv1版本支持有限的中断源和处理单元(PE)数量,而后续版本如v3和v4则在这些方面有所增强,并引入了MSI(Message-Based Interrupt)机制。

中断源在GIC中被分类,包括SGI(Software Generated Interrupt)和PPI(Private Peripheral Interrupt)。SGI由软件触发,用于核间通信,而PPI则是私有的,如定时器和传感器中断。SPI(Shared Peripheral Interrupt)是所有CPU共享的中断,LPI则是从GICv3开始引入的,支持MSI形式的中断,配置信息存储在PRAM中。Linux内核处理硬件中断时,这些编号需要转换为软件中断号。

中断源的优先级管理是GICv3的一大特性,通过running priority机制解决中断抢占问题。然而,这种硬件特性可能导致中断处理函数的嵌套,增加了软件复杂性,Linux通常不直接利用这一特性。

尽管硬件提供了这些功能,实际的中断处理在Linux内核中可能有所不同。后续章节将结合Linux内核的代码,进一步解析ARM中断的处理流程。为了完整理解,可以参考GICv3和GICv4的软件概述。

armlinux系统和裸机中断响应时间

中断响应周期是指当CPU采用中断方式实现主机与I/O交换信息时,CPU在每条指令执行阶段结束前,都要发中断查询信号,以检测是否有某个I/O提出中断请求。如果有请求,CPU则要进入中断响应阶段,又称中断周期。

中断的响应时间就是中断的响应过程的时间,中断的响应过程是当有事件产生,进入中断之前必须先记住当前正在做的事情,然后去处理发生的事情,处理这个过程的时间。

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

本文基于 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线,系统启动后,显示中断调用流程的日志如下:

阅读剩余
THE END