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

MMIO、IOMAP 和 IOMMU 总结

MMIO、IOMAP 和 IOMMU 全面解析

📌 本文将深入浅出地梳理 Linux 驱动开发中常见的三大术语:MMIO、iomap、IOMMU。它们看似相似,其实职责完全不同,是理解 SoC 系统架构、DMA 安全性和驱动开发的基础。

一、MMIO(Memory-Mapped I/O)

定义:

MMIO 是将外设的寄存器映射到内存地址空间中的一种机制,使得 CPU 可以像读写内存一样访问硬件寄存器。

特点:

  • 地址固定,由硬件在 SoC 设计时分配(如 0xF000_0000)

  • 访问方式为普通内存操作(load/store

  • 对于 CPU 而言:访问的是虚拟地址,但最终会映射到 MMIO 的物理地址

Linux 中使用方式:

void __iomem *base = ioremap(0xF9000000, 0x1000);
writel(0x01, base + 0x04);   // 写寄存器

二、iomap(或 ioremap)

定义:

ioremap() 是 Linux 内核提供的一个函数,用于将 MMIO 物理地址映射到内核虚拟地址空间,让驱动能用指针读写设备寄存器。

注意:

  • 它并不是内核页表的一部分(无法被用户态访问)

  • 一般只在内核驱动中使用

  • 返回值是 __iomem 类型,强调它是特殊内存(不可随便 deref)

使用流程:

  1. 从设备树中读取 reg(物理地址)

  2. 调用 ioremap()

  3. 使用 readl()/writel() 操作寄存器

  4. 使用完后 iounmap()


三、IOMMU(I/O Memory Management Unit)

定义:

IOMMU 是为设备提供地址转换的 MMU,作用是在设备访问内存(DMA)时,将其使用的虚拟地址(IOVA)翻译为实际的物理地址(PA)。

和 MMU 类似:

  • CPU 使用虚拟地址 → MMU → 物理地址

  • 设备使用 IOVA → IOMMU → 物理地址

好处:

  • 安全隔离(防止 DMA 越界)

  • 虚拟地址空间抽象(方便设备驱动管理 buffer)

  • 支持虚拟化(guest VM 可以有独立 IOVA)


四者关系与对比

特性MMIOiomap / ioremapIOMMU
涉及角色CPU 访问设备寄存器CPU 访问寄存器的方式设备访问内存的 MMU
管理对象寄存器地址(物理)虚拟地址 ←→ MMIO 映射IOVA ←→ RAM地址
是否在设备树✅ reg 字段✅ 用 reg 映射✅ stream-id/domain
是否需驱动调用❌ 自动决定✅ 手动 ioremap✅ DMA 调用会启用
是否用于 DMA❌ 否❌ 否✅ 是

示例场景:ISP 拍照设备

CPU → 配置 ISP 控制寄存器(0xF900_0000)↑ ioremap(iomap)
ISP → 把拍到的图像写入 DDR(0x12340000 IOVA)↑ 通过 IOMMU 做地址转换 → 实际写入物理内存
  • 寄存器访问用 MMIO + iomap

  • 内存访问(DMA)用 IOMMU


图示建议

   CPU          ←─(ioremap)────→ MMIO(设备寄存器)│                               ↑│                               ││           控制设备             │↓                               │DDR(内存) ←────(IOMMU)────← DMA ← 设备(ISP/VPU)

http://www.xdnf.cn/news/953.html

相关文章:

  • 【Easylive】使用Seata解决分布式事务问题
  • Android 中实现 GIF 图片动画
  • three.js中的instancedMesh类优化渲染多个同网格材质的模型
  • 《AI大模型应知应会100篇》第31篇:大模型重塑教育:从智能助教到学习革命的实践探索
  • 【大数据、数据开发与数据分析面试题汇总(含答案)】
  • langchain +ollama +chroma+embedding模型实现RAG入门级Demo(python版)
  • 量化交易 - RSRS(阻力支撑相对强度)- 正确用法 - 年均收益18%
  • EMQX安装使用和客户端认证
  • Kubernetes 节点摘除指南
  • LintCode第107题-单词拆分
  • 全排列问题cpp
  • Discuz论坛网站忘记管理员密码进不去管理中心怎么办?怎么改管理员密码?
  • stc32单片机实现串口2M波特率满带宽传输
  • C#接口开发异常:System.Web.HttpRequestValidationException
  • Linux421用户、组
  • qt画一朵花
  • ​001-内网穿透工具
  • 20250421在荣品的PRO-RK3566开发板的Android13下使用io命令控制GPIO
  • ArcGIS、ArcMap查看.shp文件时属性表中文乱码
  • 软件工程师中级考试-上午知识点总结(下)
  • Linux内核开发常用函数
  • Git创建空分支并推送到远程仓库
  • 大模型中超参数TopK是什么
  • 密码明文放在请求体是否有安全隐患?
  • 前端实战-AJAX
  • Spark(19)Yarn-tool接口
  • 力扣热题100——矩阵
  • 安卓的桌面 launcher是什么
  • 【AI】SpringAI 第三弹:接入通用大模型平台
  • CSS字体