GIC Interrupt Map --- Linux Kernel 实现赏析

Linux - Devicetree规范: 中断和中断映射 参考: Specifications - DeviceTree Releases · devicetree-org/devicetree-specification · GitHub devicetree-specification-v0.4-rc1.pdf(但里面标注是:Devicetree Specification Release v0.3-40-g7e1cc17) 2.4 中断和中断映射 Interrupts and Interrupt Mapping DTSpec采用Open ... 阅读详情

1 : ID 分配
gic控制器最多支持 1020 个中断源, 支持多少,是soc 芯片设计时确定下来的
如 Altera cyclone 平台支持 256个中断源

SPI 外设中断 (Shared Peripheral Interrupt) 32 ~ 1019

这里写图片描述

先看一下中断控制器的初始化

main.c 
❶ /* 源头 : uboot最终会跳入这个坑里,唯有源头活水来,uboot现在都die了 */
void start_kernel(void)
{
    ❷:irq.c 
    init_IRQ();
    {
        ❸:irqchip.c
        /* 如果支持Device-Tree ,machine_desc 下面会详细说明*/
        if (IS_ENABLED(CONFIG_OF) && !machine_desc->init_irq)
            irqchip_init();
            {
                ❹ : irq.c   
                of_irq_init();
                {
                    ❺irq-gic.c
                    /* 中断控制器开始初始化,到这里才init,坑太深!*/
                    gic_of_init()  
                }
            }
        else
            machine_desc->init_irq(); 
    }
}

这里写图片描述

好,下面先看一下这个函数

/*
    它是怎么被调用的,下面会说,这里先看它的实现
*/
static void __exception_irq_entry gic_handle_irq(struct pt_regs * regs)
{
        /*
            irqnr   : GIC控制器支持中断源的数目.最大为1020.
                      SOC在芯片设计阶段,是怎么确定下来的呢?
            irqstat : GIC中断控制器中 中断确认寄存器的值,会取出它的低10位的值.          
        */
        u32 irqstat, irqnr;
        /*
            GIC描述结构
            struct gic_chip_data {
                union gic_base dist_base;    中断分发器的地址空间.
                union gic_base cpu_base;     cpu interface的基地址. 
                struct irq_domain * domain;  对应的irq_domain数据结构.
                unsigned int gic_irqs;       GIC支持的IRQ的数目,在gic_init_base中读取对应的寄存器后会为他赋值.    
            };
        */
        struct gic_chip_data *gic = &gic_data[0];
        /*
            在初始化中断控制器的时候已经赋值了,
            资源在初始化阶段被初始化并赋值给对应的结构体成员,到用的时候直接从该结构体中取出,常见且经典的做法.
            gic_of_init(....)
            {
                void __iomem * cpu_base;
                ....
                cpu_base = of_iomap(node,0);  底层使用 ioremap()来映射实现
                ....
                gic_init_bases(gic_cnt,-1,dist_base,cpu_base,percpu_offset,node);
                {
                    ....
                    gic->cpu_base.common_base = dist_base;  //在这里赋值了.
                }
            }
        */
        void __iomem * cpu_base = gic_data_cpu_base(gic);
        /*
            下面是一个 do while()循环, 164 mo ISR会一直中断风暴来了,哈哈! 
        */
        do {
                /*
                    上面说过了,这里读取寄存器赋值
                    Interrupt Acknowledge Register
                    GICC_IAR RO 0x0000003FF 只读 中断ID (硬件中断id)
                */
                irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK);
                /*
                    bit[9:0] : 发生中断的硬件中断号,

                    Qualcomm 的linux kernel 维护者,姐,看到了吧,是从中断控制器中获取的硬件中断ID
                */
                irqnr = irqstat & GICC_IAR_INT_ID_MASK;
                /*
                    硬件中断号 15 ~ 1020,它是PPI 或者 SPI类型的中断.
                */
                if (likely(irqnr > 15 && irqnr < 1021)) {
                    /*
                        硬件中断号传入进去了,会找到对应的软件中断号,
                        现在 还没有进入中断上下文

                        颠覆OS的革命技术 Interrupt 现在开始 闪亮登场了 . 哈哈!
                    */
                    handle_domain_irq(gic->domain, irqnr, regs);
                    /*
                        神来之笔!
                    */
                    continue;
                }
                /*
                    SGI中断,用于多核之间通讯.暂不分析.
                */  
                if (irqnr < 16) {
                    ....
                }
                break;
    } while (1);
}
【PCI】ARM架构——PCI总线驱动、RC驱动、Host Bridge驱动、xilinx xdma ip驱动(八) 讲解xilinx RC驱动(host bridge驱动、pci总线驱动)、级联中断。 阅读详情

