ARM SMMUv3 Stream Table分析(二)

1.简介

Stream Table中记录了SMMU转换设备地址所需的信息,比如TTB页表基地址、ASID、VMID、配置信息、内存属性等。SMMU使用StreamID和SubstreamID索引Stream Table。Stream Table由STE表和CD表组成,STE表用于第一阶段和第二阶段地址转换,CD表用于第一阶段地址转换。

2.Stream Numbering

同一个SMMU域里面的设备,每个设备都有一个独立的StreamID,StreamID通常情况下从0开始,位宽由SMMU_IDR1.SIDSIZE决定,最大32bits,对于PCIe设备,使用BDF作为StreamID。
SubstreamID是一个可选的实现,位宽由SMMU_IDR1.SSIDSIZE决定,0为不支持,最大20bits,用于区分同一个设备内不同的数据流,从而使用不同的地址转换配置,比如使用SubstreamID区分同一个DMA控制器的不同通道,对于PCIe设备,SubstreamID和PASID(PASID解决多个进程之间共享单个EP)相等。

3.Stream Table Lookup

SMMU使用StreamID查找Stream table,Stream table由多个STE组成。Stream table有两种格式,第一种是Linear Stream table,第二种是2-level Stream table。

3.1.Linear Stream Table

Linear Stream table由STE数组组成,直接使用StreamID进行索引。初始化的时候,Stream table占用的内存需要一次性分配完成,内存大小为STE size的2^n次方。Linear Stream table不灵活,内存利用率低,只适合设备数量较少的场景。

线性表

3.2. 2-level Stream table

2-level Stream table的第一级是一个指针数组,里面保存了STE数组的基地址,第二级是STE数组,可能只有一个STE,也可能有多个STE。在初始化的时候只需要分配第一级的内存,第二级STE内存可以根据使用情况动态分配。第一级Stream table使用StreamID[n:x]索引,第二级Stream table使用StreamID[x-1:0]索引,x由 SMMU_(*_)STRTAB_BASE_CFG .SPLIT决定,SPLIT可以为6bits、8bits、10bits。2-level Stream table更加灵活,提高了内存使用率,适合设备数量较多的场景(通常情况下,StreamIDs数量超过64个,就需要支持2-level Stream table)。SMMU支持的Stream table格式由SMMU_IDR0.ST_LEVEL决定,ST_LEVEL为0时,只支持Linear Stream table,ST_LEVEL为1时,同时支持2-level Stream table和Linear Stream table。
2级表

上图的SPLIT为8bits,对应的2级Stream table信息如下表所示,第二级Stream table最大支持256个STE。

SPLIT
StreamID的位宽、SPLIT、第一级Stream table大小、第二级Stream table大小对应关系如下图所示。第一级Stream table每个元素大小占用8字节,第二级Stream table每个元素64字节。

SIDSIZE

3.3.StreamIDs to Context Descriptors

如下图所示,SMMU首先根据StreamID查找Stream table,找到对应的STE。STE中的S1ContextPt指向第一阶段地址转换的CD,S2TTB指向第二阶段地址转换的页表。CD中TTB0保存了用户态SMMU页表基地址,TTB1保存了内核态SMMU页表基地址。下图中只画出了线性CD表中只有一个CD的情况。需要注意的是CD只用在第一阶段地址转换中。

查找CD
下图是线性CD表中有多个CD的情况,此时需要利用SubstreamID查找对应的CD。

多个CD
如下图所示,SMMU除了支持线性CD表,还支持2级CD表。如果使用2级CD表,则STE中的S1ContextPt指向地址保存的是CD表的基地址,此时需要根据SubstreamID进行2级查找,即先根据SubstreamID高bits找到对应的L1 CD ptr,然后再根据SubstreamID低bits找到对应的CD。

2级CD表
CD表的结构和大小由STE.S1Fmt和STE.S1CDMax决定。

参考资料

Arm ® System Memory Management Unit Architecture Specification version 3.

