4.2.1 通过DTS传递物理中断号给Linux

点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客 

4.2.1 通过DTS传递物理中断号给Linux

参考《GICv3_Software_Overview_Official_Release_B》,下表描述了GIC V3支持的INTID(硬件中断号)的范围。

SGI (Software Generated Interrupt):软件触发的中断。Linux内核可以通过写GICD_SGIR寄存器来触发一个中断事件,用于CPU core之间的通信。

PPI (Private Peripheral Interrupt):私有外设中断。这是每个核心私有的中断。PPI会送达到指定的CPU上,应用场景有CPU本地时钟。

SPI (Shared Peripheral Interrupt):软件触发的中断。软件可以通过写GICD_SGIR寄存器来触发一个中断事件,一般用于核间通信。

LPI (Locality-specific Peripheral Interrupt):LPI是GICv3中的新特性,是基于消息的中断。当前GIC V3驱动irq-gic-v3.c的参数gicv3_nolpi默认为0,所以默认是默认支持LPI的。

SOC芯片在设计的时候,不同设备会分配到自己固定的硬件中断号,一般在手册里都会说明。这些硬件中断号如何告知内核呢?通过open firmware device tree,经常简称device tree。设备树通常以 .dts(Device Tree Source)文件的形式编写,这是一种人类可读的文本格式。.dts 文件会被编译成二进制的 .dtb(Device Tree Blob)文件,供内核在启动时使用。

以dts中的timer设备为例,说明一下硬件中断号是如何传入Linux中的。

/dts-v1/;/ {......timer {compatible = "arm,armv8-timer";interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_HIGH)>,<GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_HIGH)>,<GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_HIGH)>,<GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_HIGH)>;};......
};

interrupts 属性定义了定时器产生的中断。每个中断由三个字段组成:

  • 第一个字段是中断类型,0代表GIC_SPI,1代表GIC_PPI

 

  • 第二个字段是中断号。这个中断号并不是GIC中的硬件中断号,而是PPI或SPI各自范围的逻辑编号。对于PPI来说,范围是0~15;对于SPI来说,范围是0~987。例子中有四个PPI中断号:中断号13 (0x0d)、中断号14 (0x0e)、中断号11 (0x0b)、中断号10 (0x0a)。
  • 第三个字段是中断的属性,包括2个字节。低字节是中断的触发类型,在这个例子中,中断是高电平触发。高字节表示中断的目标 CPU 掩码,例如GIC_CPU_MASK_SIMPLE(8)可以表示所有 8 个 CPU 都可以接收这个中断。

 dts里面的中断号,是如何传递到Linux中呢?Linux根据dts中的timer节点来创建设备时,需要计算出真实的hwirq。以GIC IRQ V3来说,使用gic_irq_domain_translate函数,根据中断类型进行转换。对于PPI,要加上16;对于SPI,要加上32.

最后一个问题,对于timer设备来说,四个中断最终使用哪个中断?根据compatible = "arm,armv8-timer",确认匹配的驱动程序为drivers/clocksource/arm_arch_timer.c。四个中断的定义在include/clocksource/arm_arch_timer.h。 

drivers/clocksource/arm_arch_timer.c
TIMER_OF_DECLARE(armv8_arch_timer, "arm,armv8-timer", arch_timer_of_init);include/clocksource/arm_arch_timer.h
enum arch_timer_ppi_nr {ARCH_TIMER_PHYS_SECURE_PPI,   // 对应timer中的PPI 13ARCH_TIMER_PHYS_NONSECURE_PPI, //对应timer中的PPI 14ARCH_TIMER_VIRT_PPI,          //对应timer中的PPI 11ARCH_TIMER_HYP_PPI,           //对应timer中的PPI 10ARCH_TIMER_MAX_TIMER_PPI      // 用于边界检查
};

以我用的QEMU virt为例,arch_timer_of_init调用arch_timer_select_ppi()选择了ARCH_TIMER_VIRT_PPI,对应timer中的PPI 11。根据上面的分析,针对PPI中断,Linux会加上偏移量16,最终得到hwirq 27!