相关推荐

第十八节 多核异构核间通信–ipcc

基于STM32MP1Linux 驱动开发实战 多核异构核间通信–ipcc

picassocao的博客 4621

【设备树使用】-- 4 进阶

5 设备特定数据 除了公共属性之外,还可以向节点添加任意属性和子节点。只要遵循一些规则,就可以添加操作系统所需的任何数据。 首先,新的特定于设备的属性名称应使用制造商前缀,以便它们不会与现有的标准属性名称冲突。 其次,必须在绑定中记录属性和子节点的含义,以便设备驱动程序作者知道如何解释数据。绑定文档描述特定兼容值的含义,它应具有的属性,可能具有的子节点以及它所代表的设备。每个唯一的  com...

EthanYYYY的博客 1854

Python与西门子PLC数据交互实战:基于Snap7的跨平台工业通信指南

本文详细介绍了如何使用Python和Snap7库实现与西门子PLC的数据交互。内容涵盖跨平台环境搭建、连接参数配置、数据读写实战及性能优化技巧,为工业自动化、数据采集和智能制造场景提供了一套轻量、灵活且高效的通信解决方案。

vim8coder的博客 292

我眼中的Linux设备树(四 中断)

四 中断中断一般包括中断产生设备和中断处理设备。中断控制器负责处理中断,每一个中断都有对应的中断号及触发条件。中断产生设备可能有多个中断源,有时多个中断源对应中断控制器中的一个中断,这种情况中断产生设备的中断源称之为中断控制器中对应中断的子中断。一般情况中断产生设备数量要多于中断控制器,多个中断产生设备的中断都由一个中断控制器处理,这种多对一的关系也很像一个树形结构,所以在设备树中,中断也被描述成...

weixin_30664539的博客 470

[Unity_Plastic SCM小技巧] 使用 UnityYAMLMerge 工具合并场景和预制件文件

首先YAMLMerge工具其实并不局限于PlasticSCM,git也可以,它是内置在Editor内的一个更加智能的版本控制工具,只不过正常不会启用,他的目录在C:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe(Unity Editor安装目录),MAC上:/Applications/Unity/Unity.app/Content...

unityofficial的博客 1146

BK3296蓝牙音频SoC深度评测:如何用这颗芯片打造超低功耗TWS耳机?

本文深度评测BK3296蓝牙音频SoC在TWS耳机中的应用,重点解析其22nm工艺带来的超低功耗优势(A2DP模式仅2.8mA)和3×3mm封装设计。通过芯片架构分析、双麦降噪调优及开发套件使用指南,为工程师提供打造高性能TWS耳机的完整解决方案,显著提升续航和音频质量。

rice5的博客 659

设备树入门

设备树是一种树形数据结构,其节点描述系统中的设备。每个节点都有描述所表示设备的特征的属性/值对。每个节点只有一个父节点,但根节点除外,根节点没有父节点。符合 DTSpec 的设备树描述了系统中不一定能被客户端程序动态检测到的设备信息。例如,PCI 的体系结构使客户端能够探测和检测连接的设备,因此可能不需要描述 PCI 设备的设备树节点。但是,如果无法通过探测检测到,则需要一个设备节点来描述系统中的 PCI 主桥设备。

qq_36525177的博客 2339

ASReview:基于主动学习的AI文献筛选工具,提升科研效率

主动学习是机器学习的一个重要分支,其核心原理是让算法能够主动选择最有价值的数据进行标注,从而以更低的成本获得更好的模型性能。这一技术通过人机协作的闭环流程,显著提升了数据标注和模型训练的效率和精度。在工程实践中,主动学习尤其适用于数据标注成本高昂或数据类别不平衡的场景,例如医学影像分析、自然语言处理中的文本分类以及推荐系统的冷启动问题。通过优先标注模型最不确定的样本,它能够有效解决传统机器学习面临的冷启动和数据稀疏性挑战。本文聚焦的ASReview项目,正是将主动学习原理应用于系统文献综述这一具体场景,通过

