通常为了保证计算机的整体性能,内存和CPU之间的通信需保证很高的传输速率,然而这受限制于内存的大小和昂贵的硬件实现,传输速率和内存容量大小的关系遵循“Smaller is faster”原则,使用更大容量的内存势必会增加传输延迟降低性能。为优化计算机整体性能,ARMv8存储系统中提供了多级Cache用于达到内存容量大小和传输延迟之间的平衡。可以从以下两个方面来描述典型的分级存储架构 。
。PE发出虚拟地址VA转换需求 |
。虚拟地址VA经过Address translation的TTW机制试图得到物理地址PA. |
。物理地址PA有可能在Level1 Cache、Level2 Cache或者Main Memroy中. |
。若PA既不在Cache 也不在Main Memroy,将出现Page fault,然后由OS实现重新加载. |
。若顺利找到PA,则给回PE继续执行. |
寄存器 <=> Cache
程序猿/编译器
Cache <=> Main Memroy
Cache 控制器,由HW实现
Main Memroy <=> Disk
OS 操作系统
Disk <=> Tape
用户
PoU
指当前CPU的指令Cache、数据Cache、TTW所共享一个存储点,每个CPU在Cache L1都有独立的IC和DC,Cache L2对于同一个CPU集群是共享的,POU一般值的是L2范围内的内存.
PoC
指所有CPU的指令Cache、数据Cache、TTW所共享一个存储点,不同的CPU集群有对于不同的Cache L2,所以对于不同的CPU集群而言,他们共同的存储点是内存,这就是POC拓扑结构.
属性 | Note |
Normal (普通) | 。读写经过Cache 。支持乱序,内存访问顺序同编程顺序可能不一致 。支持预读取? 。支持内存非对齐访问 |
Device (设备) | 。读写不经过Cache 。不支持乱序内存访问 。不支持预读取 。不支持内存非对齐访问 |
Shareability (可共享性) | 指当前内存页表项的数据是否可以同步到其它CPU上,多核CPU调用带有该属性页表项的数据,一旦某个CPU修改了数据,那么系统将自动更新到其它CPU的数据拷贝,实现内存数据一致性. |
Cacheability (可缓存性) | 指当前内存页表项对于的数据是否可以加载到Cache当中. |
地址类型 | 最大支持位宽 | 寄存器配置 |
PA(Physical address) | 48 bit | ID_AA64MMFR0_ELx.PARange |
OA(Output address) | 48 bit | TCR_ELx.IPS |
IA(Input address) | 48 bit | TCR_ELx.T0SZ、TCR_ELx.T0SZ |
IPA(Intermediate Physical address) | 48 bit | VTTBR_EL2.T0SZ |
• 两种存储类型
big-endianness (大端存储) | 指字数据或者半字数据的最高字节存放在内存最低字节地址上,而字数据或者半字数据低字节则存放在内存地址的最高地址中. |
little-endianness (小端存储) | 指字数据或者半字数据的最高字节存放在内存最高字节地址上,而字数据或者半字数据低字节则存放在内存地址的最低地址中.和大端存储相反. |
• 寄存器配置
异常等级 | 精确数据访问 | Stage 1 TTW | Stage 2 TTW |
EL0 | SCTLR_EL1.E0E | SCTLR_EL1.EE | SCTLR_EL2.EE |
EL1 | SCTLR_EL1.EE | SCTLR_EL1.EE | SCTLR_EL2.EE |
EL2 | SCTLR_EL2EE | SCTLR_EL2.EE | N/A |
EL3 | SCTLR_EL3.EE | SCTLR_EL3.EE | N/A |
• VMSA的基本思想是程序、数据、堆栈的总和内存大小可以超过物理存储器的大小,OS把当前使用的部分送入到内存中,而把其他未被使用的部分保存在磁盘上。例如,对一个16MB的程序和一个内存只有4MB的机器,OS通过调度,可以决定各个时刻将哪4M的内容送入内存中,并在需要时在内存和磁盘间交换程序片段,这样就可以把这个16M的程序运行在一个只具有4M内存机器上了。
• VMSA 提供MMU(Memory Management Unit)用于实现PE访问内存的VA->PA地址转换和控制、访问权限、内存属性决定和检查等。
• 相关命名解析
VMSA | 描述ARMv8地址转换方案,包括Stage 1 和 Stage 2两个阶段. |
VMSAv8-32 | 描述AArch32 地址转换方案,包括单一阶段的地址转换 |
VMSAv8-64 | 描述AArch64 地址转换方案,包括单一阶段的地址转换 |
• 地址类型
VA(虚拟地址) | 我们可看到的地址都是虚拟地址,最大宽度支持48bit,AArch64下VA地址空间分为顶部VA和底部VA两个子区域,每个VA子区域最大支持256TB. 。底部VA:0x0000_0000_0000_0000 =>0x0000_FFFF_FFFF_FFFF 。顶部VA:0xFFFF_0000_0000_0000 =>0xFFFF_FFFF_FFFF_FFFF 。VA[55]决定使用top VA还是bottom VA |
IPA(中间物理地址) | 如果不支持Stage 2转换,那么IPA == PA。如果支持Stage2,那么IPA: 。 Stage 1 的OA (Output address) 。 Stage 2 的IA (Input address) 。 最大支持48bit |
PA(物理地址) | 物理内存单元映射中的地址,可以看做是PE到内存系统的输出地址(OA),PA最大支持48bit |
。Secure状态下只支持Stage 1地址转换
。Non-secure EL1/EL0既支持Stage 1 也支持Stage 2地址转换.
。只有EL2才支持Stage 2,所以Stage 2只为EL2服务的
。使用64bit descriptor entries(描述符实例)
。最高支持4个Level的地址查找
。Input address (IA)最高支持48bit
。Output address (OA)最高支持48bit
。转换颗粒尺寸支持三种大小:4KB16KB64KB (和Page size概念类似)
• 三种转换粒度解析
属性 | 4KB granule | 16KB granule | 64KB granule |
转换表中有最大条目数 (项) | 512 | 2048 | 8192 |
每级lookup最大可解析地址位 | 9-bit | 11-bit | 13-bit |
Page Offset | VA[11,0]=PA[11,0] | VA[13,0]=PA[13,0] | VA[15,0]=PA[15,0] |
寄存器配置 (x = 0,1,2,3) | TCR_ELx.TG0 =’00’ | TCR_ELx.TG0 =’10’ | TCR_ELx.TG0 =’01’ |
• 4KB转换粒度图解
。最大支持4个Level 的Lookup ,Level0~Level3每个层级的查找最大可以解析9-bit数据 |
。IA[38:30]对应Linux中的PGD,IA[29:20] =>PMD,IA[20:12] => PUD, IA[11:0] => PTE |
。Page Offset IA[11:0] == OA[11:0] |
。Translation Table 所需内存Size较大 |
。最大支持4个Level 的Lookup ,Level1~Level3每个层级的查找最大可以解析11-bit数据
。Level 0 是IA[47],只有1个bit宽,比较特殊.
。Page Offset IA[13:0] == OA[13:0]
。Translation Table 所需内存Size中等
。最大支持3个Level 的Lookup ,Level2~Level3每个层级的查找最大可以解析13-bit数据
。Level 1 是IA[47:42],只有6个bit宽,只能解析2^6 个条目
。Page Offset IA[15:0] == OA[15:0]
。Translation Table 所需内存Size最小
。TTBR 寄存器提供Level 0查找的基地址,通过此基地址和IA[n:39] => 查找到Level 1基地址
。Level 1基地址结合IA[38:30]=> 查找到Level2 的基地址
。Level 2基地址结合IA[29:21]=> 查找到Level3 的基地址
。Level 3基地址结合IA[20:12]=> 查找物理页框所在地址OA
。最后得到需要的物理地址PA[47:0] <= OA[47:12] + IA[11:0]
。Stage 2有级联table的概念,可以减少level的级数
。所谓级联就是假如有IA[40:0],而Level1解析地址段为IA[38:30],超过了2个bit,而2^40 = 2^2*2^38,所以相当于要2^2个这样的translation table来实现级联解析。ARMv8规定,Stage 2最多支持4-bit级联,也就是最大级联2^4 == 16个translation table级联解析.以达到减少查找level的目的.
。VTTBR_EL2寄存器提供初始Level查找基地址,Stage 2只为EL2服务
。同Stage 1,Level 1支持1GB的内存block,Level 2支持2MB的内存block
类型
Bit[1:0]
Note
Invalid
X0
表明无效描述符,出现Page fault
Block
01
表明是匹配到一块Block内存范围基地址
Table
11
表明是匹配到下一级Translation Table基地址
类型
Bit[1:0]
Note
Invalid
X0
表明无效描述符,出现Page fault
Reserved
01
保留
Page
11
表明是个Page基地址,给出内存页的输出地址.bit[47:12]
转换粒度
Note
4KB
。Level 0不支持block 转换
。Level 1 转换表block描述符映射关联1GB的IA范围
。Level 2 描述符映射关联2MB的IA范围
16KB
。Level 0/1不支持block 转换
。Level 2 转换表block描述符映射关联32MB的IA范围
64KB
。Level 1不支持block 转换
。Level 2 转换表block描述符映射关联512MB的IA范围
NSTable |
Stage 2 不支持 | 安全模式标志位 |
APTable | 下一级levellookup的access permission | |
XNTable | 下一级level lookup的执行权限 | |
PXNTable | 限制XN的特权bit,P是指特权. |
• 地址类型
VA(虚拟地址) | 保存在PC,LR,SP中的看得到地址都是虚拟地址VA 。VA最大支持32bit宽,地址空间最大到4GB 。地址范围:0x00000000~0xFFFFFFFF |
IPA(中间物理地址) | 如果不支持Stage 2转换,那么IPA == PA。如果支持Stage2,那么IPA: 。 Stage 1 的OA (Output address) 。 Stage 2 的IA (Input address) 。 AArch32的IPA最大支持40bit宽(使用16MB转换颗粒) |
PA(物理地址) | 物理内存单元映射中的地址,可以看做是PE到内存系统的输出地址(OA),PA最大支持32bit宽 |
• 地址转换规
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』