通过cat /proc/interrupts来验证一下,arch_timer的硬件中断号hwirq确实是27!

注意看图上的第一列,显示的是Linux中断号。arch_timer的硬件中断号hwirq 27对应Linux的中断号为3,二者是怎么映射的,下一章继续分析。

点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客

原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1551633.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【C/C++】 秋招常考面试题最全总结(让你有一种相见恨晚的感觉)

目录 1.C程序编译链接过程 2.浅拷贝和move有区别吗 3.深拷贝和浅拷贝的区别 4.空类的大小 5.类的继承有几种方式&#xff0c;区别是什么&#xff1f; 六、extern 关键字的作用 七、static关键字的作用 八、指针和引用的区别 九、C内存分配方式 十、结构体对齐…

33 指针与数组:数组名与指针的关系、使用指针遍历数组、数组指针、指针数组、字符指针

目录​​​​​​​ 1 数组名与指针的关系 1.1 数组名 1.2 对数组名取地址 1.3 数组名与指针的区别 1.3.1 类型不同 1.3.2 sizeof 操作符的行为不同 1.3.3 & 操作符的行为不同 1.3.4 自增自减运算的行为不同 1.3.5 可变性不同 2 使用指针遍历数组 2.1 使用 *(nu…

硬布线控制器与微程序控制器

硬布线控制器和微程序控制器都是控制单元&#xff08;CU&#xff09;的实现方式&#xff0c;用于协调和控制计算机系统的操作。它们的主要区别在于控制信号的生成方式&#xff1a; 硬布线控制器 (Hardwired Controller): 概念: 硬布线控制器使用组合逻辑电路直接生成控制信号…

自己做个国庆75周年头像生成器

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 下载相关代码&#xff1a;【免费】《自己做个国庆75周年头像生成器》代码资源-CSDN文库 又是一年国庆节&#xff0c;今年使用国旗做…

《情书》你的名字,是最美的情书

《情书》你的名字&#xff0c;是最美的情书 岩井俊二&#xff0c;日本电影导演&#xff0c;作家及记录片导演。被誉为日本最有潜质的新近“映像作家”&#xff0c;也有中国影迷称他为“日本王家卫”。影像清新独特、感情细腻丰富。&#xff08;来自豆瓣&#xff09; 穆晓芳 译 …

总结C/C++中内存区域划分

目录 1.C/C程序内存分配主要的几个区域&#xff1a; 2.内存分布图 1.C/C程序内存分配主要的几个区域&#xff1a; 1、栈区 2、堆区 3、数据段&#xff08;静态区&#xff09; 4.代码段 2.内存分布图 如图&#xff1a; static修饰静态变量成员——放在静态区 int globalVar 是…

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(2)Keras

文章目录 前言一、Keras二、使用Kears 估计回归问题的神经网络1. 载入、处理数据2. 数据预处理&#xff1a;归一化3. 设定一系列随机数种子4. 定义了一个简单的深度神经网络5. 训练模型6. 查看训练结果7. 使用最优轮数&#xff08;index1&#xff09;重新估计 此神经网络模型8.…

小程序原生-列表渲染

1. 列表渲染的基础用法 <!--渲染数组列表--> <view wx:for"{{numList}}" wx:key"*this" > 序号&#xff1a;{{index}} - 元素&#xff1a;{{item}}</view> <!--渲染对象属性--> <view wx:for"{{userInfo}}" wx:key&q…

springboot实战学习(10)(ThreadLoacl优化获取用户详细信息接口)(重写拦截器afterCompletion()方法)

接着学习。之前的博客的进度&#xff1a;完成用户模块的注册接口的开发以及注册时的参数合法性校验、也基本完成用户模块的登录接口的主逻辑的基础上、JWT令牌"的组成与使用、完成了"登录认证"&#xff08;生成与验证JWT令牌&#xff09;以及完成获取用户详细信…

Java中异常的认识和创建

文章目录 前言一、异常的概念与体系结构 1.1 异常的概念1.2 异常的体系结构1.3 异常的分类二、异常的处理 2.1.防御式编程2.2 异常的抛出2.3 异常的捕获2.4 异常的处理流程三、自定义异常类 一、异常的概念与体系结构 1.1 异常的概念 在生活中&#xff0c;一个人表情痛苦&…

51单片机的智能垃圾桶【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块超声波传感器红外传感器步进电机按键、蜂鸣器、LED等模块构成。适用于智能自动感应垃圾桶、超声波智能垃圾桶等相似项目。 可实现基本功能: 1、LCD1602实时显示桶内垃圾高度 2、超声波传感器采集桶顶到垃圾的距离…

Temporal Dynamic Quantization for Diffusion Models阅读

文章目录 AbstractIntroductionBackgrounds and Related Works2.1 扩散模型2.2 量化2.3 量化感知训练和训练后量化 TemporalDynamic Quantization3.1 量化方法3.2 扩散模型量化的挑战3.3 TDQ模块的实现3.4 工程细节时间步的频率编码TDQ模块的初始化 Experimental SetupResults5…

C99中的变长数组

在C99标准之前&#xff0c;从语言在创建数组的时候&#xff0c;指定数组的大小只能使用常量和表达式&#xff0c;或者数据初始化的时候&#xff0c;可以省略数组大小。 1.int arr[5]{1,2,3,4,4}; 2.int arr[24]{1,2,3,4,5,6}; 3.int arr[]{1,2,3,3,4,5,6}; 这样的语法限制不够灵…

使用 ModelScope Studio 实现可滚动 ChatBot

前面的文章提到过 Gradio 的 Chatbot 不能自动滚动的问题&#xff0c;最近看到了 ModelScope Studio 扩展的一些组件&#xff0c;其中 Chatbot 就完美解决了自动滚动的问题&#xff0c;同时还增加了很多更细化的功能&#xff0c;例如可以设置用户和 AI 的头像。官方文档&#x…

QCamera6.7笔记

1.QCamera​ .h文件 #include <QtWidgets/QMainWindow> #include "ui_QCamera_test1.h" #include <QCamera> #include <QtMultimedia> #include <QtMultimediaWidgets> #include<QMediaCaptureSession> #include <QMediaDevices&…

渗透测试之密码暴力破解工具medusa美杜莎

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

C语言指针详解与应用(不断更新)

指针简介 指针(Pointer)是C语言的一个重要知识点&#xff0c;其使用灵活、功能强大&#xff0c;是C语言的灵魂 指针与底层硬件联系紧密&#xff0c;使用指针可操作数据的地址&#xff0c;实现数据的间接访问 指针生活实例化 指针的本质是地址&#xff0c;在生活中比如你取快…

C++快速入门

文章目录 C快速入门一、命名空间1.初始C2.概念3.命名空间的定义1.普通的命名空间2.命名空间的嵌套3.命名空间的重名问题3.命名空间的展开 二、C的输入&输出三、缺省参数1.全缺省参数2.半缺省参数3.缺省参数的用途4.缺省参数的注意点 四、函数重载1.函数重载的原则2.以下的函…

【RocketMQ】RocketMQ应用难点

&#x1f3af; 导读&#xff1a;本文探讨了RocketMQ中消息重复消费的问题及其解决方案&#xff0c;尤其是在CLUSTERING模式下的扩容影响。文章分析了重复消费的原因&#xff0c;如广播模式、负载均衡模式下的多consumerGroup消费、消费者组内的动态变化及网络延迟等&#xff0c…

婚恋交友系统该如何做才能做到日进斗金?

要使婚恋交友系统实现盈利并做到日进斗金&#xff0c;需要综合考虑市场需求、用户体验、商业模式和营销策略等多个方面。以下是一些建议&#xff0c;旨在帮助构建一个成功且盈利的婚恋交友系统&#xff1a; 深入了解目标市场&#xff1a; 研究目标用户群体的需求、偏好和行为模…