weixin_28725959的博客 432

设备树总结

参考: https://blog.youkuaiyun.com/ethercat_i7/article/details/83786670 https://www.cnblogs.com/god-of-death/archive/2004/01/13/10270453.html https://zhuanlan.zhihu.com/p/143167176 一、基本概念 DTS即Device Tree Source,是一个文本形式的文件,用于描述硬件信息,包括CPU的数量和类别、内存基地址和大小、中断控制器、总线和桥、外设

谁动了我的奶油的博客 1241

基于boot + 双app升级方案

基于boot+双app的升级方案

weixin_44654285的博客 4517

PHY6252开发实战:从零构建BLE串口透传应用

本文详细介绍了PHY6252开发板在BLE串口透传应用中的实战经验,包括开发环境搭建、BLE串口透传例程解析、AT指令集实现与扩展、数据透传机制优化以及常见问题排查指南。通过智能家居遥控器项目案例,展示了PHY6252在低功耗物联网设备开发中的实际应用。

weixin_29183637的博客 315

linux设备树设备中断,我眼中的Linux设备树(四 中断)

四 中断中断一般包括中断产生设备和中断处理设备。中断控制器负责处理中断,每一个中断都有对应的中断号及触发条件。中断产生设备可能有多个中断源,有时多个中断源对应中断控制器中的一个中断,这种情况中断产生设备的中断源称之为中断控制器中对应中断的子中断。一般情况中断产生设备数量要多于中断控制器,多个中断产生设备的中断都由一个中断控制器处理,这种多对一的关系也很像一个树形结构,所以在设备树中,中断也被描述成...

weixin_33196828的博客 551

ISCC-Amy‘s Code CTF-Reverse

ISCC-Amy's Code CTF-Reverse

m0_72904009的博客 682

01-Linux设备树系列-基本语法

文章目录 基本数据格式基本概念样机初始结构CPU节点名称设备了解 compatible Property 寻址如何工作CPU寻址内存映射设备非内存映射设备范围(地址转换) 中断如何工作设备特定数据特殊节点aliases 节点chosen 节点 高级主题高级样品机P...

cez123cez的专栏 497

YOLO26涨点改进 | 全网首发Conv独家改进篇 | CVPR 2025 | YOLO26引入FDConv频率动态卷积改进,含FDC3k2二次创新,小目标检测,能够捕捉更加丰富和复杂的特征信息

本文提出了一种频率动态卷积(FDConv)模块,用于改进YOLO26目标检测模型的性能。FDConv通过在傅里叶域内划分参数预算,构建具有频率多样性的权重,有效提升了模型对低频和高频信息的处理能力。该模块包含内核空间调制(KSM)和频率带调制(FBM)两个关键组件,分别实现空间级和频域级的动态调节。实验表明,FDConv仅增加3.6M参数就能超越其他需要大幅增加参数的方法,并在目标检测、实例分割等任务中表现优异。文章详细介绍了FDConv的原理、实现方法及在YOLO26中的集成方式,提供了完整的代码实现。

Ai缝合怪、助力小伙伴高效发论文 250

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

PowerPC的PCI总线的dts配置【转】

