深入了解iommu系列三:interruptremapping底层硬件工作原理和驱动初始化解析

Linux阅码场 2022-03-10 08:00

序言

iommu系列二主要介绍了dma remapping的工作原理,这一篇我们来详细介绍一下iommu interrupt remapping 底层硬件工作原理和驱动层相关初始化流程

底层硬件工作原理

谈到中断大家可能不太会直接联想到iommu这个硬件,而事实上在虚拟化未出现之前中断的处理确实不需要iommu的参与。interrupt remapping of iommu的引入主要是为了解决虚拟化场景直通设备的中断投递问题,由于iommu的最重要的功能是dma处理,因此在interrupt  remapping enable的情况下,系统当中所有以message signal 的形式来触发的中断都是需要iommu来处理的。或者有人会问为什么是message singal interrupt(msi 或者msix)呢?因为所有的msi中断最底层的实现方式是往特定的地址(0xFEEX_XXXXh)触发一个dma write操作,iommu也是通过0xFEE 这个prefix来判断某个dma write 是否是一个中断请求。引入了iommu之后,系统当中pcie或者pci设备,ioapic,hpet(有些平台hpet是支持msi中断的)等这些设备的msi or msix中断请求都会经过iommu进行处理。

为了让大家更好的理解interrupt remapping的工作机制,我们对比一下相关设备在remapping和非remapping这两种模式下的中断投递和处理方式(这两种方式的对比都是在系统引入了iommu的背景下)。首先介绍一下ioapic,ioapic在系统硬件架构当中所处的位置如图1所示:

图1
通常情况下操作系统是通过acpi表来发现ioapic的,当然有些平台也已经支持通过pcie协议来发现ioapic,其他外设比如大部分的legacy设备的中断都是需要通过ioapic进行路由,那么不同设备的中断是如何通过ioapic投递的呢?原来ioapic维护了一个redirection table,当某个设备中断到达ioapic时,它会根据Redirection Table格式化出一个message  signal interrupt 发往相应的cpu。具体的redirection table entry的格式如下:

图2

接着我们看一下在interrupt remapping enable的场景下,ioapic的redirection table entry的格式是什么样的。

图3

通过图2和图3的对比我们能够看到一些不一样的地方,这里我们总结一下RTE在interrupt remapping 模式下新引入的一些字段说明:

  • bits 49:63 对应的是interrupt_index[14:0],bit 11对应的是interrup_index[15] 即第15位,关于这个16bits的interrupt_index后面会详细说明
  • bit 48表示是否为remapping的中断格式,所以必须要置1
  • bits 10:8 表示SHV(SubHandle Valid),强制设置为000b表示SHV不可用。关于SHV后面也会讲到 至于其他两种模式都有的字段比如vector, Trigger Mode, delivery status等需要对齐。

下面我来看一下pci或者pcie设备的msi or msix 中断在两种模式的差异点,先来看一下非remapping模式下message address 和message data的format。

图4

图5

图4和图5呈现的是在非remapping模式下msi的address和data的相关field,下面我们重点来看一下remapping模式下的address和data。

图6

对照图6还是总结一下在remapping模式下的不同点:

  • address register bit 4需要置为1,表示为interrupt remapping模式。
  • adress register bit 3 表示的是SubHandle Valid(SHV),这里强制为1即SubHandle是有效的。
  • address register bits 19:5 表示的是interrupt_index的0~14位,bit 2表示的是interrupt_index的第15位。这里的interrup_index指的是Interrupt Remapping Table Entry(IRTE) 它里面存储的是interrupt 请求的具体内容。通常情况下pci或者pcie设备一般都会使能多个这里以N来代替中断vector,也就意味着我们要为这个N 个vector分配N个连续的IRTE enteries。这里的interrup_index指的是第一个 IRTE entry,因为SHV是enable的所以后面的N-1个连续的IRTE entries是通过base的interrupt_index加上这个subhandle来寻址的。
  • 第一个 IRTE entry的data register 全部设置为0,后N-1的IRTE的data register bits 15:0 设置为subhandle。

上面讲了IRTE,讲了SHV,讲了interrupt_index,讲了subhandle,这些概念之间有什么关联?iommu硬件又是怎么使用这些信息的呢?要回答好这些问题我们还是要从最底层来看,先来看一下在interrupt remapping模式下以iommu视角看到的message signal interrupt request是什么样子的?

