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

ARM SMMUv3简介(一)

1.概述

SMMU(System Memory Management Unit,系统内存管理单元)是ARM架构中用于管理设备访问系统内存的硬件模块。SMMU和MMU的功能类似,都是将虚拟地址转换成物理地址,不同的是MMU转换的虚拟地址来自CPU,SMMU转换的虚拟地址来自Device(比如DMA、PCIe等)。SMMU有以下特点:

  1. 起到地址隔离作用。DMA只能访问页表中的地址,非法地址将会被拦截。
  2. 支持设备使用连续虚拟地址访问离散物理地址,消除了传统DMA直接访问物理内存要求地址连续的限制,以及32位DMA访问4GB地址空间的限制。
  3. 支持设备共享CPU虚拟地址(IOVA=VA)空间。
  4. 在虚拟化环境中,SMMU可以为虚拟机中的设备提供地址转换和隔离,确保虚拟机之间的内存安全。

SMMU简介

如下所示,在支持虚拟化的环境中,SMMU支持2阶段地址转换,第一阶段把IOVA转换成IPA,第二阶段把IPA转换成PA,两阶段都可以设置成Bypass,即不做地址转换。若不支持虚拟化,则SMMU只做第一阶段地址转换,即把IOVA直接转换成PA。

SMMU地址转换示意图

2.内部结构

  1. 两个SMMU的功能相互独立。下图中一个SMMU负责转换普通设备的DMA请求地址,另一个SMMU负责转换PCIe设备的DMA请求地址。
  2. SMMU位于设备请求端和设备互联组件之间,多个SMMU通常都是并行放置,一个SMMU到内存的路径不经过另外一个SMMU。
  3. 由于SMMU负责地址转换和权限检查等,因此设置SMMU的软件必须运行再特权级别下,如EL1、EL2。
  4. SMMU与I/O设备缓存一致性:
    • SMMU与总线的接口支持I/O一致性协议(如ACE或CHI),确保设备访问内存时自动处理缓存一致性。
    • 设备发起的请求(如DMA写)不需要额外的一致性支持,SMMU会自动处理。
    • SMMU不转换系统到设备方向的请求地址,因此窥探流量不能从系统转发到SMMU后面的设备,因此不能将完全一致性设备缓存放置在SMMU后面(这类设备缓存必须直接连接一致性总线)。

SMMU结构

3.布局形式

  1. SMMU A嵌入到一个复杂设备中,属于设备的一部分,只为该设备提供地址转换和权限检查服务。通常情况下,这种SMMU的实现形式,有无竞争且专用的地址转换模块和TLB。
  2. SMMU B是一个的完整的模块,其集成了地址转换、编程接口及页表遍历功能。两个客户端设备将SMMU B作为DMA访问系统的路径。
  3. SMMU C 采用分布式设计,为多个不同的设备提供地址转换及访问权限检查等功能,从而实现更高带宽。其包括:
    1. 一个中央页表遍历器( central translation table walker),该模块拥有独立的请求端接口,用于获取页表结构、配置结构及队列;同时配备完成端接口,用于接收编程访问。此单元可能包含一个macro-TLB及配置缓存。
    2. 远端TLB单元在发生miss时,会向中央页表遍历器发起转换请求,并将结果缓存于本地。图中所示的两个TLB单元,第一个通过一个端口支持一组(三个)设备;第二个连接PCIe Root Complex,同时还向RC提供了ATS(用于处理EP发起地址转换的请求)接口。
  4. 智能设备中嵌入了一个TLB单元,但复用SMMU C的页表遍历器,这样可以减少设备的复杂度。

布局

4.地址转换流程

设备发起一次DMA请求,会把StreamID、SubstreamID和VA信息输入到SMMU,SMMU利用这些信息将IOVA转换成PA。

  1. 首先使用StreamID查找Stream Table,获取设备对应的Stream Table Entry (STE),STE里面保存了设备页表的配置信息、VMID及下一级Context Descriptor (CD)的基地址。
  2. 接着使用SubstreamID查找CD表。CD里面保存了SMMU页表的基地址、ASID等信息。
  3. 若页表TLB命中,则直接使用缓存的页表转换地址,否则从内存中查找页表,并填充TLB。
  4. 利用SMMU的页表,将IOVA转换成PA。
  5. 若是虚拟化环境,此时转换后的地址是IPA,需要利用StreamID进行第二级地址转换,最终得到PA。

地址转换流程示意图

参考资料

  1. Arm ® System Memory Management Unit Architecture Specification version 3.
http://www.xdnf.cn/news/12537.html

相关文章:

  • 常用存储器介绍
  • 10.Linux进程信号
  • 第四十六天打卡
  • 简单了解一下Hugging Face(抱抱脸)
  • 信号(瞬时)频率求解与仿真实践(1)
  • Unity版本使用情况统计(更新至2025年5月)
  • 计算机网络基础(一)
  • C语言速成15之告别变量碎片化:C 语言结构体如何让数据管理从混乱走向有序
  • LTE重建到新小区流程介绍
  • 宁乡地-气-碳-水相互作用综合观测数据集
  • 008-C++String
  • 深入浅出:计算机网络体系结构——信息世界的“交通规则”
  • 0.5S 级精度背后:DJSF1352-RN-6 如何让储能电站的每 1kWh 都「有迹可循」?
  • RK3588 火焰烟雾检测
  • 普中STM32F103ZET6开发攻略(六)
  • 第三十章 MDK的编译过程及文件类型
  • C++递归语句完全指南:从原理到实践
  • python模块——tqdm
  • 代付业务怎么理解?
  • [假面骑士] 龙骑浅谈
  • 【信息系统项目管理师-论文真题】2025上半年(第一批)论文详解(包括解题思路和写作要点)
  • Java并发容器和原子类
  • CppCon 2015 学习:How to Make Your Data Structures Wait-Free for Reads
  • FPGA没有使用的IO悬空对漏电流有没有影响
  • 什么是质量管理工具?质量管理工具有哪些优势?
  • C#中datagridview单元格value为{}大括号
  • C++优选算法 438. 找到字符串中所有字母异位词
  • 【Dv3Admin】系统视图菜单按钮管理API文件解析
  • CodeTop100 Day24
  • 【UEFI系列】SEC阶段讲解