背景介绍:

IRQ域层级结构:

在某些架构上,可能有多个中断控制器参与将一个中断从设备传送到目标CPU。

让我们来看看x86平台上典型的中断传递路径吧

Device --> IOAPIC -> Interrupt remapping Controller -> Local APIC -> CPU

涉及到的中断控制器有三个:

  1. IOAPIC 控制器
  2. 中断重映射控制器
  3. Local APIC 控制器

如果是之前就对x86的中断控制器比较熟悉的同学,并且细心的话,会发现我们将 中断重映射控制器 的顺序排在了 Local APIC 控制器 之前。

为了支持这样的硬件拓扑结构,使软件架构与硬件架构相匹配,为每个中断控制器建立一

个irq_domain数据结构,并将这些irq_domain组织成层次结构。linux中断处理子系统有两个很重要的概念就是irq_chip和irq_domain,IOMMU为了支持interrupt remapping也增加了这两个东西。

理解这点非常重要,irq_remap 模块必须按照irq 的子系统方式来实现 irq_chip 和irq_domain.

在建立irq_domain层次结构时,靠近设备的irq_domain为子域,靠近CPU的

irq_domain为父域。所以在上面的例子中,将建立如下的层次结构。

::

    CPU Vector irq_domain (root irq_domain to manage CPU vectors)
^
|
Interrupt Remapping irq_domain (manage irq_remapping entries)
^
|
IOAPIC irq_domain (manage IOAPIC delivery entries/pins)

使用irq_domain层次结构的主要接口有四个:

  1. irq_domain_alloc_irqs(): 分配IRQ描述符和与中断控制器相关的资源来传递这些中断。
  2. irq_domain_free_irqs(): 释放IRQ描述符和与这些中断相关的中断控制器资源。
  3. irq_domain_activate_irq(): 激活中断控制器硬件以传递中断。
  4. irq_domain_deactivate_irq(): 停用中断控制器硬件,停止传递中断。

为了支持irq_domain层次结构,需要做如下修改:

  1. 一个新的字段 'parent' 被添加到irq_domain结构中;它用于维护irq_domain的层次信息。
  2. 一个新的字段 'parent_data' 被添加到irq_data结构中;它用于建立层次结构irq_data以

    匹配irq_domain层次结构。irq_data用于存储irq_domain指针和硬件irq号。
  3. 新的回调被添加到irq_domain_ops结构中,以支持层次结构的irq_domain操作。

在支持分层irq_domain和分层irq_data准备就绪后,为每个中断控制器建立一个irq_domain结

构,并为每个与IRQ相关联的irq_domain分配一个irq_data结构。现在我们可以再进一步支持堆

栈式(层次结构)的irq_chip。也就是说,一个irq_chip与层次结构中的每个irq_data相关联。

一个子irq_chip可以自己或通过与它的父irq_chip合作来实现一个所需的操作。

通过堆栈式的irq_chip,中断控制器驱动只需要处理自己管理的硬件,在需要的时候可以向其父

irq_chip请求服务。所以我们可以实现更简洁的软件架构。

为了让中断控制器驱动程序支持irq_domain层次结构,它需要做到以下几点:

  1. 实现 irq_domain_ops.alloc 和 irq_domain_ops.free
  2. 可选择地实现 irq_domain_ops.activate 和 irq_domain_ops.deactivate.
  3. 可选择地实现一个irq_chip来管理中断控制器硬件。
  4. 不需要实现irq_domain_ops.map和irq_domain_ops.unmap,它们在层次结构

    irq_domain中是不用的。

irq_domain层次结构绝不是x86特有的,大量用于支持其他架构,如ARM、ARM64等。

ir 模块,ir就是interrupt remapping的简写,下同。

//caq:既然是中断ir,那么既要完成irq_domain_ops的实现,又要完成irq_chip的实现,如同背景介绍单元
static struct irq_chip intel_ir_chip = {
.name = "INTEL-IR",
.irq_ack = apic_ack_irq,
.irq_set_affinity = intel_ir_set_affinity,//caq:ir 对irq_chip只实现了部分函数
.irq_compose_msi_msg = intel_ir_compose_msi_msg,
.irq_set_vcpu_affinity = intel_ir_set_vcpu_affinity,
};

