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

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
  • 多设备隔离与安全
    每个设备通过StreamIDSubstreamID索引到独立的二级页表(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 Table2-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干扰。

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实现多设备地址空间隔离的基础。

ⅱ. 功能与结构
  • 配置内容
  1. Stage-1配置:指向Context Descriptor(CD)的指针(S1ContextPtr),CD中存储了阶段1(VA→IPA)的页表基地址(如TTBR0/TTBR1)和转换参数(如TCR、ASID)。
  2. Stage-2配置:阶段2(IPA→PA)的页表基地址(S2TTB)和转换参数(如VTCR、VMID)78
  3. 转换模式控制:决定是否启用阶段1、阶段2或两者(如STE.Config字段)。
  4. 安全属性:区分安全与非安全上下文(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)。

ⅱ. 功能与结构
  • 地址映射
  1. 虚拟地址段划分:通过PTE中的next-level table addressoutput address字段,逐级解析地址。例如:
    Level 0 PTE:解析VA[47:39] → Level 1页表基地址。
    Level 3 PTE:解析VA[20:12] → 物理页帧基地址。
  2.  权限与属性:包含读写权限(AP)、内存类型(MAIR)、安全属性(NS位)等。
  • 存储格式
    PTE大小通常为8字节,页表层级结构与CPU的MMU一致,支持多种页大小(如4KB、2MB、1GB)。
ⅲ. 应用场景
  • 地址转换:通过页表遍历(Page Table Walk)逐级查询PTE,完成虚拟地址到物理地址的转换。
  • TLB加速:PTE缓存于TLB(转换后备缓冲器),减少页表遍历的延迟。

c. STE与PTE的协同工作流程

  1. 设备发起请求
    设备通过StreamID发起DMA请求,SMMU根据StreamID查找对应的STE。
  2. STE解析配置
    若启用Stage-1,STE指向CD表,结合SubstreamID获取CD,从中读取Stage-1页表基地址(TTBR0/TTBR1)。
    若启用Stage-2,STE直接提供Stage-2页表基地址(S2TTB)。
  3. 页表遍历与PTE查询
    Stage-1:通过CD中的TTBRx逐级查询PTE,将VA转换为IPA。
    Stage-2:通过S2TTB逐级查询PTE,将IPA转换为PA。
  4. 物理地址输出
    最终PA发送至内存总线,完成设备对物理内存的访问。

d. 对比总结

维度

STE

PTE

作用层级

设备级配置(StreamID隔离)

地址级映射(虚拟→物理转换)

存储位置

Stream Table(内存中的流表)

多级页表(内存中的页表结构)

核心功能

配置转换模式、页表基址、安全策略

存储地址映射关系与内存属性

查询方式

StreamID索引(Linear/2-level流表)

虚拟地址分段索引(多级页表遍历)


e. 典型配置示例

  1. 单阶段转换(Stage-1)
  • STE启用Stage-1并指向CD,CD中TTBR0定义进程的页表,PTE完成VA→PA转换。
  1. 双阶段转换(Stage-1 + Stage-2)
  • STE同时启用Stage-1和Stage-2,Stage-1的PTE将VA→IPA,Stage-2的PTE将IPA→PA(用于虚拟机隔离)。
  1. 安全扩展场景
  • Secure STE指向安全页表(NS=0),Non-secure STE指向非安全页表(NS=1),PTE中NS位控制内存访问权限。

通过STE与PTE的协同,SMMU实现了灵活的设备地址空间管理与高效的虚拟化支持,是异构计算与IO虚拟化的关键技术基础。

相关文章:

  • 【蓝桥杯】第十六届蓝桥杯C/C++大学B组个人反思总结
  • 章越科技赋能消防训练体征监测与安全保障,从传统模式到智能跃迁的实践探索
  • (Go Gin)Gin学习笔记(四)Gin的数据渲染和中间件的使用:数据渲染、返回JSON、浅.JSON()源码、中间件、Next()方法
  • rk3568安全启动功能实践
  • BUUCTF——Fakebook 1
  • allegro 怎样显示/隐藏铜皮shape?
  • 可商用,可离线运行,可API接口调用的开源AI数字人项目Heygem,喂饭级安装教程
  • 机器学习:在虚拟环境中使用 Jupyter Lab
  • 2025 RSAC|自主式 GenAI 安全智能体(Agent)开启防御新纪元
  • VR 汽车线束培训:探索高效学习新路径​
  • vscode vim插件操作查缺补漏
  • 百度网盘golang实习面经
  • Linux架构篇、第1章_01架构的介绍HTTP HTTPS 协议全面解析
  • 2025华东杯ABC题赛题已出速拿
  • LabelVision - yolo可视化标注工具
  • 【mysql】执行过程,背诵版
  • Linux-04-用户管理命令
  • JAVA:使用 iTextPDF 处理 PDF 的技术详解
  • 树的序列化 - 学习笔记
  • 【自然语言处理与大模型】如何获取特定领域的微调数据集?
  • 摩天大楼天津117大厦复工背后:停工近十年,未知挑战和压力仍在
  • AI世界的年轻人,如何作答未来
  • 讲座|为什么要不断地翻译叶芝的诗?它们为什么值得细读?
  • 昂立教育:去年减亏1.39亿元,今年以“利润持续增长”为核心目标
  • 港交所与香港证监会就“中概股回流意向”已与部分相关企业进行接触
  • 北京朝阳涉住宅组团地块126亿元成交