在 RISC-V 的 AIA(高级中断架构)与 IOMMU 规范体系中,MRIF 全称为 Memory-Resident Interrupt File(内存驻留中断文件) 。它是为了突破物理 IMSIC(入站消息信号中断控制器)硬件 Guest 中断文件数量限制,而定义的一种普通内存中的数据结构,用于在虚拟化场景下接收和暂存设备发来的 MSI(消息信号中断)。
核心定位与解决的问题
在没有 MRIF 时,直通设备发往虚拟机(Guest)的 MSI,必须由 IOMMU 直接翻译成对物理 IMSIC Guest 中断文件 的写入。而单核 RISC-V 的 Guest 中断文件数量受 GEILEN参数限制(RV64 最多 63 个),这限制了系统能同时给活跃虚拟机直接分配硬件中断文件的规模。
MRIF 的引入允许 Hypervisor 将"非活跃/空闲虚拟机"的中断文件**换出到普通内存(MRIF 结构)**中:
-
IOMMU 在 MSI 地址转换时,通过查 MSI 页表(MSI PTE 配置为 MRIF 模式),不再转发到 IMSIC 硬件,而是直接在内存的 MRIF 结构中设置中断挂起位。
-
IOMMU 随后向 Hypervisor 发送一条"通知 MSI(Notice MSI)",由 Hypervisor 软件检查 MRIF 状态,决定是否唤醒/调度对应虚拟机,并在恢复执行前将 MRIF 状态迁回物理 IMSIC Guest 中断文件。
MRIF 数据结构规范
根据 RISC-V AIA 规范定义,一个 MRIF 有严格的布局要求:
-
大小与对齐 :固定 512 字节 ,且必须 512 字节自然对齐。
-
字节序 :所有双字(Doubleword)均采用 **小端序(Little-Endian)** 存储(即便系统 Hart 是大端,也需通过 REV8 等指令转换处理)。
-
内部结构:由 32 对 64 位双字(共 64 个双字)组成。每对双字分别对应一组(64 个)中断身份的:
-
**中断挂起位(eip, interrupt-pending bits)** ------ 偶数偏移双字。
-
**中断使能位(eie, interrupt-enable bits)** ------ 奇数偏移双字。
-
具体内存布局(偏移示例):
-
0x000(8 字节):中断 ID 1~63 的挂起位 (eip) -
0x008(8 字节):中断 ID 1~63 的使能位 (eie) -
0x010(8 字节):中断 ID 64~127 的挂起位 -
0x018(8 字节):中断 ID 64~127 的使能位 -
......依此类推,直到偏移
0x1F8覆盖中断 ID 1984~2047。 -
注:位 0 对应不存在的中断 ID 0,通常为伪位,不被硬件使用。
IOMMU MSI PTE 中的 MRIF 模式
IOMMU 的 MSI 页表项(MSI PTE)可配置为 MRIF 模式(模式字段 M=1,V=1,C=0),其格式规范定义了两个 64 位双字:
-
第一个双字 :包含有效位 V、模式 M=1、以及 MRIF 地址的 [55:9] 位(因为 MRIF 512 字节对齐,低 9 位恒为 0)。
-
第二个双字 :包含 通知 MSI 的物理页号(NPPN) 和 通知中断 ID(NID,共 11 位) ,用于 IOMMU 写完 MRIF 后,向 Hypervisor 发送通知 MSI(写入地址
NPPN << 12,数据为 NID 零扩展到 32 位)。
IOMMU 对 MRIF 的更新与支持级别
当设备发起 MSI 且目标被 IOMMU 匹配到 MRIF 模式 PTE 时:
-
校验:IOMMU 检查写入是否为 32 位、4 字节对齐、数据高 21 位(D[31:11])为 0(低 11 位视为中断身份 ID)。
-
更新 MRIF 挂起位:
-
带原子更新(Atomic Update) :IOMMU 使用 **AMOOR(原子或操作)** 指令在内存中设置对应挂起位,效率最高,支持 Hypervisor 并发操作。
-
无原子更新(Basic/Non-Atomic):使用普通的"读-修改-写回"序列,可能需要 Hypervisor 配合分配多 MRIF 避免竞争。
-
无 MRIF 支持:IOMMU 不支持此功能,只能走标准 IMSIC Guest 文件转发。
-
-
发送通知 MSI:MRIF 更新可见后,IOMMU 自动向 Hypervisor 发送 Notice MSI。
与先前上下文的关联
结合你之前关注的 RISC-V IOMMU、DC(设备上下文)以及 RAS/Linux 内核调用链:
-
MRIF 是 IOMMU MSI 重定向 的关键后端结构,配置信息通常由 Hypervisor 填充,并通过 IOMMU 的 DC(Device Context)里的 MSI 页表指针 间接引用。
-
在 Linux 内核的
riscv-iommu驱动及 VFIO 直通路径中,MRIF 的分配、MSI PTE 的配置(切 MRIF 模式)、以及接收到 Notice MSI 后的riscv_ras_handler或中断处理回调里检查 MRIF/eip 状态、触发 vCPU 唤醒等,是虚拟化 I/O 中断注入的重点处理逻辑。
简单来说,MRIF 就是 IOMMU + 虚拟化场景下,用"内存结构 + Hypervisor 软件干预"替代"有限硬件中断文件",从而支撑海量空闲虚拟机设备 MSI 接收的一套规范定义。