而irq_domain的实现如下:

//caq:主要完成irq_domain相关的ops操作
static const struct irq_domain_ops intel_ir_domain_ops = {
.alloc = intel_irq_remapping_alloc,//caq:在某个irq_domain中申请一段irqs
.free = intel_irq_remapping_free,
.activate = intel_irq_remapping_activate,
.deactivate = intel_irq_remapping_deactivate,
};

kvm的物理中断号来自于vfio,vfio_msi_set_vector_signal向系统申请物理中断号,传递给kvm,当外设触发中断后,

IOMMU先处理,再给vcpu所在的物理cpu发起一个物理中断,物理cpu从not-root exit出来,

vfio的vfio_msihandler进行中断处理,通过eventfd给kvm一个信号,

kvm更新VMCS中虚拟中断字段,物理cpu重新enter non-root模式把虚拟中断中断注入。

Interrupt Posting是在Interrupt Remapping的基础上进一步提升了直通设备的中断处理效率,使用Posting模式时,

vcpu可以直接在non-root模式下处理中断而不会被vm-exit到宿主机。

struct pi_desc {
u32 pir[8];//caq:每个bit代表一个vector,一共表示32*8个vector,posting哪个vector,对应bit就置1
union {
struct {
u16 on : 1;//caq:有中断Posting事件
u16 sn : 1;//caq:非紧急中断,是否要立即通知
u16 rsvd_1 : 14;
u8 nv;//caq:nv的值为如下两个
//#define POSTED_INTR_VECTOR 0xf2//caq:当前vcpu正在执行
#define POSTED_INTR_WAKEUP_VECTOR 0xf1//caq:当前vcpu是休眠状态,硬件通知的中断是通知的vcpu所在的物理cpu,物理cpu收到中断事件后需要唤醒vcpu。
u8 rsvd_2;
u32 ndst;
};
u64 control;
};
u32 rsvd[6];
}
SIZE: 64

中断虚拟化的芯片发展路径可以看做:

1、8259虚拟实现,pic/apic虚拟实现,msi/msix的虚拟实现

伴随着的是,用户空间实现中断虚拟化,kvm实现中断虚拟化,最后是在硬件层面实现中断虚拟化。(也就是virtual apic page 来替代 apic-access page 的过程)

调试功能:

打开CONFIG_GENERIC_IRQ_DEBUGFS,可让IRQ子系统的大部分内部结构都在debugfs中暴露出来。

参考资料《Documentation/translations/zh_CN/core-api/irq/irq-domain.rst》

iommu分析之---intel irq remap框架实现的更多相关文章

  1. iommu分析之---intel iommu初始化

    intel 的iommu 是iommu框架的一个实现案例. 由于intel 的iommu 实现得比arm smmv3复杂得多,里面概念也多,所以针对intel 实现的iommu 案例的初始化部分进行一 ...

  2. iommu分析之---DMA remap框架实现

    本文主要介绍iommu的框架.基于4.19.204内核 IOMMU核心框架是管理IOMMU设备的一个通过框架,IOMMU设备通过实现特定的回调函数并将自身注册到IOMMU核心框架中,以此通过IOMMU ...

  3. 【市场调研与分析】Intel发力移动安全领域——By Me at 20140613

                                                    [市场调研与分析]Intel发力移动安全领域                               ...

  4. b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释

    继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更新页面显示状态这种方式在运作的,从若干年前简单的ajax流行起来 ...

  5. motan源码分析三:与spring框架的结合

    在本文第一章,分析的demo中使用了代码加载的方式加载了相关的类,但在我们的实际工作中,使用spring来加载相关的类的情况会更多,本文将分析一下motan是如何与spring一起协同工作的,主要的原 ...

  6. Android源码分析(三)-----系统框架设计思想

    一 : 术在内而道在外 Android系统的精髓在源码之外,而不在源码之内,代码只是一种实现人类思想的工具,仅此而已...... 近来发现很多关于Android文章都是以源码的方向入手分析Androi ...

  7. 源码分析系列 | 从零开始写MVC框架

    1. 前言 2. 为什么要自己手写框架 3. 简单MVC框架设计思路 4. 课程目标 5. 编码实战 5.1 配置阶段 web.xml配置 config.properties 自定义注解 5.2 初始 ...

  8. 模块化系列教程 | 深入源码分析阿里JarsLink1.0模块化框架

    1. 概述 1.1 模块动态加载卸载主流程 2. 模块动态加载 2.1 模块加载源码分析 2.1.1 AbstractModuleRefreshScheduler 2.1.2 ModuleLoader ...

  9. LCD驱动分析(一)字符设备驱动框架分析

    参考:S3C2440 LCD驱动(FrameBuffer)实例开发<一>   S3C2440 LCD驱动(FrameBuffer)实例开发<二> LCD驱动也是字符设备驱动,也 ...

