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

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.lryc.cn/news/2404339.html

相关文章:

  • C#提取CAN ASC文件时间戳:实现与性能优化
  • hadoop集群datanode启动显示init failed,不能解析hostname
  • Android 视图系统入门指南
  • 浏览器工作原理05 [#] 渲染流程(上):HTML、CSS和JavaScript是如何变成页面的
  • 青少年编程与数学 01-011 系统软件简介 03 NetWare操作系统
  • AI编程提示词
  • Android学习总结-GetX库常见问题和解决方案
  • |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面
  • React 中 HTML 插入的全场景实践与安全指南
  • 一键更新依赖全指南:Flutter、Node.js、Kotlin、Java、Go、Python 等主流语言全覆盖
  • Java异步编程难题拆解技术
  • NoSQL 之 Redis 配置与优化
  • pikachu靶场通关笔记20 SQL注入03-搜索型注入(GET)
  • 产品笔试专业名词梳理
  • 【前端】es6相关,柯里化
  • 51单片机基础部分——矩阵按键检测
  • onSaveInstanceState() 和 ViewModel 在数据保存能力差异
  • SpringBoot2.3.1集成Knife4j接口文档
  • Java Fork/Join框架:三大核心组件深度解析
  • 【envoy】-1.安装与下载源码
  • B站的视频怎么下载下来——Best Video下载器
  • Mysql-定时删除数据库中的验证码
  • 容器安全最佳实践:云原生环境下的零信任架构实施
  • [BIOS]VSCode zx-6000 编译问题
  • MySQL连接报SSL错误
  • 在WPF项目中集成Python:Python.NET深度实战指南
  • Nuxt.js 布局系统详解:构建可复用页面框架
  • CICD实战(二)-----gitlab的安装与配置
  • [GitHub] 优秀开源项目
  • Linux中su与sudo命令的区别:权限管理的关键差异解析