SMMU相关知识
1. 使用smmu的作用
- 支持具有DMA能力设备的虚拟化实现
- 解决32位系统访问超过4G空间的地址
- 解决系统动态分配大块连续内存
2. 为什么需要使用2级页表
SMMU(系统内存管理单元)采用二级页表架构的核心原因可归结为地址空间管理效率、内存资源优化以及虚拟化场景的适配需求。以下是具体分析:
a. 减少内存占用与提升灵活性
- 单级页表的缺陷:
若采用单级页表管理64位地址空间,页表条目数量将指数级增长(例如32位系统下单级页表需4MB连续内存24)。对于SMMU连接的多个设备而言,每个设备独立维护单级页表将导致内存资源浪费。 - 二级页表的优势:
二级页表通过分层设计,仅在实际需要时分配下级页表。例如:
-
- 一级页表(目录):占用固定4KB内存,按设备或进程划分大块地址范围(如1MB段),仅记录是否存在有效二级页表47。
- 二级页表(实际映射):按需分配,每个二级页表仅管理更小的地址块(如4KB或1KB页),避免无效内存占用27。
这种设计显著降低内存开销,尤其适合资源受限的嵌入式系统26。
b. 支持虚拟化与多阶段地址转换
- 两阶段地址转换需求:
在虚拟化场景中,SMMU需同时处理Stage-1(VA→IPA)和Stage-2(IPA→PA)转换8。
-
- Stage-1:设备DMA请求的虚拟地址(VA)需转换为中间物理地址(IPA),对应Guest OS管理的页表。
- Stage-2:Hypervisor需将IPA转换为实际物理地址(PA),确保虚拟机隔离18。
二级页表架构天然适配这种分层机制,允许独立管理不同阶段的页表基址与权限38。
- 多设备隔离与安全:
每个设备通过StreamID和SubstreamID索引到独立的二级页表(CD表),实现地址空间隔离。例如,GPU的读写操作可指向不同安全域(Secure/Normal)的页表,确保数据安全36。
c. 硬件加速与性能优化
- TLB与缓存效率:
二级页表的分块结构(如1MB段→4KB页)与TLB(转换旁路缓冲器)的局部性原理契合,减少TLB失效概率。SMMU通过缓存常用页表项,加速地址转换38。 - 并行处理与动态扩展:
多级页表允许并行查询不同层级(如一级页表通过StreamID快速定位,二级页表按SubstreamID细化),适应高吞吐量设备(如GPU、视频编解码器)的需求68。
d. 兼容性与标准化设计
- 与MMU架构对齐:
ARM的MMU同样采用多级页表(如L1/L2),SMMU的设计与其保持一致,简化软件栈(如Linux内核驱动)的开发和维护17。 - 动态页表切换:
二级页表支持通过Command Queue动态更新页表基址,例如在进程切换时快速重配置设备地址空间,而无需重建整个页表8。
e. 总结
SMMU采用二级页表的核心逻辑在于:通过分层管理平衡内存效率与灵活性,适配虚拟化场景的多阶段转换需求,并通过硬件加速优化性能。这一设计在ARM生态中与MMU协同,成为实现设备DMA高效、安全的关键基础设施
3. STE的两种模式(Linear、2-Level)
SMMU中的Stream Table用于根据设备的StreamID查找对应的Stream Table Entry(STE),进而配置地址转换规则。Stream Table支持两种格式:Linear Stream Table和2-level Stream Table,两者在内存占用、查找效率和适用场景上有显著差异。以下是具体解释:
a. Linear Stream Table(线性流表)
ⅰ. 1结构与查找方式
- 结构:将所有STE按顺序存储在连续内存中,形成一个数组。每个STE固定为64B,StreamID直接作为数组索引。
- 地址计算:
STE地址 = STRTAB_BASE基地址 + StreamID × 64
。
ⅱ. 优点与缺点
- 优点:
-
- 查找速度快:仅需一次内存访问,适用于实时性要求高的场景。
- 实现简单:无需分层管理,硬件和软件逻辑简化。
- 缺点:
-
- 内存浪费:若StreamID稀疏(如仅使用少量高ID值),需分配整个连续内存空间,导致资源浪费29。
- 扩展性差:最大支持StreamID数量受限于连续内存分配能力。
ⅲ. 适用场景
- 设备数量少且StreamID密集分布(如嵌入式系统)。
- 需要低延迟访问的场景(如实时数据处理)。
b. 2-level Stream Table(二级流表)
ⅰ. 结构与查找方式
- 层级划分:
-
- 第一级表(L1 STD):存储指向第二级表的指针,每个表项8B。
- 第二级表(L2 STE):存储实际STE的数组,每个STE仍为64B。
- 索引分配:
-
- StreamID高位(如高8位)用于索引L1 STD,获取第二级表的基地址。
- StreamID低位(如低8位)用于索引第二级表,获取最终STE。
- 地址计算示例:
若StreamID为16位且分割点SPLIT=82:
L1 STD地址 = STRTAB_BASE基地址 + (StreamID[15:8] × 8)
STE地址 = L2基地址(来自L1 STD) + StreamID[7:0] × 64
。
ⅱ. 优点与缺点
- 优点:
-
- 内存高效:仅分配实际使用的第二级表,减少连续内存需求。
- 扩展性强:支持大范围StreamID(如32位),适合虚拟化等复杂场景。
- 缺点:
-
- 查找延迟高:需两次内存访问,性能略低于Linear格式。
- 实现复杂:需管理多级表结构和动态分配逻辑。
ⅲ. 适用场景
- StreamID范围大且稀疏分布(如云计算中的多租户设备)。
- 内存资源受限但需支持大量设备(如数据中心)。
c. 对比总结
维度 | Linear Stream Table | 2-level Stream Table |
内存占用 | 高(需连续分配) | 低(按需分配二级表) |
查找速度 | 快(单次访问) | 慢(两次访问) |
实现复杂度 | 低 | 高(需多级管理) |
适用StreamID范围 | 小规模(如≤64) | 大规模(如≥64) |
d. 配置与兼容性
- 寄存器控制:通过
SMMU_STRTAB_BASE_CFG
配置格式,SPLIT
字段定义分割点。 - 强制条件:当StreamID超过6位(即>64个设备)时,必须使用2-level格式。
- 安全扩展:支持Secure/Non-secure双安全状态时,需独立配置各自的Stream Table48。
通过合理选择Stream Table格式,可在内存效率与性能之间实现平衡,满足不同应用场景的需求
4. ASID与VMID
在ARM SMMU(系统内存管理单元)中,ASID(Address Space Identifier)和VMID(Virtual Machine Identifier)是用于地址空间隔离与虚拟化支持的核心标识符,其作用与实现机制如下:
a. ASID(地址空间标识符)
ⅰ. 核心定义与功能
- 作用:ASID用于区分同一虚拟机或物理机中不同进程的地址空间,类似于CPU MMU中的进程隔离机制。每个进程被操作系统分配唯一的ASID,确保其虚拟地址映射仅在自身上下文中生效。
- TLB标记:在SMMU的TLB(转换后备缓冲器)中,非全局页表项(
nG
位标记)会附加ASID标签。当设备发起DMA请求时,SMMU根据当前ASID匹配TLB条目,防止不同进程的映射冲突。 - 配置来源:
-
- ASID存储于TTBRn_EL1寄存器(如TTBR0_EL1用于用户空间进程),通过更新寄存器可同时切换ASID和页表基址12。
- 在SMMU中,ASID通过Context Descriptor(CD)关联设备的上下文,CD由Stream Table Entry(STE)中的
S1ContextPtr
和SubstreamID索引定位。
ⅱ. 应用场景
- 进程隔离:同一虚拟机内的多个进程可通过ASID共享TLB缓存,避免上下文切换时TLB刷新开销。例如,进程A(ASID=1)与进程B(ASID=2)的映射可共存于TLB中。
- 共享虚拟地址(SVA):在设备与CPU进程共享地址空间的场景中,SMMU使用与CPU相同的ASID,实现设备直接访问进程的虚拟地址。
b. VMID(虚拟机标识符)
ⅰ. 核心定义与功能
- 作用:VMID用于区分不同虚拟机的地址空间,确保虚拟机的中间物理地址(IPA)到实际物理地址(PA)的转换相互隔离。每个虚拟机由Hypervisor分配唯一的VMID。
- TLB标记:在虚拟化场景中,TLB条目同时附加VMID和ASID标签。例如,VM1(VMID=1)与VM2(VMID=2)即使使用相同的ASID,其TLB条目也不会混淆。
- 配置来源:
-
- VMID存储于VTTBR_EL2寄存器,由Hypervisor管理。ARMv8.1-A后支持16位VMID以扩展虚拟机数量45。
- SMMU的STE(Stream Table Entry)中通过
VMID
字段指定虚拟机关联的Stage-2页表(IPA→PA转换)。
ⅱ. 应用场景
- 虚拟机隔离:不同虚拟机的设备通过VMID绑定独立的Stage-2页表,防止跨虚拟机内存访问。例如,直通设备访问的IPA需通过VMID对应的页表转换为PA。
- TLB缓存复用:多个虚拟机的TLB条目可共存,VMID作为关键标识,避免虚拟机切换时TLB刷新。
c. ASID与VMID的协同机制
- 组合标记:
在虚拟化环境中,TLB条目通过VMID + ASID唯一标识映射关系。例如,VM1(VMID=1)的进程A(ASID=1)与VM2(VMID=2)的进程A(ASID=1)的映射在TLB中独立存储 - 多级地址转换:
-
- Stage-1转换(VA→IPA):由ASID关联的进程页表完成。
- Stage-2转换(IPA→PA):由VMID关联的虚拟机页表完成78。
两者结合实现完整的VA→IPA→PA
转换流程(见图1)。
- 跨处理器一致性(CnP位):
在ARMv8.2-A及更高版本中,CnP(Common not Private)
位允许ASID和VMID在多个处理器间统一分配,使TLB条目跨核共享,减少多核系统的同步开销
d. 实际配置与限制
- ASID分配:SMMU通过
Xaarray
数据结构动态分配ASID,与CPU的ASID空间独立(除非SVA场景)。 - VMID管理:Hypervisor通过位图(bitmap)分配VMID,确保不同虚拟机的唯一性。
- TLB广播与隔离:
-
- CPU发起的TLB失效指令(TLBI)默认不影响SMMU的TLB条目,除非通过
CD.ASET
字段显式共享ASID37。 - VMID的隔离性天然阻止跨虚拟机TLB干扰。
- CPU发起的TLB失效指令(TLBI)默认不影响SMMU的TLB条目,除非通过
e. 总结
- ASID是进程级隔离的核心标识,用于TLB缓存复用与进程上下文切换优化。
- VMID是虚拟机级隔离的核心标识,保障虚拟化环境中的内存安全与资源隔离。
- 两者协同工作,通过多级页表转换与TLB标记机制,实现从设备到物理内存的端到端地址空间管理
5. STE与PTE
在ARM SMMU(系统内存管理单元)中,STE(Stream Table Entry)和PTE(Page Table Entry)是地址转换过程中两个关键的数据结构,分别承担不同的角色,具体定义与功能如下:
a. STE(Stream Table Entry,流表条目)
ⅰ. 核心定义
STE是SMMU用于管理设备地址转换配置的核心数据结构,每个设备(通过唯一的StreamID标识)对应一个STE。它存储在内存的Stream Table中,是SMMU实现多设备地址空间隔离的基础。
ⅱ. 功能与结构
- 配置内容:
- Stage-1配置:指向Context Descriptor(CD)的指针(
S1ContextPtr
),CD中存储了阶段1(VA→IPA)的页表基地址(如TTBR0/TTBR1)和转换参数(如TCR、ASID)。 - Stage-2配置:阶段2(IPA→PA)的页表基地址(
S2TTB
)和转换参数(如VTCR、VMID)78。 - 转换模式控制:决定是否启用阶段1、阶段2或两者(如
STE.Config
字段)。 - 安全属性:区分安全与非安全上下文(Secure/Non-secure STE),控制设备对安全内存的访问权限。
- 存储格式:
STE固定为64字节,可通过Linear Stream Table(连续数组)或2-level Stream Table(两级索引)格式组织,以适配不同规模的StreamID空间。
ⅲ. 应用场景
- 设备隔离:每个StreamID对应独立的STE,确保不同设备使用不同的页表和安全策略。
- 虚拟化支持:通过VMID关联Stage-2页表,实现虚拟机间的物理地址隔离。
b. PTE(Page Table Entry,页表条目)
ⅰ. 1核心定义
PTE是页表中存储地址映射关系的最小单元,存在于SMMU的多级页表结构(如ARMv8的4级页表)中,用于将虚拟地址(VA或IPA)转换为物理地址(PA)。
ⅱ. 功能与结构
- 地址映射:
- 虚拟地址段划分:通过PTE中的
next-level table address
或output address
字段,逐级解析地址。例如:
Level 0 PTE:解析VA[47:39] → Level 1页表基地址。
Level 3 PTE:解析VA[20:12] → 物理页帧基地址。 - 权限与属性:包含读写权限(AP)、内存类型(MAIR)、安全属性(NS位)等。
- 存储格式:
PTE大小通常为8字节,页表层级结构与CPU的MMU一致,支持多种页大小(如4KB、2MB、1GB)。
ⅲ. 应用场景
- 地址转换:通过页表遍历(Page Table Walk)逐级查询PTE,完成虚拟地址到物理地址的转换。
- TLB加速:PTE缓存于TLB(转换后备缓冲器),减少页表遍历的延迟。
c. STE与PTE的协同工作流程
- 设备发起请求:
设备通过StreamID发起DMA请求,SMMU根据StreamID查找对应的STE。 - STE解析配置:
若启用Stage-1,STE指向CD表,结合SubstreamID获取CD,从中读取Stage-1页表基地址(TTBR0/TTBR1)。
若启用Stage-2,STE直接提供Stage-2页表基地址(S2TTB)。 - 页表遍历与PTE查询:
Stage-1:通过CD中的TTBRx逐级查询PTE,将VA转换为IPA。
Stage-2:通过S2TTB逐级查询PTE,将IPA转换为PA。 - 物理地址输出:
最终PA发送至内存总线,完成设备对物理内存的访问。
d. 对比总结
维度 | STE | PTE |
作用层级 | 设备级配置(StreamID隔离) | 地址级映射(虚拟→物理转换) |
存储位置 | Stream Table(内存中的流表) | 多级页表(内存中的页表结构) |
核心功能 | 配置转换模式、页表基址、安全策略 | 存储地址映射关系与内存属性 |
查询方式 | StreamID索引(Linear/2-level流表) | 虚拟地址分段索引(多级页表遍历) |
e. 典型配置示例
- 单阶段转换(Stage-1):
- STE启用Stage-1并指向CD,CD中TTBR0定义进程的页表,PTE完成VA→PA转换。
- 双阶段转换(Stage-1 + Stage-2):
- STE同时启用Stage-1和Stage-2,Stage-1的PTE将VA→IPA,Stage-2的PTE将IPA→PA(用于虚拟机隔离)。
- 安全扩展场景:
- Secure STE指向安全页表(NS=0),Non-secure STE指向非安全页表(NS=1),PTE中NS位控制内存访问权限。
通过STE与PTE的协同,SMMU实现了灵活的设备地址空间管理与高效的虚拟化支持,是异构计算与IO虚拟化的关键技术基础。