图7
当iommu解析出这些信息之后计算irte的索引的公式如下:
if (SHV == 0) {
 irte_index = address.handle;
else {
 irte_index = address.handle + subhandle
}

这个HANDLE等价于图6当中的interrupt_index。找到相应的irte index之后,iommu硬件就会结合相关的信息把中断delivery到相应的cpu上,具体的irte的格式如下:

图8
从图8中是不是看到了很多熟悉的field,其实就是把一些非remapping模式下的field移到了IRTE entry里面。

正常情况下iommu硬件是能够兼容interrupt remapping和非remapping这两中断请求的,下面看一下非remapping模式下的中断请求的格式。

图9
讲完了这两种不同中断模式的interrupt request 格式,下面我们来讲一下iommu硬件是如何兼容这两种中断请求的:
  • iommu硬件通过0xFEE来确认到来的dma写请求是不是一个中断请求。
  • 如果interrupt remapping没有enable(IRES 字段在Global Status Register没有置上),则中断按照Compatibility Format interrupt request来处理。
  • 如果interrupt remapping enable了即IRES在Global Status Register置位,那么中断具体处理流程如下:

    • 如果interrupt request 是compatibility format则具体处理如下:
      • 如果Extended interrupt Mode enable(Interrupt Remapping Table Address register 的EIME 字段被置上)或者Compatibility format interrupts 被disabled(Global Status register的CFIS被clear)则这个中断请求将会被block;如果上述两个条件都不成立则中断将会pass through即bypass remapping。

    • 如果interrupt request 是 remapping 格式则处理流程如下:
      • 首先检查reserved 字段是否为0,如果不为0则中断请求被block;如果为0则source-id, Handle, SHV,Subhandle将被解析出来
      • 根据解析出来的相关信息计算irte_index,如果irte_index大于interrupt remapping tables size则中断请求被block
      • 如果irte_index是一个在正常范围内的值则从interrupt remapping table或者从interrupt Entry Cache里面获取相对应的IRTE。
      • 如果IRTE存在,则iommu硬件还需要确认SVT, SID, SQ这些字段是否正确。
    • 如果IRTE的Mode field clear(即IM=0,如果IM=1则表示这个中断是post interrupt,关于pi我们下一篇再细讲)
      • iommu 硬件根据interrupt remapping 格式对IRTE进行解析,如果发现某些filed异常则该中断被block
    讲完了这些大家可能已经理解中断remapping是怎么一回事了,这个feature的重点就在 remapping 上。为什么要remapping呢?首先,通过上面的分析大家也都应该知道在非虚拟化的场景下相关设备的中断处理一定是不需要remapping的,正如前面的行文所说有个CFIS field来决定在中断remapping 功能enable的情况下如果CFIS set则就可以处理Compatibility format interrupts,具体描述如下:

    图10

    从上面的解释可以看到在interrupt remapping enabled的场景下,CFIS只有在x2apic disabled的情况下它才能起效果。但是目前主流的x86的服务器x2apic都是打开的,也就是说CFIS就是这个摆设根本用不起来。所以只要是iommu打开的场景下,相关设备的msi or msix中断一定是走中断remapping的(即使你的设备并不是直通给vm的),无形中降低了中断的处理效率。从这一点也能说明intel在设计interrup remapping的时候考虑的并不是很全面

    我们接着说虚拟化场景,如果你想把pci or pcie设备直通给虚拟机则中断remapping是必须的,原因其实也很简单:因为pcie设备在host上使能的时候其原生驱动会为其分配中断irq,那么当其直通到vm里面的时候guest os会再一次为其分配中断irq,那这两者如果要关联起来只能通过中断remapping的方式

    驱动层初始化

    中断 remapping feature的初始化是从enable_IR_x2apic 这个函数开始的,具体如下

    void __init enable_IR_x2apic(void)
    {
            unsigned long flags;
            int ret, ir_stat;

            if (skip_ioapic_setup)
                    return;

            ir_stat = irq_remapping_prepare();
            if (ir_stat < 0 && !x2apic_supported())
                    return;

            ret = save_ioapic_entries();
            if (ret) {
                    pr_info("Saving IO-APIC state failed: %d\n", ret);
                    return;
            }

            local_irq_save(flags);
            legacy_pic->mask_all();
            mask_ioapic_entries();

            /* If irq_remapping_prepare() succeeded, try to enable it */
            if (ir_stat >= 0)
                    ir_stat = try_to_enable_IR();
            /* ir_stat contains the remap mode or an error code */
            try_to_enable_x2apic(ir_stat);

            if (ir_stat < 0)
                    restore_ioapic_entries();
            legacy_pic->restore_mask();
            local_irq_restore(flags);
    }

    先说一下irq_remapping_prepare,其核心逻辑调用intel_irq_remap_osprepareintel_prepare_irq_remapping函数,接下来我们看一下这个函数的具体实现逻辑。首先会去解析dmar_table如果大家读过iommu初始化那篇文章应该是有所了解,接着会通过dmar的flag来判断是否支持interrup remapping,具体见下图中flag示意

    图11
    接着判断系统当中的ioapic是不是也都已经与enable interrupt remapping的iommu相关联起来了。然后遍历所有的iommu硬件是不是都支持irq remapping,主要是判断DMAR_ECAP_REG寄存器的bit 3是否置位如为1则说明支持irq remapping,具体如下

    图12

    然后如果系统支持x2apic则通过dmar table flag的Flags的bit 1来判断iommu硬件是否enable了x2apic(注如果这个bit被清0则表示enable了),接着遍历所有的iommu硬件通过检测图12当中的cap regsiter的EIM field是否为0(为0则表示只支持xAPIC,为1则表示直接x2APIC),如果有一个iommu硬件cap不支持EIM,则整个eim_mod也会设置为false。接下来才开始进入真正的核心逻辑

           for_each_iommu(iommu, drhd) {
                    if (intel_setup_irq_remapping(iommu)) {
                            pr_err("Failed to setup irq remapping for %s\n",
                                   iommu->name);
                            goto error;
                    }
            }

    从上面可以看到它会为每个iommu硬件来创建irq_remapping相关的信息,具体还是要分析一下intel_setup_irq_remapping这个函数。首先为每个iommu分配ir_table结构,接着创建1M大小的中断remapping table,接着创建bitmap主要是用它来管理table当中有哪些irte可用,然后再创建ir_domain和ir_msi_domain这两类中断domain,linux当中的irq domain是一个树形结构具体关系如下

    x86_vector_domain ---- 父亲
          |
        |
       ir_domain   -------- 儿子
          |
        |
       ir_msi_domain -------孙子

    接下来通过iommu_set_irq_remapping 这个函数来设置irte table的基地址

    addr = virt_to_phys((void *)iommu->ir_table->base);

    raw_spin_lock_irqsave(&iommu->register_lock, flags);
    //将ir table的基地址写到IRTA寄存器
    dmar_writeq(iommu->reg + DMAR_IRTA_REG,
                        (addr) | IR_X2APIC_MODE(mode) | INTR_REMAP_TABLE_REG_SIZE);
    //这一步的作用主是通知硬件去更新irte table的指针,避免有cache残留
    /* Set interrupt-remapping table pointer */
    writel(iommu->gcmd | DMA_GCMD_SIRTP, iommu->reg + DMAR_GCMD_REG);

    总结

    上面基本上把interrupt remapping的硬件层工作原理和软件层初始化的流程讲完了,在下面的文章当中我会详细的介绍一下interrupt remapping在虚拟化和非虚拟化这两种场景下的工作机制。


    Linux阅码场 专业的Linux技术社区和Linux操作系统学习平台,内容涉及Linux内核,Linux内存管理,Linux进程管理,Linux文件系统和IO,Linux性能调优,Linux设备驱动以及Linux虚拟化和云计算等各方各面.
    评论 (0)
    • 随着智能驾驶时代到来,汽车正转变为移动计算平台。车载AI技术对存储器提出新挑战:既要高性能,又需低功耗和车规级可靠性。贞光科技代理的紫光国芯车规级LPDDR4存储器,以其卓越性能成为国产芯片产业链中的关键一环,为智能汽车提供坚实的"记忆力"支持。作为官方授权代理商,贞光科技通过专业技术团队和完善供应链,让这款国产存储器更好地服务国内汽车厂商。本文将探讨车载AI算力需求现状及贞光科技如何通过紫光国芯LPDDR4产品满足市场需求。 车载AI算力需求激增的背景与挑战智能驾驶推动算力需求爆发式
      贞光科技 2025-05-07 16:54 128浏览
    • ‌一、高斯计的正确选择‌1、‌明确测量需求‌‌磁场类型‌:区分直流或交流磁场,选择对应仪器(如交流高斯计需支持交变磁场测量)。‌量程范围‌:根据被测磁场强度选择覆盖范围,例如地球磁场(0.3–0.5 G)或工业磁体(数百至数千高斯)。‌精度与分辨率‌:高精度场景(如科研)需选择误差低于1%的仪器,分辨率需匹配微小磁场变化检测需求。2、‌仪器类型选择‌‌手持式‌:便携性强,适合现场快速检测;‌台式‌:精度更高,适用于实验室或工业环境。‌探头类型‌:‌横向/轴向探头‌:根据磁场方向选择,轴向探头适合
      锦正茂科技 2025-05-06 11:36 376浏览
    • UNISOC Miracle Gaming奇迹手游引擎亮点:• 高帧稳帧:支持《王者荣耀》等主流手游90帧高画质模式,连续丢帧率最高降低85%;• 丝滑操控:游戏冷启动速度提升50%,《和平精英》开镜开枪操作延迟降低80%;• 极速网络:专属游戏网络引擎,使《王者荣耀》平均延迟降低80%;• 智感语音:与腾讯GVoice联合,弱网环境仍能保持清晰通话;• 超高画质:游戏画质增强、超级HDR画质、游戏超分技术,优化游戏视效。全球手游市场规模日益壮大,游戏玩家对极致体验的追求愈发苛刻。紫光展锐全新U
      紫光展锐 2025-05-07 17:07 170浏览
    • 想不到短短几年时间,华为就从“技术封锁”的持久战中突围,成功将“被卡脖子”困境扭转为科技主权的主动争夺战。众所周知,前几年技术霸权国家突然对华为发难,导致芯片供应链被强行掐断,海外市场阵地接连失守,恶意舆论如汹涌潮水,让其瞬间陷入了前所未有的困境。而最近财报显示,华为已经渡过危险期,甚至开始反击。2024年财报数据显示,华为实现全球销售收入8621亿元人民币,净利润626亿元人民币;经营活动现金流为884.17亿元,同比增长26.7%。对比来看,2024年营收同比增长22.42%,2023年为7
      用户1742991715177 2025-05-02 18:40 209浏览
    • 二位半 5线数码管的驱动方法这个2位半的7段数码管只用5个管脚驱动。如果用常规的7段+共阳/阴则需要用10个管脚。如果把每个段看成独立的灯。5个管脚来点亮,任选其中一个作为COM端时,另外4条线可以单独各控制一个灯。所以实际上最多能驱动5*4 = 20个段。但是这里会有一个小问题。如果想点亮B1,可以让第3条线(P3)置高,P4 置低,其它阳极连P3的灯对应阴极P2 P1都应置高,此时会发现C1也会点亮。实际操作时,可以把COM端线P3设置为PP输出,其它线为OD输出。就可以单独控制了。实际的驱
      southcreek 2025-05-07 15:06 184浏览
    • 2024年初,OpenAI公布的Sora AI视频生成模型,震撼了国产大模型行业。随后国产厂商集体发力视频大模型,快手发布视频生成大模型可灵,字节跳动发布豆包视频生成模型,正式打响了国内AI视频生成领域第一枪。众多企业匆忙入局,只为在这片新兴市场中抢占先机,却往往忽视了技术成熟度与应用规范的打磨。以社交平台上泛滥的 AI 伪造视频为例,全红婵家人被恶意仿冒博流量卖货,明星们也纷纷中招,刘晓庆、张馨予等均曾反馈有人在视频号上通过AI生成视频假冒她。这些伪造视频不仅严重侵犯他人权
      用户1742991715177 2025-05-05 23:08 78浏览
    • 你是不是也有在公共场合被偷看手机或笔电的经验呢?科技时代下,不少现代人的各式机密数据都在手机、平板或是笔电等可携式的3C产品上处理,若是经常性地需要在公共场合使用,不管是工作上的机密文件,或是重要的个人信息等,民众都有防窃防盗意识,为了避免他人窥探内容,都会选择使用「防窥保护贴片」,以防止数据外泄。现今市面上「防窥保护贴」、「防窥片」、「屏幕防窥膜」等产品就是这种目的下产物 (以下简称防窥片)!防窥片功能与常见问题解析首先,防窥片最主要的功能就是用来防止他人窥视屏幕上的隐私信息,它是利用百叶窗的
      百佳泰测试实验室 2025-04-30 13:28 638浏览
    • 浪潮之上:智能时代的觉醒    近日参加了一场课题的答辩,这是医疗人工智能揭榜挂帅的国家项目的地区考场,参与者众多,围绕着医疗健康的主题,八仙过海各显神通,百花齐放。   中国大地正在发生着激动人心的场景:深圳前海深港人工智能算力中心高速运转的液冷服务器,武汉马路上自动驾驶出租车穿行的智慧道路,机器人参与北京的马拉松竞赛。从中央到地方,人工智能相关政策和消息如雨后春笋般不断出台,数字中国的建设图景正在智能浪潮中徐徐展开,战略布局如同围棋
      广州铁金刚 2025-04-30 15:24 375浏览
    • 多功能电锅长什么样子,主视图如下图所示。侧视图如下图所示。型号JZ-18A,额定功率600W,额定电压220V,产自潮州市潮安区彩塘镇精致电子配件厂,铭牌如下图所示。有两颗螺丝固定底盖,找到合适的工具,拆开底盖如下图所示。可见和大部分市场的加热锅一样的工作原理,手绘原理图,根据原理图进一步理解和分析。F1为保险,250V/10A,185℃,CPGXLD 250V10A TF185℃ RY 是一款温度保险丝,额定电压是250V,额定电流是10A,动作温度是185℃。CPGXLD是温度保险丝电器元件
      liweicheng 2025-05-05 18:36 253浏览
    • 文/郭楚妤编辑/cc孙聪颖‍相较于一众措辞谨慎、毫无掌舵者个人风格的上市公司财报,利亚德的财报显得尤为另类。利亚德光电集团成立于1995年,是一家以LED显示、液晶显示产品设计、生产、销售及服务为主业的高新技术企业。自2016年年报起,无论业绩优劣,董事长李军每年都会在财报末尾附上一首七言打油诗,抒发其对公司当年业绩的感悟。从“三年翻番顺大势”“智能显示我第一”“披荆斩棘幸从容”等词句中,不难窥见李军的雄心壮志。2012年,利亚德(300296.SZ)在深交所创业板上市。成立以来,该公司在细分领
      华尔街科技眼 2025-05-07 19:25 117浏览
    • 某国产固态电解的2次和3次谐波失真相当好,值得一试。(仅供参考)现在国产固态电解的性能跟上来了,值得一试。当然不是随便搞低端的那种。电容器对音质的影响_电子基础-面包板社区  https://mbb.eet-china.com/forum/topic/150182_1_1.html (右键复制链接打开)电容器对音质的影响相当大。电容器在音频系统中的角色不可忽视,它们能够调整系统增益、提供合适的偏置、抑制电源噪声并隔离直流成分。然而,在便携式设备中,由于空间、成本的限
      bruce小肥羊 2025-05-04 18:14 231浏览
    • 5小时自学修好BIOS卡住问题  更换硬盘故障现象:f2、f12均失效,只有ESC和开关机键可用。错误页面:经过AI的故障截图询问,确定是机体内灰尘太多,和硬盘损坏造成,开机卡在BIOS。经过亲手拆螺丝和壳体、排线,跟换了新的2.5寸硬盘,故障排除。理论依据:以下是针对“5小时自学修好BIOS卡住问题+更换硬盘”的综合性解决方案,结合硬件操作和BIOS设置调整,分步骤说明:一、判断BIOS卡住的原因1. 初步排查     拔掉多余硬件:断开所有外接设备(如
      丙丁先生 2025-05-04 09:14 118浏览
    我要评论
    0
    2
    点击右上角,分享到朋友圈 我知道啦
    请使用浏览器分享功能 我知道啦