<think>嗯,用户问有没有类似Intel的root table和context table的概念。首先,我得先确认用户对这两个概念的理解程度。Root table和context table是Intel VT-d技术中的一部分,用于IOMMU的地址翻译和访问控制。用户可能是在学习虚拟化技术,特别是硬件辅助的I/O虚拟化部分,所以需要了解其他架构是否有类似的结构。 首先,我应该回忆一下Intel VT-d中的这两个表的作用。Root table是顶层结构,用来指向各个domain的context table,而context table则包含具体设备的地址翻译和权限信息。接下来,我需要考虑其他厂商比如AMD和ARM是否有对应的机制。AMD的IOMMU(以前叫AMD-Vi,现在可能属于SMMU的一部分)应该也有类似的分层结构,比如设备表和域表。ARMSMMUv2或v3可能有不同的术语,比如Stream Table和Context Descriptors。 然后,我需要比较这些不同架构中的概念是否在功能上对应。比如,Root table可能对应AMD的Device Table,而context table可能对应AMD的Domain Table。对于ARMSMMUStream Table用来映射设备到Context Bank,而Context Descriptor保存具体的页表信息。这些结构虽然在名称和实现细节上不同,但核心功能相似,都是管理设备到内存的地址翻译和访问权限。 用户可能是在配置虚拟化环境,需要了解不同硬件平台的IOMMU设置,或者在进行跨平台开发时需要统一理解这些概念。因此,回答时需要明确各厂商的术语,并指出它们在功能上的对应关系,帮助用户建立知识框架。 另外,用户可能没有明确说明他们的使用场景,但根据问题,他们可能在进行系统级开发、虚拟化技术研究或性能优化。需要确保解释清晰,结构分明,对比不同架构的实现,并强调功能上的相似性,而不仅仅是术语差异。同时,可能需要提醒用户注意不同版本硬件之间的差异,比如ARM SMMUv2和v3的变化,以及AMD和Intel在实现上的不同点。 最后,总结这些概念的重要性,帮助用户理解它们在虚拟化和安全中的作用,比如DMA重映射、隔离和保护等,这样用户能够更好地应用这些知识到实际项目中。</think>在硬件辅助虚拟化技术中,不同厂商的IOMMU/SMMU(输入输出内存管理单元)确实存在类似Intel **Root Table(根表)**和**Context Table(上下文表)**的概念,但其具体实现和命名可能因架构而异。以下是分层对比解析: --- ### 一、Intel VT-d 的 Root Table 与 Context Table #### 1. **Root Table(根表)** - **作用**: - 作为**全局入口**,管理所有设备域(Domain)的上下文表地址。 - 每个PCIe设备通过其**Bus/Device/Function(BDF)**索引到对应的Context Table- **硬件支持**: - 由VT-d硬件直接读取,通常驻留在内存中,通过`RTADDR_REG`寄存器指定其物理地址。 - **典型场景**: - 系统启动时由Hypervisor初始化,为每个物理设备分配独立的地址翻译域。 #### 2. **Context Table(上下文表)** - **作用**: - 存储**具体设备域(Domain)的地址翻译规则**,包括: - 页表根地址(类似于CPU页表的CR3寄存器)。 - 访问权限(读/写/执行控制)。 - 中断重映射表地址(可选)。 - **层级关系**: - 每个Context Table条目对应一个设备(或一组设备),指向其级页表结构。 --- ### 、其他架构的类似概念 #### 1. **AMD IOMMU(AMD-Vi)** - **Device Table(设备表)**: - 功能类似Intel的**Root Table**,通过PCIe设备的BDF索引到**Domain Table**。 - **Domain Table(域表)**: - 类似Intel的**Context Table**,存储域特定的地址翻译配置: - 页表基地址(GPA→HPA映射)。 - 设备访问权限(DMA权限控制)。 - **差异点**: - AMD使用更简化的两级结构(Device Table → Domain Table),而Intel为多级(Root Table → Context Table → 页表)。 #### 2. **ARM SMMU(System MMU)** - **Stream Table(流表)**: - 类似Intel的**Root Table**,通过设备ID(StreamID)映射到**Context Descriptor(上下文描述符)**。 - **Context Descriptor(上下文描述符)**: - 类似Intel的**Context Table**,包含: - 页表基地址(Stage 1/Stage 2翻译)。 - 内存属性(缓存策略、权限位)。 - **扩展功能**: - ARM SMMUv3支持多级流表和分布式上下文描述符,灵活性高于Intel VT-d。 #### 3. **NVIDIA GPU虚拟化(vGPU)** - **Engine Context Table**: - 在GPU硬件中管理不同虚拟机的上下文状态,功能上类似于IOMMU的Context Table- **差异**: - 非通用IOMMU,专用于GPU计算资源的隔离与调度。 --- ### 三、功能对比表 | **厂商/架构** | **顶层表(Root Table类比)** | **域配置表(Context Table类比)** | **核心差异** | |---------------|-----------------------------|----------------------------------|--------------------------------------| | Intel VT-d | Root Table | Context Table | 严格的两级结构,支持中断重映射 | | AMD IOMMU | Device Table | Domain Table | 简化层级,支持热插拔设备动态绑定 | | ARM SMMU | Stream Table | Context Descriptor | 支持多级流表,灵活适配异构设备 | | PCIe PASID | PASID Table | Process Address Space | 基于进程标识(PASID)的细粒度隔离 | --- ### 四、技术本质 1. **共性目标**: - **地址翻译**:将设备的DMA请求从Guest物理地址(GPA)转换为Host物理地址(HPA)。 - **权限隔离**:防止恶意设备通过DMA攻击其他虚拟机或宿主机内存。 - **性能优化**:减少虚拟化开销,实现接近物理设备的I/O性能。 2. **实现差异**: - **层级深度**:Intel/AMD采用固定两级,ARM支持可扩展多级。 - **灵活性**:ARM SMMUStream Table支持通配符匹配,适配复杂设备拓扑。 - **扩展性**:PCIe PASID标准允许单设备多上下文(如SR-IOV VF的进一步细分)。 --- ### 五、实际应用示例 #### 1. **KVM/QEMU中的VFIO直通** - **Intel**: ```bash # 启用VT-d并绑定设备到vfio-pci驱动 echo 1 > /sys/class/vtcmu/device/enable ``` - **ARM**: ```bash # 配置SMMU StreamID与虚拟机映射 devicetree节点:smmuv3@... { stream-id-map = <0x0 0x100>; }; ``` #### 2. **安全加固** - 通过Context Table限制设备DMA范围: ```c // 伪代码:设置Domain页表仅允许访问0x1000~0x1FFF context_entry->addr_width = 20; // 1MB地址空间 context_entry->root_ptr = &domain_pgtbl; ``` --- ### 六、总结 - **Intel的Root/Context Table**是IOMMU地址翻译的核心数据结构,其他架构通过**功能等价但命名不同**的机制实现类似目标。 - 开发者需关注: - **硬件差异**:不同厂商的表结构初始化流程可能不同(如ARM SMMU需配置StreamID到Context的映射)。 - **虚拟化协作**:Hypervisor(如KVM、Xen)需与硬件表结构协同,确保设备直通的安全性与性能。 - **调试工具**: - Intel:`intel_iommu=on`内核参数 + DMAR日志。 - ARMSMMU内核调试选项(`CONFIG_ARM_SMMU_DEBUG`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值