【华为云技术分享】ARMv8-A存储模型概述(1)

上两期中我们介绍了处理器存储模型的一般概念,这一期我们将介绍ARMv8-A架构中的地址转换系统。

一、VMSAv8-64地址转换系统

虚拟内存系统架构(Virtual MemorySystem Architecture, VMSA)提供了管理单元(MemoryManagement Unit, MMU),MMU控制了处理器的地址转换、访存控制,决定并检查与访存地址相关的内存属性(memory attribute,可理解为地址对应的内存域的性质,例如该内存域的数据一致性需要满足什么要求等)。VMSAv8-64是ARMv8架构的处理器在AArch64执行状态下的虚拟内存系统架构。一般来说,MMU的输入是包含访存虚拟地址在内的访存请求,而输出的是用于访问物理存储空间的地址和与该地址相关的内存性质。有时在地址转换过程中会发生异常,这些异常会导致地址转换失败,它们被称为MMU错误。

VMSAv8-64地址转换系统中有三种地址类型,分别是虚拟地址,中间地址和物理地址。指令使用的地址是虚拟地址,包含指令地址和数据地址。这就意味着在PC、LR、ELR和SP等寄存器中的地址是虚拟地址。

在AArch64执行状态下,虚拟地址有48bit,从0x0000_0000_0000_0000到0x0000_FFFF_FFFF_FFFF,因而可以访问256TB的虚拟地址空间。对于EL1和EL0中的转换过程,虚拟地址范围可以被分为两个部分:0x0000_0000_0000_0000到0x0000_FFFF_FFFF_FFFF和0xFFFF_0000_0000_0000到0xFFFF_FFFF_FFFF_FFFF,两部分都为256TB。这两部分中,一个部分用TTBR0_EL1寄存器所指向的转换表进行地址转换;另一部分使用TTBR1_EL1寄存器所指向的转换表进行地址转换。在软件中,通常一个部分用于用户空间,另一个部分用于内核空间。

中间地址是两阶段地址转换中第一阶段的输出地址和第二阶段的输入地址。中间地址也是48bit。

物理地址是处理器发送给物理存储系统的地址。安全状态下的虚拟地址可以被映射为非安全状态或安全状态下可以访问的物理地址;非安全状态下的虚拟地址只可以被映射为非安全状态下可以访问的物理地址。

不同异常级别和安全状态下虚拟地址到物理地址的转换过程如下图所示[1]:

在VMSAv8-64地址转换系统中,地址转换系统的地址转换组织方式有两种:

  1. 单一的地址转换方式,将地址从虚拟地址(VirtualAddress, VA)直接转换为物理地址(Physical Address,PA);

  2. 两阶段地址转换,第一阶段将虚拟地址转换为中间物理地址(IntermediatePhysical Address , IPA),第二阶段将中间物理地址转换为物理地址。

VMSAv8-64地址转换系统的转换粒度规定了转换过程中从虚拟地址到物理地址的页大小和转换表的大小。其中页是地址转换过程中能定义虚拟地址到物理地址映射关系的最小存储单元。

MMU由系统寄存器控制,系统寄存器提供了对地址转换的各个阶段的控制,包括使某个阶段无效。操作系统等软件只能控制两阶段地址转换中的第一阶段,但无法察觉第二阶段的存在。对于没有MMU错误发生的地址转换过程,输入地址(一个转换阶段的输入地址,单一的地址转换方式中为虚拟地址;两阶段地址转换中第一阶段的输入地址为虚拟地址,第二阶段的输入地址为中间物理地址)被转换为输出地址(一个转换阶段的输出地址,单一地址转换阶段中为物理地址;两阶段地址转换中第一阶段的输出地址为中间物理地址,第二阶段的输出地址为物理地址),如果有MMU错误发生,可以用系统寄存器报告。

转换的每一个阶段都会使用转换表(translationtable,即页表),转换表中保存了地址映射关系和内存属性。每次查询地址转换表只会解决输入地址中的有限bit的转换,因此完成转换需要进行多次查询。除了包含输入地址对应的输出地址,转换表的表项还包含如下信息:

  • 对于安全状态发起的地址转换,输出地址属于安全状态下可访问的内存区域还是非安全状态下可访问的区域;

  • 存储访问控制信息;

  • 内存域属性。

其中访问控制信息决定处理器在当前状态下是否能访问表项中的输出地址,如果没有相关的访问权限,那么访存行为就不会发生,并且会产生MMU错误。例如在异常级别EL1和EL0的第一阶段地址转换中的数据访问控制可以由2bit的AP值控制,AP的编码含义如下表所示[1]:

部分被经常访问的转换表表项被存储在TLB(Translation Lookaside Buffer,即页面高速缓存)中,而转换过程中第一个被查询的转换表在内存中的基地址被存储在TTBR(Translation Table Base Register,即页表基址寄存器)中。一次输入地址到输出地址的转换需要一系列转换表查询(translationtable lookup ),这一系列查询操作被称为转换表遍历(translation table walk),最后一次查询将返回输出地址的高bit位、被访问的内存域的属性和访问控制信息。非最后一次查询将会查询到下一级的转换表的基址和层级属性信息(如下一级转换表在安全内存中还是非安全内存中),一个典型的查询过程如下图所示[1]:

VMSAv8-64的转换表满足如下格式要求:

  • 最多支持四级地址查询;

  • 最多支持48bit输入地址;

  • 最多支持48bit输出地址;

  • 支持4KB、16KB和64KB三种转换粒度。

三种转换粒度对应的配置参数如下表所示[1]:

转换粒度越大则转换表能包含更多的条目,从而一次查询能解析输入地址的更多bit位。另一方面粒度越大则页越大,从而用于表示页偏移的bit位(直接映射的bit位)越多。以上两个因素决定了粒度越大则转换表的层数越少。

二、结语

本期我们介绍了ARM v8-A架构中地址转换和访问控制的机制,下一期中我们分析一下ARMv8-A 架构的缓存机制。

参考文献

  • ARM® Architecture Reference Manual ARMv8, for ARMv8-A architecture profile

原创文章 1164 获赞 5546 访问量 136万+

猜你喜欢

转载自blog.csdn.net/devcloud/article/details/105642001