SMMU架构手册之数据结构和转换流程(3)

article/2025/9/18 10:18:16

3. 配置和转换的查找

        图中 描述了配置查找和转换查找所涉及的相关概念。

        正如3.3.2中所描述的,传入的事务首先受配置查找的约束,而SMMU决定怎样开始进行事务的转换。这涉及到找到合适的STE,如果有必要也需要CD。

        配置的查找不依赖于输入的地址,它取决于:

  1. SMMU全局寄存器的配置;
  2. 传入事务的StreamID;
  3. 传入事务的SubstreamID(如果有应用)

        配置查找的结果是找到转换的stream或substream相关的配置,包括:

  1. stage1 转换表的基指针,ASID,以及用于修改的转换表解析或walk的属性(比如转换粒度);
  2. Stage2转换表的基指针,VMID,以及用于修改的转换表解析或walk的属性;
  3. stream相关的属性,如stream相关的streamworld(异常级别,转换区域)。

        转换查找过程逻辑上与PE侧内存地址转换系统工作一样。输出给系统的是物理地址,它取决于:

  1. 输入地址;
  2. StreamWorld(安全状态和异常级别),ASID和VMID(由前一级来提供)

        上图呈现在转换查找中被用到的TLB。ARM希望SMMU使用TLB来缓存转换而不是对每个事务都进行TTW,但不是强制的。

        NOTE:为了清楚起见,图3.7没有呈现错误上报路径或从stage2转换获取CD(这也需要访问TLB或TTW)。实现可以选择上述一些步骤的flatten或组合,但需要保持相同行为。

        缓存的事务与标明转换区域的streamworld相关联。Streamworld相当于PE中的异常级别。

        事务的streamworld是由插入转换的配置决定的。缓存的转换的streamworld由STE的安全状态决定,STE.Config域/STE.STEW域/SMMU_CR2.E2H或SMMU_S_CR2.E2H配置。可以查看章节 5.2 stream table entry中的STE.STRW域。

        除了插入到TLB外,Streamworld影响TLB的查找,TLB无效化的不同类型的范围。SMMU的实现不要求区分EL2和EL2-E2H的缓存转换。

        对于TLB无效化行为,查看章节3.17 TLB tagging, VMIDs, ASIDs and participation in broadcast TLB maintenance。

每个转换与以下streamworld相关:

NS-EL1 在PE侧,等同于非安全的EL1

NS-EL2 等同于非安全的EL2(当E2H没有使用时,不带ASID)

