前言
MMU在整个ARM的VMSA中的江湖地位,我们通过一些列的文章已经反反复复的介绍了。怎么形容呢?那都不是重要,那是相当的重要,还不了解的小伙伴,建议你先读一读前面的文章。MMU这个带刀护卫只管CPU内部的一亩三分地,CPU外面的世界他是不太关心的。了解总线架构的我们应该知道,SOC内部可不只有一个CPU,还有GPU、NPU、ADSP、DMA Controller、等等一众大哥,他们在VMSA下也是挂了号的,在CPU的眼里,这些大哥是分享IO(Device)内存空间的。这个空间是在CPU的视角下,把视角拉高的SOC架构下的视角,那么在SOC的运行时,这么江湖大哥也是需要资源才能工作的。比如,GPU要渲染一张图片、ADSP要解码MP3音频文件、网卡要接受以太网报文、等等。通过这些例子会发现,多数的总线架构下的Master要工作都离不开内存(RAM),因为他们要操作的那些图片数据、音频数据、网络报文总得有个地方放吧。牵扯到内存了,就涉及到一个重要的课题,那就是寻址,总得告诉这些大哥他们操作的数据在哪里吧。SOC中肯定是CPU说了算,它上面跑的指令可以把内存永久的或者临时的分配给一个Master使用,那么怎么找到和管理这些内存就是它们要考虑的问题了。一种就是自己管理起来,比如一些SOC平台下的GPU就可以自己管理分配给它的内存;另外一种方式就是借助类似CPU的带刀护卫MMU那种功能单元。本文我们就介绍基于ARM体系的系统架构下辅助其他Master管理内存的功能单元-SMMU(System Memory Management Units)的架构和一些核心的概念。
在开始正文正文之前,先搞清两个概念。
(1) 第一个是MMU,建议大家花一点时间阅读下前序文章:[A07]ARMv8/ARMv9-Memory-内存管理单元(MMU) 。因为SMMU和MMU的功能类似,先建立起对MMU的感觉是理解本文的重要基础。
(2) 第二个是IOMMU,其实在笔者看来两者是一回事儿,只是在不同的体系下叫法不一样。X86体系下,这个功能单元就叫IOMMU。Intel早啊,哈哈哈,现在Linux Kernel源码中Driver文件夹命名都是IOMMU。
正文
1.1 SMMU的系统架构
我们先看一张SOC架构图,如图1-1所示。
图1-1 High-Level SOC 架构
从上图可以看出在总线架构的视角下,SMMU其实也是一个Master。SMMU在SOC的形态并非固定的,具体要看芯片厂商在设计SOC产品时候考量。搭载了SMMU的SOC,系统架构就会发生变化,一些总线节点会隐藏在SMMU后面成为它的Client Device,例如图中的DMA和PCIe Controller等等。下面我们对SMMU的外围电路放大,如图1-2所示。
图1-2 High-Level SMMU相关系统架构实例
我们对图1-2做一下简单的总结:
(1) Device1和Device2可以独立也可以组团通过IO总线和SMMU连接变成他的Client设备。
(2) SMMU也可以和PCIe控制器合作将PCIe总线上的一些列设备变成自己的Client设备。
(3) 所有的Client设备在访问内存之前都要经过SMMU的管理,拿不到SMMU翻译出来的物理地址(总线地址),内存上的啥数据访问不了。
(4) SMMU本身也要接受PEs发出的指令进行控制,包括初始化配置,和运行时的指令管控。
前面说过了SMMU的系统架构形态和具体的芯片厂商设计有关系,具体先看图1-3。
图1-3 多种SMMU产品实现形态
我们先看一下手册中的描述:
• SMMU A is implemented as part of a complex device, providing translation for accesses from that device only. Arm expects this implementation to have an SMMU programming interface in addition to device-specific control. This design can provide dedicated contention-free translation and TLBs.
• SMMU B is a monolithic block that combines translation, programming interface and translation table walk facilities. Two client devices use this SMMU as their path for DMA into the system.
• SMMU C is distributed and provides multiple paths into the system for higher bandwidth. It comprises of:
A central translation table walker, which has its own Requester interface to fetch translation and configuration structures and queues and a Completer interface to receive programming accesses. This unit might contain a macro-TLB and caches of configuration.
(1)The central translation table walker also provides an ATS interface to the Root Complex, so that the PCIe Devices can use ATS to make translation requests through to the central unit.
(2)Remote TLB units which, on a miss, make translation requests to the central unit and cache the results locally. Two units are shown, supporting a set of three devices through one port, and a PCIe Root Complex through another.
• Finally, a smart device is shown, which embeds a TLB and makes translation requests to the central unit of SMMU C. To software, this looks identical to a simple device connected behind a discrete TLB unit. This design provides a dedicated TLB for the device, but uses the programming interface and translation facilities of the central unit, reducing complexity of the device.
结合手册的描述我们简单做一下总结:
(1) ARM体系下的SMMU 可以以多种形态在SOC的总线架构下存在。
(2) SMMU A的专用形态,此时SMMU的逻辑功能会嵌入到一个固定Master内部,可以理解为和其他的功能单元合并,比如GPU、NPU等等,这种形态的最大特点就是专属,SMMU内部的所有功能单元都是自己的,别的Master干扰不了。
(3) SMMU B主打一个大家共享一组相似的设备组团使用一个SMMU,SMMU在这些设备访问内存的时候会做一下仲裁。
(4) SMMU C这种分布式的结构主要是吧SMMU的一部分功能单元拿出来给大家公用,例如地址翻译、访问错误管理、事件队列管理等。而设备为了实现更高效率的访问内存会在SMMU内部或者自身设备内部拥有自己的TLB或者设备内部缓存。
SMMU系统架构的最后,我们来看一下SMMU的内部结构,如图1-4所示。
图1-4 SMMU实例
先看手册中描述:
The MMU‑700 contains the following key components:
Translation Buffer Unit (TBU)
The TBU contains Translation Lookaside Buffers (TLBs) that cache translation tables. The MMU‑700 implements a TBU that can be connected to single master or multiple masters. It is also possible to connect multiple TBUs to a single master to improve performance. These TBUs are local to the corresponding master and can be one of the following:
• ACE‑Lite TBU
• LTI TBU
Translation Control Unit (TCU)
The TCU controls and manages the address translations. The MMU‑700 implements a single TCU. In MMU‑700-based systems, the AMBA ® DTI protocol defines the standard for communicating with the TCU. See the AMBA ® DTI Protocol Specification.
DTI interconnect
The DTI interconnect connects multiple TBUs to the TCU.
结合手册中的描述可以看出,SMMU内部其实和PE中MMU相似,地址翻译单元TCU负责地址翻译,TBU负责缓存翻译结果,DTI负责将各个组件串联起来。
关于SMMU的系统架构我们就介绍到这里,这一部分主要是让大家在硬件层面对SMMU建立一个起码的认识,脑袋不是一片空白,有一个印象就可以了。防止我们在讲述SMMU软件相关内容的时候,大家会觉得陌生。对SMMU系统架构,以及SMMU内部结构感兴趣的伙伴,大家可以自行阅读手册,我们的重点还是放在SMMU软件相关的内容。
1.2 SMMU的主要功能
首先要搞清楚一个背景,那就是为什么会有SMMU这样一个Master出现,看图1-5。
图1-5 ARM内存模型的Share Domain
前面我们已经通过一系列文章讲过了ARM的内存模型相关的内容,大家可以自行阅读。其实,从上图就可以看出,arm的内存是可以在总线层面实现各个Master共享的,这里面最重要的Master肯定是CPU,CPU自己内部就有专属的MMU,可以实现内存空间的管控。那么分配给CPU以外的Master的内存怎么办呢?比如给GPU的一大块内存,A、B、C三个进程都让它渲染图片,GPU要怎么处理才能不乱套呢?要是再加上虚拟化架构,就更热闹了,VM1中A、B、C和VM2中D、E、F进程都让GPU渲染图片,GPU要怎么处理侧能不乱套呢?类似的场景还有很多,不一一列举了。这个时候有需求了,有了在CPU以外的场景下管理内存的需求了,于是SMMU就诞生了。我们对前面的SMMU的系统架构做一下简化,就变成了如图1-6的样子。
图1-6 High-Level SMMU系统架构
既然SMMU能解决我们提出的问题,那么就先看一下ARM体系下的SMMU有哪些功能:
An SMMU performs a task like that of an MMU in a PE. It translates addresses for DMA requests from system I/O devices before the requests are passed into the system interconnect. The SMMU only provides translation services for transactions from the client device, not for transactions to the client device.
Arm SMMUs provide:
Translation
The addresses supplied by the client device are translated from the virtual address space into the system’s physical address space.
Protection
Operations from the client device might be prevented by the permissions held in the translation tables. You can prohibit a device to read, write, execute, or make any access to particular regions of memory.
Isolation
Transactions from one device can be differentiated from those of another device, even if both devices share a connection to the SMMU. This means that the translation and protection properties can be applied differently for each device. Each device might have its own private translation tables, or might share them with other devices, as appropriate to the application.
结合手册的描述我们对SMMU的功能做一下总结:
(1) SMMU(System Memory Management Unit是ARM架构下的一个重要组件,它的核心功能:地址转换、内存保护、内存隔离。
(2) 地址转换:设备要访问的内存的地址来自于驱动程序,而驱动发过来的地址根据系统配置,可以是虚拟地址VA,也可以是物理地址PA或者IPA。如果是物理地址,那就好办了,SMMU就不用干翻译的活了,直接检查一下权限和属性没问题就可以让设备用了。如果IPA和VA那就麻烦了,通过总线访问物理内存要使用物理地址,那SMMU就得把这个VA和PA翻译成PA给设备使用。
(3) 内存保护:我们前面举得GPU的例子就能很好的说明问题了,这里不再重复。总之不管驱动那边发过来多少个地址访问请求,设备这一头拿到任务后,不能乱,不能越界操作别的任务的地址空间。
(4) 内存隔离:SMMU能够针对硬件加速器的访问进行地址映射和隔离,确保硬件加速器只能访问特定的内存区域,而不能访问其他应用程序或操作系统的敏感数据。此外,在支持虚拟化的系统中,SMMU还可以为每个虚拟机配置独立的映射表,确保多个虚拟机之间和与宿主系统之间的内存访问相互隔离,从而防止虚拟机之间的攻击。
(5) 最后,就是SMMU要MMU一样要具备抛出异常的能力,设备任何违规的行为都要受到惩罚,并通知CPU做进一步的处理。
对于SMMU的功能和工作原理,后面我们还会详细展开讨论,这里大家先了解一个大概就可以了。
结语
本文对SMMU的系统架构、内部结构、以及核心功能做了简要的介绍。SMMU作为ARM系统的核心Master之一关联的内容和技术课题还是非常多的,有很多的点研究下去还是挺有意思的。我们这里主要还是优先聚焦在虚拟化技术层面展开的研究,下一篇文章我们会针对SMMU的核心功能展开介绍。谢谢大家,请保持关注。
Reference
[00] <aarch64_virtualization_100942_0100_en.pdf>
[01] <Armv8-A-virtualization.pdf>
[02] <learn_the_architecture_aarch64_virtualization.pdf>
[03] <DDI0487K_a_a-profile_architecture_reference_manual.pdf>
[04] <DEN0024A_v8_architecture_PG.pdf>
[05] <learn_the_architecture_aarch64_memory_model.pdf>
[06] <80-LX-SMMU-IOMMU-cs0005_linux-DMA-API使用指导.pdf>
[07] <learn_the_architecture_an_introduction_to_amba_axi.pdf>
[08] <80-LX-SMMU-IOMMU-cs0001_Linux-iommu和vfio概念空间解构.pdf>
[09] <learn_the_architecture_aarch64_memory_management.pdf>
[10] <learn_the_architecture_smmu_software_guide.pdf>
[11] <QNX_SMMUMAN_Users_Guide.pdf>
[12] <IHI0070G.a-System_Memory_Management_Unit_Architecture_Specification.pdf>
[13] <80-ARM-SMMU-wx0001_SMMU学习这一篇就够了(软件硬件原理_模型导读).pdf>
[14] <corelink_mmu700_smmu_trm_101542_0102_08_en.pdf>
Glossary
MMU - Memory Management Unit
TLB - translation lookaside buffer
VIPT - Virtual Index Physical Tag
VIVT - Virtual Index Virtual Tag
PIPT - Physical Index Physical Tag
VA - Virtual Address
PA - Physical Address
IPS - Intermediate Physical Space
IPA - Intermediate Physical Address
VMID - virtual machine identifier
TLB - translation lookaside buffer
VTTBR_EL2 - Virtualization Translation Table Base Registers
ASID - Address Space Identifier (ASID)
SMMU - System Memory Management Unit
STE - Stream Table Entry
CD - Context Descriptor
GPC - Granule Protection Checks
GPT - Granule Protection Table
ATS - Address Translation Services
ATC - Address Translation Cache
DPT - Device Permission Table
PRI - Page Request Interface
PPRs - PRI Page Requests (PPRs)
VMS - Virtual Machine Structure
CMO - Cache Maintenance Operation
IWB - inner Write-Back
OWB - Outer Write-back
ISH - Inner shareable
PASID - Process Address Space Identifier
ACS - Access Control Services
ITS - Interrupt Translation Service
MSI - Message-Signaled Interrupts
SVA - Shared Virtual Addressing