当前位置: 首页 > news >正文

中断控制器介绍-软件篇(linux)

软件框架

  1. CPU arch layer:具体cpu架构相关的中断处理部分,比如arm的异常向量表机制

  2. IRQ chip driver:具体的中断控制器驱动,比如arm gicv3驱动,与gic的寄存器交互

  3. IRQ subsystem:kernel的中断子系统,主要包括cpu、中断控制器无关的核心处理逻辑,包括中断处理流程,中断号映射管理,中断线程化以及各类中断的申请与释放

  4. Device driver:通用外设驱动,使用irq subsystem提供的api来使用中断相关功能

数据结构

  1. irq_domain

hwirq是中断控制器自己内部的编号,一个中断控制器一般一个中断域,也可以多个

swirq是linux系统全局唯一的软件编号,可以映射为irq domain + hwirq的组合

  1. irq_desc

irq_desc 与 irq 一一对应,包含了描述信息,有个全局的radix tree描述这个信息

  1. irq_chip

  1. irq_data

  1. irqaction

这里的irq是linux内部的全局软件中断号,void * dev_id可以自定义传参

  1. 连接关系

其中irq_domain、irq_domain_ops、irq_chip为per irq domain 的数据,其他的都是per irq的数据

allocated_irqs作为软件中断号为索引的全局数组来表示中断号的分配情况

irq_desc有两种组织方式

CONFIG_SPARSE_IRQ = y

  • 稀疏分配模式

  • irq_desc 不是全局大数组,而是动态按需分配,放在 (irq_desc_tree) 里。

  • 空间占用更小,特别适合有 上万个潜在中断号 的系统(如 ARM64 GICv3/ITS,PCIe MSI/MSI-X)。

mtree = multi-order radix tree,是内核中 lib/maple_tree.c 提供的数据结构。

它比 radix tree 更高效,支持批量分配/释放,后来也被应用在 vma 管理上(取代 rbtree)。

在 IRQ 子系统里,sparse_irqs 就是一个 maple tree 根节点,用来存放稀疏分配的 irq_desc

!CONFIG_SPARSE_IRQ(即没有开启这个选项)

  • 紧凑分配模式

  • 内核在启动时直接分配一个 irq_desc[NR_IRQS] 全局数组。

  • 每个中断号都对应一个固定的 slot。

  • 查找快(直接数组索引),但浪费内存。

中断注册

整体流程就是将中断相关数据结构关联完成

  1. DTS node中的 interrupts 属性,例如 interrupts = <GIC_SPI 637 IRQ_TYPE_LEVEL_HIGH 0>;

  2. GICv3 驱动初始化,创建了 GIC 的 irqdomain

  3. 软件驱动中调用platform_get_irq

    1. 从 allocated_irqs bitmap 中申请 irq,然后申请 irq_desc,将两者关联并且插入到 irq_desc_tree

    2. 调用 gic irq domain 的 alloc 函数,将 hwirq 和 irq_data 插入到 irq_domain 的 revmap_tree,完成 hwirq 到 irq_desc 关联(通过 irq_data 外包结构体 irq_desc 找到)

  4. 软件驱动中调用request_irq/request_threaded_irq:

    1. 将软件关心的 handler/thread_fn 更新到 irqaction (irq_desc的子模块)

中断处理

  1. 外设发生中断,报到 GIC 后,满足上报条件,则 GIC 上报 IRQ 给 CPU;

  2. CPU 进入异常处理,执行 IRQ 异常向量表:

    1. 上下文保存

    2. 调用中断处理器注册的处理函数

    3. GICv3 初始化时设置为了 gic_handle_irq

    4. 这就是中断处理的 C 语言接口

  3. 读取 GIC IAR 寄存器获取 hwirq;

  4. 通过 GIC irq domain 找到该 hwirq 对应的 irqdata

  5. 通过 container_of 找到 irqdata 外包的 irq_desc

  6. 调用 irq_desc 中记录的 irq_action 中的 handle 与 thread_fn

http://www.dtcms.com/a/432193.html

相关文章:

  • 怎么学做淘宝免费视频网站wordpress 主机安装
  • 社区类网站建设的例子四川建设厅官方网站四库一平台
  • 【PID学习】PID算法改进
  • 引流推广app网站改版对seo影响
  • 南京代做网站h5编辑器有哪些软件
  • 在Zotero中配置PDF2zh插件并使用详细教程
  • 做图有什么网站河池市民政局门户网站建设
  • 10大免费软件下载网站wordpress模板克隆
  • MASM数据段完全指南:从基础定义到高级内存操作
  • 提供视频下载的网站做学术用的网站
  • 官方网站建设实训心得网站seo优化主要有哪些手段
  • 17.仅使用 CSS 实现的导航标签页,带滑动菜单指示器
  • 【LeetCode 每日一题】1470. 重新排列数组——(解法一)构造数组
  • 商城网站合同设计公司网站需要考虑什么
  • 银川建设网站简约的网页设计
  • 【人工智能通识专栏】第三十二讲:本地化部署模型
  • 网站怎么加关键词深圳网站建设公司小江
  • 网站开发人员介绍做网站首页看不到图片
  • ORB_SLAM2原理及代码解析:MapPoint::AddObservation() 函数
  • 炉石做任务抽奖网站装宽带一年大概需要多少钱
  • 个人网站建立 学生哈尔滨学校网站建设
  • 网站用什么软件做败sp个人网站app
  • 适合建设网站的国外服务器晋城市网站建设
  • 西安做商铺的网站网站设计公司费用
  • 专业做胶粘剂招聘网站华为云网站定制
  • 企业建站系统费用全站搜索
  • 做装饰网站公司wordpress plugins
  • 龙岗网站建设开发设计公司深圳建筑网站
  • 用空间做网站如何做好安全广州建设银行分行招聘网站
  • 公司做的网站费用如何做账wordpress 积分动力