NS-EL2-E2H 等同于非安全的EL2(当E2H使用时,带ASID)

  1. EL2 等同于非安全的EL2((当E2H没有使用时,不带ASID)
  2. EL2-E2H 等同于安全的EL2(当E2H使用时,带ASID)

        Secure 等同于以下其一:1. 当运行在AArch32 EL3时,单个转换区域被安全EL1和安全EL3使用;2. 当运行在AArch64 EL3时,安全EL1;区域要求AISD,若支持安全stage2,需要VMID.

EL3 等同于AArch64 EL1和EL3

        NOTE:在SMMU中Streamworld能够区分不同的转换区域,不同的转换区域与在不同异常级别的不同软件相关。比如,在安全EL3下对地址0X1000的转换与在非安全EL2下对地址0x1000的转化是不同的。通常,ARM期望为stream配置的streamworld,能够匹配软件控制stream或device的异常级别。

        术语“any-EL2”用来描述NS-EL2和S-EL2的共同行为。术语“any-EL2-E2H”用来描述NS-EL2-E2H和S-EL2-E2H的共同行为。

   在ARMV8-A 的MMU也同样,若定义了独一无二的输入参数{streamworld, VMID,ASID,Address},那么转换也是唯一的。

比如,下列是唯一的且可以在转换缓存中存在:

  1. 带相同的地址,但不同的ASID的条目;
  2. 带相同的地址和ASID,但不同的VMID;
  3. 带相同的地址和ASID,但不同的streamworld;

架构上,由streamID和substreamID来区分,转换时不唯一的。这会引起两个结果?:

  1. 一组事务的输入参数{streamID, substreamID}的转换时不唯一的。两个stream可以被配置为相同的转换配置,从配置查找中生成的ASID/VMID可以区分一组共享的转换缓存条目;
  2. 多个streamID/substreamID配置可能导致相同的ASID/VMID/streamworld配置,这时它必须维护能够影响TLB查找的相同配置。比如,两个stream,都配置为stage1,NS-EL1且AISD=3,这两stream必须使用相同转换表基地址和转换粒度。

在本文档中,术语TLB用来表示转换缓存的概念,由streamworld/VMID/ASID/VA来标识。

SMMU缓存维护命令分为两组:

  1. 配置缓存的维护,依赖于streamID和substreamID;
  2. 转换缓存的维护,依赖于地址/ASID/VMID/streamworld;

第二组命令直接匹配可能在PE侧有效的广播TLB维护操作。


http://chatgpt.dhexx.cn/article/KKx0cwHt.shtml

相关文章

简谈MMU与SMMU

在服务器的处理器firmware开发中,经常会遇到大家讨论MMU和SMMU的概念,而且会进一步讨论的相关的TLB和huge TLB概念。实不相瞒,一开始我是非常懵逼的,只是写code而已,最多是有用到MMIO来写device的寄存器,MM…

arm smmu 学习(1)

文章linux 4.14 代码分析smmu 流程 linux 在驱动找到对应的设备后会执行driver_probe_device 函数,具体dev和drv 匹配参考文章链接 driver_probe_device->really_probe->dma_configure->of_dma_configure int of_dma_configure(struct device *dev, str…

linux内核笔记之SMMU代码分析

2020/06/10: first version, 主要介绍smmu驱动的初始化流程 在前一篇博文ARM SMMU学习笔记中, 介绍了SMMU的一些基本概念以及SMMU地址转换的基本流程,本文主要分析linux kernel中SMMUv3的代码(drivers/iommu/arm-smmu-v3.c) linux kernel版本…

smmu实现分析

1.概述 1.1 SMMU产生背景 了解SMMU产生背景之前,首先要了解DMA工作原理。因为SMMU的产生主要是为了解决虚拟化平台下的DMA重映射问题。 DMA,外设和内存的连接件,用于解放CPU。外设可以通过DMA,将搜集的数据批量传输到内存&…

ARM SMMU介绍

SMMU:system Memory Management Unit系统存储管理单元 类似于CPU流水线中的MMU,SMMU负责翻译IO主设备对内存等从设备的读写请求地址,例如DMA,主设备读写请求也会发送到CPU物理地址总线上。IO设备上的DMA会对CPU物理地址总线上的内…

SMMU学习这一篇就够了

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈引流关键词: SMMU,mmu500,mmu600,mmu700,system mmu,Non-cacheable,Cacheable, non-shareable,inner-shareable,…

arm64 smmu 驱动笔记

设备StreamID:sid struct iommu_fwspec {const struct iommu_ops *ops;struct fwnode_handle *iommu_fwnode;void *iommu_priv;unsigned int num_ids;u32 ids[1]; //ids保存的某device使用的streamID }; 通过iommu_fwspec_add_id函数设置: stru…

ARM_SMMU_下

SMMU驱动代码分析 本文主要分析linux kernel中SMMUv3的代码(drivers/iommu/arm-smmu-v3.c) linux kernel版本是linux 5.7, 体系结构是aarch64 SMMU的作用是把CPU提交给设备的VA地址,直接作为设备发出的地址,变成正确的物理地址,访问到物理内…

arm SMMU

相当于x86下面的IOMMU,是不同架构的不同实现。统一在linux中的IOMMU框架内部,都由结构体 iommu_device 管理。 SMMU的作用是将设备的DMA请求地址翻译成可用的物理地址,当不开启SMMU时也可以直接使用DMA来搬运内存。SMMU是为了安全考虑中间加…

smmu梳理

smmu 用途 用途: (参考引用见 参考资料章节) 访问非连续的地址 现在系统中很少再预留连续的memory,如果Master需要很多memory,可以通过SMMU把一些非连续的PA映射到连续的VA,例如给DMA,VPU&…

Android 底层知识-SMMU

1.首先了解下MMU MMU是Memory Management Unit的缩写,中文名是内存管理单元。它是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处…

理解SMMU基本原理和基本概念

(阅读本文前假设您已经熟悉了MMU工作原理) 什么是SMMU/IOMMU, 有什么作用: SMMU 有MMU完全一样的能力,当设备以DMA方式工作时,连接在它上面的IOMMU/SMMU可以将设备所使用的地址进行进一步的转换,完全和MM…

SMMU 介绍

SMMU在系统中位置和作用 SMMU功能与MMU功能类似,将IO设备的DMA地址请求(IOVA)转化为系统总线地址(PA),实现地址映射、属性转换、权限检查等功能,实现不同设备的DMA地址空间隔离。 SMMU软硬件交互过程 硬件结构如下图所示: SMMU处…

MMU和SMMU/IOMMU使用场景和区别,SMMU技术与cache

目录 1.各种MMU 2.各种MMU的使用场景 2.1 各自的使用场景 2.1.1 地址转换 2.1.2 内存保护 3.MMU和SMMU的区别 4. MMU/SMMU/IOMMU与cache 5.扩展阅读 1.各种MMU MMU是memory manage unit 内存管理单元; SMMU是system memory manage unit 系统内存管理单元&a…

junit runwith

junit的runwith是给单元测试中增加一些附属特性,今天在看flink源码的时候,发现其使用了一个注解RunWith(Parameterized.class),有点好奇,于是研究了一下这个注解的使用。 这个注解产生的背景是这样的:flink中的每个功能…

springmvc--@runwith(springrunner.class)报错

目录 解决方法  1)代码 这是一个文件上传的测试类 不重要,重要的是 RunWith(SpringRunner.class)报错! import com.github.tobato.fastdfs.domain.StorePath; import com.github.tobato.fastdfs.domain.ThumbImageConfig; import com.github.tobato.fastdfs.service.FastF…

run()和start()方法区别

多线程原理:相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!等CPU选中你就是轮到你,你就run(),当CPU的运行的…

关于@RunWith注解的一点问题

问题引入 今天在用IDEA写一个springboot测试的时候,碰到了一个问题。 SpringBootTest public class ServiceTest {Autowiredprivate IUserService userService;Testpublic void testSelectById(){User byId userService.getById(1);System.out.println(byId);} }…

Java学习笔记-@RunWith(SpringRunner.class)

我们在进行Test测试时,除了要保证测试的包和启动包是同一个路径下,并且需要在Test测试类上加上RunWith(SpringRunner.class)注解,否则的话会直接报一个NullPointerExecption的错误! RunWith(SpringRunner.class)的作用&#xff1…

@RunWith和 SpringJUnit4ClassRunner ----junit4和Spring一起使用

今天在看Spring的Demo的时候,看到了如此单元测试的写法 如下: RunWIth(SpringJunit4ClassRunner.class) ContextConfiguration(locations {"classpath:applicationContext.xml"} public class MyTest { Test public void hehe() { //....... }…