powerpc使用称为FDT 扁平设备描述树的机制传递给内核硬件配置参数,从而引导内核。 这样的优势是PowerPC在Linux上的移植基本上都是对dts文件的修改,而升级内核的工作量远远小于其他cpu体系结构。 只是目前介绍FDT或者OPEN Firmware的中文资料欠缺,这里记录我领悟的关于PCI总线树部分的ranges参数。 pci0: pci@e0008500 { in

zjy900507的博客 2288

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Device Tree Usage

设备树使用手册 This page walks through how to write a device tree for a new machine. It is intended to provide an overview of device tree concepts and how they are used to describe a machine. 本文将介绍如何

bingqingsuimeng的专栏 5464

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Linux 驱动开发 九:《Power_ePAPR_APPROVED_v1.12》翻译

零、说明 以下翻译通过翻译工具完成。 一、介绍 1、目的和范围 为了初始化和引导计算机系统,交互固件的各种软件组件可能在将控制传递给操作系统、引导加载程序或管理程序等软件之前执行系统硬件的低级初始化。引导加载程序和管理程序可以依次将控制加载并转移到操作系统。标准的、一致的接口和约定促进了这些软件组件之间的交互。在本文档中,术语引导程序一般用来指初始化系统状态并执行其他软件的软件组件。 这个规范,嵌入式电源体系结构平台要求( ePAPR ),提供了一个完整的引导程序到客户端程序接口的定义,与促进基于 cpu

OnlyLove_的博客 2817

linux 中断的层层递进 与 IRQ_DOMAIN

【代码】linux 中断的层层递进 与 IRQ_DOMAIN。

u011011827的博客 1380

(一)DTS介绍

(一)DTS介绍DTS介绍目的和范围DTS和 IEEE™ 1275、ePAPR的关系 DTS介绍 http://devicetree.org/Device_Tree_Usage "Open Firmware Device Tree"或者简单设备树,是一种描述硬件的一种数据结构和语言。特别的是,使用DTS描述操作系统只读的硬件信息,因此操作系统中不需要硬编码描述设备信息。 结构上,DT是一种树形结构...

卓越之路 1万+

device tree中基础属性的解释

devicetree的结构 节点名字 node-name node-name@unit-address node-name应该能够描述设备的一般类别 unit-address是特定于节点所在的总线类型,unit-address必须与reg指定的地址保持一致,如果node没有reg属性,则在同一级中node的名字必须唯一,且unit-address需要省略。 属性 properties 属性(pr...

lhkwqy的博客 1448

操作系统学习之中断-interrupt

中断(interrupt)分为硬件中断和软件中断 硬件中断又可分为内部中断和外部中断 80386把外部中断称为“中断”,而内部中断则称为异常(exception) trap大概就是指硬件内部中断了,不知道这里理解的对不对 下面附上google上查到的资料 本文仅供个人参考记录,如有不对之处,还望指正,谢谢 An interrupt is generally initiated by...

Forest0579的专栏 508

openwrt DTS

openwrt DTS 相关参考 Device Tree Reference Device Tree Usage in OpenWrt 设备树简介 DTS(Device Tree) 设备树。DeviceTree是一种描述硬件的数据结构,DeviceTree发源于PowerPC架构,为了消除代码中冗余的各种device注册代码而产生的,现在已经成为了linux的通用机制。 它替代arch/arm/plat-xxx和arch/arm/mach-xxx中的板级spec代码,便于code管理。 它通过bootlo

hzlarm的博客 5185

中断/gic代码导读:在哪里配置安全中断的?

思考:在哪里配置安全中断的? 在哪里配置中断的G0、NS-G1、S-G1分组的? optee 在optee中有一段默认的配置,将0-7配置成NS-G1,8-15配置成S-G1,16-31配置成NS-G1,32之后的也全部都是NS-G1 但是这段配置不一定会被调用,gic_init()由平台的main_init_gic()函数调用,在大多数的场景下,gic_init()是不会被调用的。 如下也只是列举了plat-rockchip平台对gic_init()的调用。 ATF ...

baron-周贺贺-代码改变世界ctw 651

全志T113-S3 RT-Thread SMP适配笔记

T113-S3 SMP适配笔记 目标 给T113-S3适配RT-Thread,并支持SMP。 资料 没有太详细的资料和示例,只有一些零星的信息。 F133封装基本兼容 Cortex-A7双核 一些参考资料 https://whycan.com/t_7808.html https://bbs.aw-ol.com/topic/1247/ 计划 最好能直接使用xfel在SRAM,或是DDR中运行,避免从SD卡启动还需要SPL。 先用xfel payload跑通, 最好能有串口打印。 再尝试直接load到

DOT小文哥的博客 7856
上一篇: Uart 架构之美 -- Linux Kernel 实现浅析
下一篇: Interrupt 架构之美 -- Linux Kernel 实现欣赏
leesagacious
博客等级 码龄12年 146粉丝 179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值