解析Linux中断子系统之中断映射

news2024/12/26 10:42:57

中断是当前计算机系统的基础功能,也是系统响应外设事件的必备桥梁。不同的架构对中断控制器有不同的设计理念,本文针对ARM公司提供的通用中断控制器(GIC,Generic Interrupt Controller)介绍在linux系统中的硬件中断号与软件中断号的映射过程。

首先,我们先来理解一下硬件中断号和软件中断号。

  • 硬件中断号:GIC为每一个硬件中断源都分配了一个唯一编号,称为硬件中断号,用于区分不同的中断源。GIC-v3支持的硬件中断类型和分配的硬件中断号范围如下图所示。

IC 分配的中断号范围

  • 软件中断号:系统在中断注册和中断处理过程中使用到的中断号。有的地方也称为虚拟中断号。

为什么要进行中断映射呢?简单来讲,软件可以不需要关注该中断在硬件上是哪个中断来源。简单的SOC内部对中断的管理也比较简单,通常会有一个全局的中断状态寄存器来记录外设中断,这样直接将硬件中断号线性映射到软件中断号即可。但是随着芯片技术的发展,SOC越来越复杂,通常内部会有多个中断控制器(比如GIC interrupt controller, GPIO interrupt controller), 每一个中断控制器对应多个中断号,而硬件中断号在不同的中断控制器上是会重复编码, 这时仅仅用硬中断号已经不能唯一标识一个外设中断。尤其在多个中断控制器级联的情况下,会变得更加复杂。这样对软件编程来讲极不友好,作为软件工程师,我们更愿意集中精力关注软件层面的内容。接下来,我们看看Linux系统中断映射过程涉及到的数据结构,数据结构详细信息请参看Linux内核源码。

□ struct irq_desc,中断描述符,每个irq都会在系统中分配一个该数据结构,用于描述该irq的相关信息,包含了irqaction 。

□struct irq_domain/struct irq_chip, 是对中断控制器的软件抽象。

irq_domain 侧重于对级联关系的描述,以及该中断控制器对某个中断响应的描述在struct irq_domain_ops中进行组织。irq_domain中的linear_revmap[] 和 revmap_tree 用于该domain中hwirq的map。

irq_chip 侧重对该中断控制器响应中断过程的描述。

□struct irq_data, 是中断映射的关键数据结构,映射过程这要是填充该数据结构中的irq与hwirq。irq 为软件系统分配的虚拟中断号,hwirq为该domain分配的硬件中断号。

Linux系统中断映射过程涉及到的数据结构间的关系如下:

映射过程大致分为如下几个过程:

1. 系统维护全局allocated_irqs

2. 中断控制器的初始化

3. 软件中断号的获取与映射

4. 硬件中断号的获取与映射

一、系统维护全局allocated_irqs

在开了CONFIG_SPARSE_IRQ的系统中,系统中维护的全局allocated_irqs有NR_IRQS + 8196 位,每一位代表一个软件中断号。在virq的申请过程中,既可以单个中断号申请,也可以几个中断号一起申请。在申请过程中,从allocated_irqs的低位到高位查询第一个连续N个空闲的位作为软件中断号。

系统中的allocated_irqs 定义如下:

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

二、中断控制器的初始化

中断控制器通过IRQCHIP_DECLARE 宏注册到__irqchip_of_table,系统开机初始化阶段 start_kernel() => init_IRQ()=> irqchip_init 调度到注册的gic_of_init() 对GIC进行初始化。

Gic_of_init中注册domain相关的处理函数,其中gic_irq_domain_translate()将DTS中解析的中断信息翻译得到HWirq。通过irq_domain_create_tree() 申请一个domain内存,赋值后加入到全局的 irq_domain_list中。同时,设置中断处理入口函数。

三、软件中断号的获取与映射

kernel_init() => kernel_init_freeable() => do_pre_smp_initcalls()=> do_one_initcall() => arm64_device_init() => of_platform_populate()=> of_platform_bus_create() => of_platform_device_create_pdata() =>of_device_alloc()

Of_device_alloc()中,想通过of_irq_count() 从dts node中计算出该node中的irq 数量。然后对应每一个irq 调用of_irq_to_resource() => of_irq_get() 获取软件中断号。of_irq_get() 调用of_irq_parse_one() 从dts中收集该中断的相关信息如触发方式,中断号,中断类型等信息并记录在oirq结构体中。然后调用irq_create_of_mapping()进行中断映射并返回软件中断号。

