一些词汇。
DVM: Distributed Virtual Memory,相互传递广播TLB维护操作的消息的协议;
RC: PCI-E的Root Complex,如下图:
Endpoint(EP): 一个PCIE功能,用于一个SMMU client节点设备的context
PASID: Process Address Space ID,一个PASID是一个Endpoint的本地ID,所以一个系统中一个PASID可能用很多遍,注意:PASID除了名字与PE的ASID有点靠近外,其实与ASID完全没关系。
ATS: PCIE提供给远端Endpoint TLB的Address Translation Service。
Split-stage ATS: 两阶段页表转化的SMMU提供的方式,ATS用1阶段页表转换,non-ATS用2阶段页表转换。
PRI:PCIE引入的Page Request Interface,是ATS的一个扩展项,是其允许Endpoint请求OS提供映射了页面的内存给DMA使用。
ATOS:SMMU用系统可访问的寄存器提供VA-IPA/PA转换;额外的,VATOS提供了次要的寄存器组,用于虚拟机直接使用,不过只能做VA-IPA转换。
TT:Translation table,就是页表,arm架构的。
TTD:Translation table discriptor,就是PTE。
HTTU:Hardware Translation Table Update,在访问或写入相关页面后,硬件自动更新相关页面的Access flag、Dirty state,就叫HTTU。
SSD:Secure StateDetermination,将client设备的一段数据流与Secure或Non-secure控制联系起来的方法,确定这段数据流的Secure或Non-secure设置。
STE:Stream table entry,流表条目。
L1STD:1级STE,用于两级流表。
CD:Context Descriptor,Context描述符。
L1CD:1级CD,用于两级CD表。
Client deivce:由SMMU控制访问系统内存行为能力的设备。
Bypass:一种设置,把一个阶段的页表转换不做任何地址转化,这种直通模式就是使用bypass;如果一个SMMU没有实现哪一阶段地址转换,那么这个阶段的地址转换就可以认为是Bypass了。
Stage N-only:一种对一段数据流的转换设置,两阶段转换只转换一个阶段,另一个Bypass掉,可以是设置成这样,也可以是SMMU被实现成这样
E2H:EL2 Host Mode,详见VHE的说明。
TR:Translation Request,用于在一个PCIE ATS的context中,请求SMMU或是其他实现来做请求中心节点做地址转换。
简述:
SMMU的行为与PE的MMU类似,在系统I/O设备的DMA请求发到系统之前进行地址转换。SMMU只为DMA工作。
对DMA的地址进行转换是为了隔离或快捷,为了将设备通讯与转换相关联,还要区分SMMU背后不同的设备,转换请求还需要除了地址、R/W、权限以外的额外属性,用来分辨一个流的属性;不同的流在逻辑上与不同的设备相关联,SMMU可以对不同的流实现不同的转换或检查,就算一个系统装置有一个client设备,SMMU的概念仍然不会变,只是会只有一个流。
一个系统中可能有很多个SMMU,一个SMMU可能为1个或多个设备做转换。
SMMU支持2阶段页表转换的方式与PE的MMU相似,1阶段VA->IPA,2阶段IPA->PA;1阶段转换主要是为了在一个VM内的DMA隔离,2阶段一般在支持虚拟化扩展的设备实现将DMA设备的虚拟化到VM内。
SMMUv1仅支持不多的context/流,通过寄存器设置,有限的可扩展性;SMMUv2把SMMUv1拓展到了ARMv8-A页表转换格式,更大的寻址空间,同样有限的context/流的支持。SMMUv1/v2映射一个数据流到基于寄存器的context内,这个context指示使用什么转换表、转换设置;同样也可能支持2阶段转换,而转换时的流会使用额外生成的ID来标志,还有一个次级ID来标志一个流或一组流的Security状态;基于寄存器的设置限制了context的数量,支持上千个context是不可能的,一个活着的数据流是可能在任意时间触发转换的,而能支持的context量其实就是同时活着的流的数量;比如说1000个连接了但没有数据出现的网卡,虽然此时没有数据出现,但是它的数据可能在任意时间出现,也就是DMA会在任意时间请求转换,所以就会占context,而且不能多设备分时使用SMMU,毕竟这是硬件中断级别的使用,切换SMMU的context足以让硬件里缓存耗尽,数据丢失了吧。
SMMUv3.0特性:
SMMUv3提供了支持PCIE Root Complexes的特性,并通过支持大量并行转换contex支持其他潜在大量I/O的系统。
1. 基于内存的配置结构,支持大量的流;
2. 具体实现可仅1阶段、仅2阶段或两阶段页表转换,从寄存器里可以查到具体实现,其他根据实现选配的参数也可以查到;
3. 最高16bit ASIDs
4. 最高16位VMIDs
5. 根据ARMv8.1虚拟内存系统架构实现地址转换和保护;SMMU转换表可与PE们共享,允许软件选择共享页表或SMMU私有页表;
6. 49bit VA,符合ARMv8-A的2x48bit转换表输入大小;
还支持选配实现如下:
1. 可仅1阶段、仅2阶段或两阶段;
2. 可支持aarch32 LPAE页表格式和aarch64页表格式;
3. 支持安全域的流;
4. 广播TLB失效;
5. HTTU可能仅支持硬件更新Access flag或同时支持硬件更新Access flag和Dirty state,也可以没有HTTU;
6. 兼容Root Complex的PCIE ATS 和 PRI;
7. 16K和64K页表粒度,建议基于服务器的系统架构实现应实现两阶段页表转换并使用64KB页表,这样与PE相对齐;
SMMU3.0不与之前SMMU版本兼容;
SMMU3.1特性:
在SMMU3.0的基础上,增加了:
1. 支持ARMv8.2-A:可以支持52bit VA、IPA、PA;Page-Based Hardware Attribute;2阶段页表的EL0 vs EL1 execute never控制;ARMv8.2中的PE的概念Common not Private(CnP)并不适用于SMMU架构,因为所有SMMU转换都按common处理
2. 其他一些cache相关和性能监视相关的特性
SMMU_AIDR[7:0]==0x0000是SMMUv3.0,0x0001是SMMUv3.1
SMMU在系统中的位置:
下图中有两种SMMU的使用方式,一种使用方式是两个client设备经SMMU从系统取数据,设备的DMA可以使用VA、IPA或是其他总线地址,SMMU将这地址转换成PA;另一种使用方式是SMMU与PCIE的Root Complex一对一的接到了一起,Root Complex自己管着一票Endpoints,SMMU给出了一个ATS port来支持PCIE的ATS和PRI,当然,这个ATS也可能是兼容其他非PCIE设备的相近功能。
正在发生的对slave设备的访问不能避过SMMU,一般来说,master在SMMU后面,就像PE在MMU后面一样,因此进行中的对slave设备的访问需要master的SMMU调和,如果master没有SMMU,那么他的DMA就可以有全系统访问能力,因此其DMA需要软件设置,这种情况下,只有最高权限才能进行设置。
SMMU有自己的程序接口,能接受系统软件的设置和维护,并且每个SMMU都要单独设置,SMMU也能访问自己的设置,比如TTW;SMMU自行访问内存的通道是否与其client设备共享由具体实现决定。
ARM推荐项:SMMU桥接I/O设备的DMA地址应该到系统或物理地址;SMMU应该放在设备master或是I/O与系统之间;SMMU不应该串联到一起,就是说,SMMU到内存或其他slave设备不应经过另一个SMMU。
系统的SMMU master接口想要实现IO一致行,从而为SMMU的client设备提供IO一致性访问;SMMU slave接口对从设备来的数据流不需要任何一致性支持;另外,由于在传出方向上没有地址转换,因此侦听流量不能从系统到达客户端设备,因此无法将全一致性设备放在SMMU后面。
将SMMU作为包含全一致性缓存的复杂设备的一部分是可行的,就像PE的MMU一样;不过这意味着缓存就需要用物理地址做标签。
图片发自简书App
上图给出了3个实现SMMU的实例:
1. SMMU A作为一个复杂设备的一部分,仅为此设备提供转换服务,ARM希望这种实现在出了设备特定控制以外,还提供SMMU编程接口,这一设计可以提供专用的无需争用的页表翻译和TLB;
2. SMMU B则是一个集成了页表转换、编程接口和TTW功能的整体,两个client设备使用此SMMU作为DMA进入系统的途径;
3. SMMU C是分布式的,并能提供多路径到系统实现更高带宽;其包含:一个中心TTW,具有自己的master接口用于获取转换和配置结构及队列,还有自己的slave接口用于接受编程访问,这个单元可能包含一个宏TLB和配置的缓存;一些远程TLB单元,在转换miss时向中心TTW发转换请求,并将结果缓存到本地,图上展示了两个远程TLB单元,一个远程TLB单元通过1个端口支持了一组3个设备,还有一个远程TLB单元连接到PCIE Root Complex。第二个远程TLB单元还提供了一个ATS接口给Root Complex,所以PCIE Endpoint可以使用ATS来发起转换请求到中心TTW。
在所有情况下,在软件层看来都是一个设备连接在逻辑上分开的SMMU后面;所有实现都像是读写操作从client设备到离散的SMMU,但实际上其实是设备直接执行读写到系统,但使用SMMU提供的转换。这样就允许一个SMMU驱动驱动起各种不同的SMMU实现,设备可能整合了TLB或整个SMMU来提升性能,但是紧耦合的TLB可能还被用于为全一致设备缓存提供物理地址的匹配;无论实现什么实现方式,他们的行为对于软件来说是一致的。
SMMU的三个软件接口
1. 基于内存的数据结构,用来将设备映射到负责转换client设备地址的转换表;
2. 基于内存的环形缓冲队列,一个用于放给SMMU的指令的指令队列,一个用于放从SMMU回报事件的事件队列,一个PRI队列来接收PCIE页面请求;注意只有支持PRI服务的SMMU才有PRI队列,这个额外的队列允许处理从设备来的PRI请求而不与回报事件队列混合。
3. 一组寄存器,有些仅用于安全域,用于发现和SMMU全局配置。
SMMU用寄存器指示内存数据结构、队列的基地址,用寄存器提供功能检测和标志寄存器,另有全局控制寄存器控制启动队列处理和流量转换;如果支持安全域,则存在一组附加的寄存器来允许安全域软件维护安全域设备数据结构,在安全域指令队列中发布命令、读取安全域事件。
在允许1阶段转换的虚拟化场景,GuestOS被提供了与SMMU实现完全相同的编程接口,所以GuestOS会认为自己控制着一个真的SMMU,拥有同样的指令、事件、可选的PRI、队列、以及基于内存的数据结构,不过只有1阶SMMU。