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

article/2025/9/18 10:21:59

        STE包含每个stream的配置:

  1. 是否使能来之设备的流量;
  2. 是否是stage1转换;
  3. 是否是stage2转换
  4. 哪个数据结构定位到stage1的转换表

        若使用stage1,STE使用域STE.S1ContextPtr来指示内存中的一个或多个CD的地址。

        CD关联起streamID和stage1转换表基指针(转换VA到IPA),基于stream的配置以及ASID。若使用SubStreamID,多个CD表示多个stage1的转换,每个SubstreamID指向一个。当stage1转换没有使能时SubStreamID指向的事务会被终止。

        如果使用stage2,STE包含stage2转换表基指针(将IPA转换为PA)和VMID。如果多个设备都与某个特定的虚拟机相关,这意味着他们共享stage2转换表。多个STE可能都映射到同一个stage2转换表。

        NOTE: ARM期望当hypervisor软件存在时,hypervisor管理stream表和stage2转换表。CD和stage1的转换表由guest OS来管理。另外,hypervisor可以充分使用stage1转换来实现自己的内部目的。当不使用hypervisor时,单个OS管理stream表和CD。要了解更多,可查章节3.6。

        当事务带SubstreamID时,配置使能substreams,SubstreamID标识了选择stage1转换上下文的CD。在这个配置中,若substreamID没有使用时,行为依赖于STE.S1DSS标志:

  1. 当STE.S1DISS=0b00,所有在事务需要携带SubstreamID,缺少SubstreamID意味着错误。当事务不带SubstreamID会被abort并event会被记录。
  2. 当STE.S1DISS==0b01时,事务不带SubstreamID可被接受且被看作它的配置是stage1 bypass。仅当事务携带SubstreamID时才会使能stage1转换。
  3. 当STE.S1DISS=0B10时,事务不带SubstreamID被接受且使用substream=0的CD。在这个配置下,带SubstreamID=0的事务被abort且event被记录。

        CD和STE结构中的ASID和VMID用来tag TLB条目(这些条目是由CD和STE的配置来创建的)。这些tag用来查找和区分不同stream的地址空间的转换,或匹配接收到broadcast TLB操作的无效化项。实现可能使用这些tag来有效的允许不同的stream共享不同的转换表。

        图6给出了一个例子,配置中StreamID用来选择线性Stream表中的STE。STE指向stage2的转换表和一个stage1配置的单个CD。然后CD指向stage1的转换表。

       图7给出了一个配置中STE指向多个CD。SubstreamID用来选择CD中的一个并且SubstreamID决定一个事务使用哪个stage1转换。

 

        图8给出了一个更复杂的情况,使用多级stream表。两个STE分别指向单个CD,第三个CD指向多级CD表。使用多级,在不需要很大的连续物理表的情况下可以支持多个streams和substream。

        即将来的事务处理如下步骤:

(1)如果SMMU全局disable(比如SMMU_CR0.SMMUEN=0),事务会pass through SMMU且无任何地址修改。全局属性,如内存类型或共享型,被应用到SMMU的SMMU_GBPA寄存器。或者SMMU_GBPA寄存器可以被配置为abort所有的事务。

(2)若步骤(1)中的全局bypass没有使用时,

        a. STE被定位到;

        b. STE使能stage2事务,STE包含stage2的转换表基地址;

        c. STE使能stage1事务,CD被定位到。若STE使能stage2转换,从使用stage2转换表中的IPA空间取出CD。否则从PA空间取出CD。

(3)若配置有效,发起转换:

        a. 若stage1被配置为转换,CD包含转换表基地址。若STE的stage2被使能时要求进行stage2转换。否则stage1跳过转换,输入地址直接到stage2;

        b. 若stage2被配置为转换,STE包含发起nested walked的stage1转换表(若使能),或IPA的正常walk。否则,stage2跳过转换,stage2的输入地址被作为输出地址。

(4)具有有效的配置的事务在转换过程中没有fault时,会有输出的地址(内存属性)。

        NOTE: 上述时序描述了非安全stream的路径。若支持两个安全状态时,安全状态的事务也类似,除了SMMU_S_CR0.SMMUEN和SMMU_S_GBPA控制bypass,stage2不支持。

        这些步骤要求实现能够缓存数据。章节16.2描述了配置和转换结构的缓存。

       此外,event可能发生在处理过程中的多个阶段,以此来阻止进一步处理。若事务不能找到有效的配置或者遇到不支持的类型,它将以abort终止,并event被记录。如果事务进展到转换阶段,fault可能在转换的任一阶段产生。CD和STE特有的配置用来决定事务是否终止或是否stall,暂缓软件fault解决,看章节3.12。

        使用VA到IPA或IPA到PA来描述两个阶段转换。

        NOTE: 一些涉及到SMMU输入的系统使用BA。术语VA重点表示SMMU的输入,也可能与PE进程的虚拟地址空间一样。

        若没有特别说明,转换表和他们的配置域与ARMV80A PE的转换系统一样。

        若SMMU没有实现两个阶段的任一阶段,它会配置为固定bypass转换。还有其他的限制,比如,配置一个不存在的stage是无效的。SMMU至少支持一个转换stage。

 

 


http://chatgpt.dhexx.cn/article/3i1TAwf6.shtml

相关文章

ARM_SMMU_上

本篇参考 arm 官网公开材料 和 小崔的linux 专栏 https://zhuanlan.zhihu.com/p/105005488 宋宝华老师MMU介绍 armv8-armv9 MMU深度学习 MMU简介 MMU是Memory Management Unit的缩写,中文名是内存管理单元。它是一种负责处理中央处理器(CPU)…

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

3. 配置和转换的查找 图中 描述了配置查找和转换查找所涉及的相关概念。 正如3.3.2中所描述的,传入的事务首先受配置查找的约束,而SMMU决定怎样开始进行事务的转换。这涉及到找到合适的STE,如果有必要也需要CD。 配置的查找不依赖于输入的地址…

简谈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);} }…