irq_create_of_mapping() => irq_create_fwspec_mapping()通过irq_domain_translate()调用 gic_of_init()过程中注册的gic_irq_domain_translate() 进行翻译得到hwirq。然后调用irq_find_mapping() 尝试通过domain->revmap_tree 获取irq_data,从而后去irq。如果获取到irq说明该中断已完成映射,无需再进行下去。如果没有获取到irq,说明该中断没有进行过映射,继续往下。irq_create_mapping()中先通过bitmap_find_next_zero_area() 从allocated_irqs中找到第一个空闲位 start作为软件中断号。然后申请一个中断描述符irq_desc,完成相关赋值后,将软件中断号作为键值把irq_desc 加入到irq_desc_tree 基树上。此后,

就可以通过irq从irq_desc_tree 基树上快速获取对应的irq_desc,从而获取其他相关信息。

四、硬件中断号的获取与映射

irq_create_fwspec_mapping()先调用irq_domain_translate()获取到硬件中断号,由于预留了SGI,PPI的中断号,这里需要加上对应的中断号偏移。然后在irq_domain_associate()中通过给该irq_data->hwirq赋值为获取到的硬件中断号,同时在irq_domain_set_mapping()中进行映射建立起hwirq与irq_data之间的联系。

irq_domain_set_mapping()中的映射包含两个部分,一是在该控制器支持一定的线性映射前提下,当hwirq <domain->revmap_size时进行线性映射。否则以hwirq作为键值将irq_data放入该domain的revmap_tree基树中,搭建起通过hwirq快速查询virq的途径。

五、总结

通过以上操作,可以以virq=>从irq_desc_tree中获取该irq的中断描述符结构体desc=> 再从desc中获取irq_data=> 进而获取hwirq;也可以通过hwirq=>从该domain的revmap_tree中获取对应的irq_data=> 从而获取 data->irq。本文大体讲诉了linux kernel中断映射的解析与映射过程,并没有对具体的代码展开详细的讲解。读者可以根据梳理的框架进行代码详情的研究。

 

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

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

相关文章

SpringBootWeb登录认证

1. 登录功能 1.1 需求 在登录界面中&#xff0c;我们可以输入用户的用户名以及密码&#xff0c;然后点击 “登录” 按钮就要请求服务器&#xff0c;服务端判断用户输入的用户名或者密码是否正确。如果正确&#xff0c;则返回成功结果&#xff0c;前端跳转至系统首页面。 1.2 …

简单聊一聊数据库驱动

数据库驱动通常是数据库厂家提供的&#xff0c;他们按照jdbc协议对自家数据库封装了一套可对外调用的API。在应用程序和数据库之间起到了桥接的作用。它是一个软件组件&#xff0c;提供了与特定数据库系统进行通信的接口和功能。 1. 数据库驱动的作用&#xff1a; 连接数据库&…

AAOS 音频动态路由

文章目录 基本概念车载音频配置文件外部的配置音频区的方式车载音频服务配置路由流程框架中获取可用输出设备配置例子测试方法相关问题 基本概念 Android 管理来自 Android 应用的声音&#xff0c;同时控制这些应用&#xff0c;并根据其声音类型将声音路由到 HAL 中的输出设备…

FastAPi上传文件报错,There was an error parsing the body

问题描述 通过postman调用fastapi编写的文件接口报错&#xff0c;如下图&#xff1a; {"detail": "There was an error parsing the body" } 问题的解决过程 postman本身的问题 postman有个work directory的概念&#xff0c;所以再使用postman上传的文…

Git常用命令submodule

Git常用命令submodule 1、需求 当程序比较大参与开发人员较多时&#xff0c;代码管理就复杂起来。代码如果全员可见&#xff0c;可以创建 share 分支维护共用代 码&#xff0c;可以创建 core 分支维护核心算法代码&#xff0c;各进程分别占一个分支&#xff0c;定期同步 sha…

如何从 OpenAI 迁移到 Azure OpenAI(保姆级教程,包含如何兼容 JS 语言版 LangChain)

Azure OpenAI 和 OpenAI 一样&#xff0c;本质都是调用 api&#xff0c;Azure OpenAI 的使用会稍微复杂一点&#xff0c;但好处就是方便付费。 创建 Azure OpenAI 资源 首先&#xff0c;先登录 Azure 账号&#xff1a;https://azure.microsoft.com/zh-cn/ 接着创建 OpenAI 资…

硬件工程师-BOOST升压电源设计

一、Boost变换原理 开关闭合时&#xff0c;电感电压等于输入电压 开关断开时&#xff0c;电感电压输出电压-输入电压&#xff0c; 电感的感生电动势&#xff0c;N ΔΦ磁通的变化率&#xff0c;Δt时间 假设开关闭合与开关断开&#xff0c;开关断开时能量全部释放光 将第三个式…

MySQL(进阶篇1.0)

