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

[IOMMU]面向芯片/SoC验证工程的IOMMU全景速览

面向芯片/SoC验证工程的IOMMU全景速览

       摘要:面向芯片/SoC 验证工程的 IOMMU 全景速览:包含基础概念、主流架构要点(ARM SMMU、Intel VT‑d、RISC‑V IOMMU),Linux 软件栈关系,SoC 上的验证方法(功能、错误、性能、系统化流程和覆盖),以及一个可用的“通用 IOMMU C 参考模型”(便于接入 UVM/系统级仿真做对比/记分)。

一、IOMMU 是什么,解决什么问题

  • 作用

    • DMA 虚实地址转换:把设备发出的 IOVA(IO 虚拟地址)转换为物理地址(PA)或中间物理地址(IPA),并施加权限检查(R/W/X)与内存属性。
    • 隔离与安全:把设备划入不同隔离域(domain),防御恶意/越界 DMA。
    • 虚拟化:两阶段翻译(Stage‑1/Stage‑2),支撑来宾 OS(S1)和宿主/管理程序(S2)共管地址空间。
    • SVA(Shared Virtual Addressing):设备和进程共享同一虚拟地址空间,通常通过 PASID 识别进程上下文。
    • 端到端地址服务:配合 PCIe ATS/PRI/PASID,降低 IOTLB 缺失开销,支持按进程页请求。
    • 中断重映射:将设备发出的 MSI/MSI‑X 重定向到平台中断控制器,施加隔离。
  • 关键术语

    • IOVA/GVA/IPA/PA:设备看到的虚拟地址/进程虚拟地址/中间物理/最终物理地址。
    • RID/BDF、Stream ID/SSID、PASID:识别设备或其子流(substream/进程)的标识。
    • Domain/Context:一组设备共享的地址空间与权限配置。
    • IOTLB/ATC:IOMMU 侧 TLB/设备侧地址转换缓存(PCIe ATS)。
    • ATS/PRI:Address Translation Service / Page Request Interface(设备在缺页时向主机申请映射)。
    • TLBI/Sync:IOMMU TLB 失效与屏障,同步页表更新的可见性。

二、主流架构速记

  • ARM SMMU

    • v2:以 Stream ID 映射到 Context Bank;支持 S1/S2;典型 AXI 接口。
    • v3:面向 PCIe 原生生态,Stream Table Entry(STE)→ Context Descriptor Table(CD);支持 PASID/SSID、ATS/PRI、命令队列(CMDQ)、事件队列(EVTQ)、PRI 队列(PRIQ)与 MSI doorbell;TLB 失效与 CMD_SYNC 时序保证。
    • 页表格式与权限模型近似 ARMv8 VMSA;叶子/块映射(4K/2M/1G)。
  • Intel VT‑d(DMA Remapping)

    • Root/Context/PASID 表层次,支持 Scalable Mode、Device‑TLB、Posted Interrupts、基于队列的失效指令与事件上报。
    • 可与 PCIe ATS/PRI 协同,隔离粒度到函数级(RID)或 PASID。
  • RISC‑V IOMMU(1.0 规范背景)

    • 与 Sv39/Sv48 协作的两阶段翻译;PASID/SVA;设备页请求与错误上报机制;属性/权限对齐 RISC‑V MMU 语义。

三、Linux 软件栈与调试要点

  • iommu 子系统:iommu‑api、iommu‑groups、domains、attach/detach。
  • 驱动:arm_smmu/arm_smmu_v3、intel‑iommu、riscv‑iommu。
  • VFIO/virtio‑iommu、DMA‑API(dma_map_*)、SVA(绑定 PASID 到 mm)。
  • 调试:dmesg 的 IOMMU faults、debugfs/sysfs(如 arm_smmu_v3 下的 cmdq/evtq 统计)、perf/ftrace 采样缺页/失效路径。

四、SoC 上验证 IOMMU 的方法

4.1 环境搭建(建议)

  • 事务源
    • PCIe 设备 BFMs/Agent(含 ATS/PRI/PASID 能力,或 AXI 主设备代理)。
    • 多主并发:不同 RID/StreamID/SSID/PASID。
  • 内存/页表
    • 可编程 DRAM 模型,暴露页表区域;提供“OS 代理”驱动页表更新、IOMMU 命令队列写入和 TLBI。
  • 监测与对比
    • 总线监测:AXI/PCIe Monitor 获取 IOVA 事务与 IOMMU 翻译后的 PA 事务。
    • 参考模型:C Model 做期望翻译;Scoreboard 比对,记录属性/权限/错误一致性。
    • 队列/中断监测:CMDQ/EVTQ/PRIQ 的内存写入与 doorbell MSI;中断控制器接收情况。

4.2 典型功能用例与覆盖点

  • 翻译成功路径
    • 页尺寸:4K/2M/1G(或平台支持的所有块/页);跨页/跨块连续与非连续;边界对齐/非对齐突发。
    • 权限:R/W/X 组合;设备特权/非特权;不可缓存/可缓存、内存类型/可共享性传播。
    • Stage‑1/Stage‑2 各自启停与组合;直通/旁路模式。
  • 错误/异常
    • 不存在页(PTE invalid)、权限拒绝、访问超范围、页表对齐错误、页表循环/保留位错误、长度超页、设备未配置 Context。
    • PRI/ATS 路径:ATC 命中/未命中;PRI 请求、完成;设备在 IOMMU PRIQ 背压/溢出处理。
    • 事件/故障上报:队列满、队列指针错误、doorbell 丢失、MSI 映射错误。
http://www.dtcms.com/a/323657.html

相关文章:

  • FMS 2025存储峰会获奖技术全景解读
  • 【linux基础】Linux命令提示符解析与操作指南
  • c++ 容器vector基础
  • 北斗变形监测技术应用与案例解析
  • RK3568 U盘/TF卡镜像更新
  • Mysql笔记-系统变量\用户变量管理
  • 学习嵌入式第二十四天
  • 【Python 语法糖小火锅 · 第 1 涮】
  • Vulnhub----Beelzebub靶场
  • 每周算法思考:栈与队列
  • 使用lightGCN完整训练用户 + 商品向量的 3 步指南
  • 在JVM调优时,你关注哪些指标?
  • 裸露土堆识别准确率↑32%:陌讯多模态融合算法实战解析
  • 20250808组题总结
  • C++11中的移动语义
  • Python训练营打卡Day27-类的定义和方法
  • 【后端】Java Stream API 介绍
  • C++11 ---- 线程库
  • 机器学习(西瓜书)学习——绪论
  • 编译技术的两条演化支线:从前端 UI 框架到底层编译器的智能测试
  • 通过MQTT实现OTA升级方案
  • Linux-Redhat9.5静默安装Oracle19.25单实例教程【参照官方文档,超级详细】
  • 【35】C#实战篇——StopRecordingTimer_Tick事件函数中,解绑函数自己,那么该函数会立即结束吗?还会继续执行该函数中剩余部分吗?
  • windows、linux应急响应入侵排查
  • Oracle数据库重启后打开异常状态的检查步骤
  • 模拟人脑处理文本——从分句到分词,从段落到时间线叙事
  • MySQL时间类型
  • windows上LM-Studio下载安装教程
  • 谷歌搜索 sg_ss 逆向分析
  • 自闭和标签形式(self-closing tags)和标准标签形式