随机推荐

  1. DAST 黑盒漏洞扫描器 第二篇:规则篇

    0X01 前言 怎么衡量一个扫描器的好坏,扫描覆盖率高.扫描快.扫描过程安全 而最直接的效果就是扫描覆盖率高(扫的全) 怎么扫描全面,1 流量全面 2 规则漏报低 流量方面上篇已经讲过,这篇主要讲扫描 ...

  2. Fiddler对安卓高版本进行抓包解决方案以及分析 进阶二

    今天是2021年的最后一天了,多分享一些干货吧!看过上一章节教程后会有同学疑惑,我也一步一个脚印的,跟着流程走也设置了代理以及安装了证书,有的同学会发现 为什么手机不能够连接网络了呢?细心一点的同学会 ...

  3. 如何在Uniapp中访问CabloyJS后端API管理系统

    介绍 CabloyJS是一款免费开源的NodeJS全栈开发框架,采用前后端分离设计,具备开箱即用的后台管理系统 Cabloy-SDK是专门为Uniapp应用量身定制的前端SDK,用于便捷的访问Cabl ...

  4. CabloyJS全栈开发之旅(1):NodeJS后端编译打包全攻略

    背景 毋庸置疑,NodeJS全栈开发包括NodeJS在前端的应用,也包括NodeJS在后端的应用.CabloyJS前端采用Vue+Framework7,采用Webpack进行打包.CabloyJS后端 ...

  5. electron-vue 项目启动动态获取配置文件中的后端服务地址

    前言 最近的项目迭代中新增一个需求,需要在electron-vue 项目打包之后,启动exe 可执行程序的时候,动态获取配置文件中的 baseUrl 作为服务端的地址.electron 可以使用 no ...

  6. SAP 动态选择屏幕实例

    DATA:BEGIN OF gs_sel, werks TYPE marc-werks, "工厂 matnr TYPE mara-matnr, "物料 mtart TYPE mar ...

  7. Moriis神级遍历!

    Moriis 遍历 Morris 遍历是二叉树遍历的一种方式,传统的递归和非递归遍历的时间复杂的都是O(N),空间复杂度都是O(h)(h为树的高度),而 Morris 遍历可以做到时间复杂的依然为 O ...

  8. python基础教程:__call__用法

    __call__可以使得方法变成可被调用对象:(PS:python中的方法和普通函数有点区别:方法的第一个参数是类实例) 允许一个类的实例像函数一样被调用.实质上说,这意味着 x() 与 x.call ...

  9. 浅议.NET遗留应用改造

    浅议.NET遗留应用改造 TLDR:本文介绍了遗留应用改造中的一些常见问题,并对改造所能开展的目标.原则.策略进行了概述. 一.背景概述 1.概述 或许仅"遗留应用"这个标题就比较 ...

  10. # Vue3 setup 函数

    Vue3 setup 函数 vue2 和 vue3 开发的区别 首先,目前来说 vue3 发布已经有一段时间了,但是呢,由于还处于优化完善阶段,对于 vue3 开发项目的需求不是很高,主要还是以 vu ...