MySQL体系结构 1、连接层 最上层是一些客户端和连接服务&#xff0c;包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关安全方案。在该层上引入了线程池的概念&#xff0c;为通过认证安全接入的客户端提…

进程的通信方式有哪些?

目录 管道消息队列共享内存信号量信号套接字 管道 最初我们在学习Linux基本命令使用的时候&#xff0c;我们经常通过多个命令的组合来完成我们的需求。比如说我们想知道如何查看进程或者端口是否在使用&#xff0c;会使用下面的这条命令 netstat nlp | grep xxx 这里的"|“…

电子科技大学计算机系统结构复习笔记(四):存储系统

目录 前言 重点一览 Cache基本原理 三种映像方式 物理地址与Cache地址的映射计算 Cache块标识 Cache替换算法 Cache写策略 分离cache与一体cache Cache性能与优化 Cache性能计算 Cache性能优化 主存储器与虚拟存储器 主存储器性能优化 虚拟存储器 虚拟存储器与…

编译 ONNX 模型

本篇文章译自英文文档 Compile ONNX Models — tvm 0.13.dev0 documentation 作者是 Joshua Z. Zhang 更多 TVM 中文文档可访问 →TVM 中文站。 本文将介绍如何用 Relay 部署 ONNX 模型。 首先安装 ONNX 包&#xff0c;最便捷的方法推荐安装 protobuf 编译器&#xff1a; pi…

【资料分享】浪涌电流(Inrush Current)产生原因

1、对Inrush Current电流的直观感受 当电灯在电路中工作时&#xff0c;如果突然启动马达或者变压器时&#xff0c;会出现电灯暗一下&#xff0c;此时电灯出现暗的情况就是因为马达或者变压器启动时&#xff0c;在电路中产生较大Inrush Current&#xff0c;具体分析可以参考下图…

图解HTTP书籍学习

了解Web及网络基础 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09; Web是建立在HTTP协议上通信的 把SGML&#xff08;Standard Generalized Markup Language&#xff0c;标准通用标记语言&#xff09; HTML&#xff08;HyperText Mar…

大数据:spark任务调度,DAGscheduler,Taskscheduler

大数据&#xff1a;spark任务调度 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其s…

SpringBoot源码分析:SpringBoot自动装配(二)

一、概述 SpringBoot的启动流程入下图所示&#xff0c;它主要分为加载主启动类和解析启动类两个部分&#xff0c;我将从这两个部分分别开始介绍。 二、加载主启动类 首先点入SpringApplication.run方法 之后进入SpringApplication.prepareContext方法 之后进入SpringApplicat…

【JavaEE】简单前后端分离小项目-表白墙

plus版表白墙&#xff01;✿✿ヽ(▽)ノ✿ 文章目录 JavaEE & 简单前后端分离小项目 - 表白墙1. body格式约定 - 应用层协议2. 后端处理请求2.1 模板2.2 doGet方法2.3 doPost方法 3. 前端制作请求并解析响应3.1 原前端页面的代码3.2 刷新时发送GET请求3.3 点击发送时构造Pos…

40 KVM管理设备-配置磁盘IO悬挂

文章目录 40 KVM管理设备-配置磁盘IO悬挂40.1 总体介绍40.1.1 概述40.1.2 应用场景40.1.3 注意事项和约束限制 40.2 磁盘IO悬挂配置40.2.1 Qemu命令行配置40.2.2 xml配置方式 40 KVM管理设备-配置磁盘IO悬挂 40.1 总体介绍 40.1.1 概述 存储故障&#xff08;比如存储断链&am…

卡尔曼滤波与组合导航原理(三)连续随机系统的离散化与连续时间Kalman滤波

文章目录 一、连续时间系统方程离散化1、连续时间模型2、状态转移矩阵计算3、激励噪声的等效计算4、最终离散化结论5、常见简单随机过程离散化6、实际物理信号的噪声单位 二、连续时间量测方程离散化三、连续时间Kalman滤波1、连续状态空间模型2、离散时间Kalman滤波3、增益矩阵…

自学网络安全解决问题方法

自学网络安全很容易学着学着就迷茫了&#xff0c;找到源头问题&#xff0c;解决它就可以了&#xff0c;所以首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题&#xff0c;看到后面有惊喜哦 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有几门&#xf…

《Java并发编程实战》课程笔记(十三)

并发容器 同步容器及其注意事项 Java 中的容器主要可以分为四个大类&#xff0c;分别是 List、Map、Set 和 Queue&#xff0c;但并不是所有的 Java 容器都是线程安全的。 例如&#xff0c;我们常用的 ArrayList、HashMap 就不是线程安全的。如何将非线程安全的容器变成线程安…