SMMU概述

SMMU并非MMU,而是在QSEE环境中提供安全防护的硬件。它在地址转换过程中增加安全访问控制,通过Context Bank实现设备相关的上下文标志。SMMU在MMU转换基础上进行第二次地址修正,生成最终访问设备的地址。
SMMU本质上就是一个MMU设备,它的内存转换逻辑与CPU的MMU采用相同的逻辑,都允许将物理上非连续的页虚拟为连续的内存页。SMMU和IOMMU可以交替使用。

关键术语
-Context Bank
 定义转换上下文的寄存器集,系统中的每个Context Bank都有相同的寄存器集。
 PS:这里要记录的有哪些信息?
-Stream ID
 SMMU的输入源,用于唯一标记当前转换流的标记符。
 PS:有哪些转换流?
-IOVA
 I/O虚拟地址
-Page Tables
 定义虚拟到物理内存映射的表格,SMMU依靠这些表格完成转换。
-TTBR0
 保存Page Tables基地址的寄存器
-Page Level
 Page Table走过的级别(目前理解是转换过程中当前所处的转换页表的级别),一半只有在转换出错时才会用到。
-Translation Stage
 转换进程的阶段,HLOS管理第一阶段,系统管理程序管理第二阶段。
 PS:分别完成什么功能?
-IPA
 中间物理地址,第一阶段的输出地址和第二阶段的输入地址
 PS:本身不是硬件过程吗,怎么HLOS还会生成中间地址?
-TLB
 转换后援缓存器,也称页表缓存,用于加快地址转换过程,缓存着IOVA到物理地址的映射。
-Bypass

 用于某个阶段(Stage 1/2或全部)不进行转换,即输出等于输入。

重要API

API
### SMMU 的基本配置与使用方法 SMMU(System Memory Management Unit)是一种硬件组件,用于为外设(如 PCIe 设备)提供地址转换和内存保护功能。其主要作用类似于 CPU 的 MMU,但面向外设,使外设能够访问虚拟地址并受到访问权限的限制。 #### 配置步骤概述 1. **设备与 SMMU 的映射** - 在系统中,每个 PCIe 设备都有一个唯一的 RequesterID,SMMU 通过 StreamID 来识别设备。通常,StreamID 的低 16 位直接映射到 RequesterID。 - 例如,如果设备 A 的 RequesterID 是 `0x1234`,那么其对应的 StreamID 低 16 位也为 `0x1234` [^2]。 2. **Stage 1 和 Stage 2 翻译** - **Stage 1 翻译**:用于进程级别的地址转换,通常与 PASID(Process Address Space Identifier)相关联。PASID 允许将不同的进程映射到不同的地址空间,从而实现更细粒度的内存访问控制。 - **Stage 2 翻译**:用于虚拟化场景,确保事务被正确路由到对应的虚拟机(VM)。例如,虚拟机 VM1 的设备 RequesterID `0x1234` 会被路由到该虚拟机 [^2]。 3. **虚拟 SMMU(vSMMU)** - 在虚拟化环境中,可以通过软件模拟一个虚拟 SMMU(vSMMU),并将其分配给虚拟机。虚拟机管理程序(Hypervisor)负责将 vSMMU 的操作翻译为实际物理 SMMU 的操作,从而让虚拟机中的设备也能享受 SMMU 提供的地址转换和内存保护功能 [^1]。 4. **Stream Table 和 Context Table** - **Stream Table**:每个设备的 StreamID 对应 Stream Table Entry(STE),用于指定该设备的地址转换规则。 - **Context Table**:每个 STE 可能指向一个 Context Table Entry(CTE),用于存储具体的地址转换信息,尤其是 Stage 1 翻译的上下文信息。 5. **启用 SMMU** - 在硬件层面,SMMU 需要被正确初始化并启用。通常需要配置 SMMU 控制寄存器,启用地址转换功能。 - 在软件层面,操作系统或虚拟机管理程序需要配置相应的数据结构(如 Stream Table 和 Context Table),并确保设备驱动程序能够与 SMMU 协同工作。 #### 示例配置 以下是一个简化的配置流程示例: ```c // 假设我们有一个 PCIe 设备 A,其 RequesterID 为 0x1234 // 并且我们希望为该设备配置 SMMU // 1. 将设备的 RequesterID 映射到 SMMU 的 StreamID uint16_t requester_id = 0x1234; uint16_t stream_id = requester_id; // StreamID 的低 16 位映射到 RequesterID // 2. 配置 Stream Table Entry (STE) struct ste { uint64_t valid : 1; // 有效位 uint64_t config : 3; // 配置位 uint64_t context_ptr : 48; // 指向 Context Table Entry 的指针 } __attribute__((packed)); // 初始化 STE struct ste my_ste = { .valid = 1, .config = 0x3, // 表示使用 Context Table .context_ptr = (uint64_t)&my_context_table_entry }; // 3. 配置 Context Table Entry (CTE) struct cte { uint64_t valid : 1; uint64_t translation_table_base : 48; // 地址转换表的基地址 } __attribute__((packed)); // 初始化 CTE struct cte my_cte = { .valid = 1, .translation_table_base = 0x100000 // 假设地址转换表的基地址为 0x100000 }; // 4. 启用 SMMU void enable_smmu() { // 配置 SMMU 控制寄存器 uint64_t smmu_control_register = 0x1; // 启用地址转换 // 写入寄存器 write_smmu_register(SMMU_CTRL_REG, smmu_control_register); } ``` #### 总结 SMMU 的配置涉及多个步骤,包括设备与 SMMU 的映射、Stage 1 和 Stage 2 翻译的设置、Stream Table 和 Context Table 的配置,以及 SMMU 的启用。通过这些步骤,设备可以利用 SMMU 实现高效的地址转换和内存保护功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值