内存管理-21-Arm64架构内存管理-1-初探

基于ARMv8/ARMv9


一、内存管理单元

1. TLBI 指令使tlb无效

TLBI <type> <level>{IS} {, <Xt>}

TLBI WAE1, X0 使与寄存器X0中指定的地址关联的条目无效

2. 每个异常级别,即EL3、EL2 或 EL1, 都有自己的虚拟地址空间。

3. 操作系统有多个任务同时运行,没个任务都有自己独特的转换表,内核在一个任务切换到到另一个任务时,会同时进行转换表的切换。然而部分内存仅由内核使用,并且具有固定的虚拟地址到物理地址的映射,其中的转换表项很少改变。

3. 映射表基地址在映射基础寄存器 TTBR0_EL1 和 TTBR1_EL1 中指定。当VA的高几位都是0时,TTBR0指向的转换表被选中,当VA的高几位都是1时,TTBR1被选中。可以启用VA标记,将前八位排除在检查之外。寄存器 TCR_EL1 定义了被检查最有效位的数量,T0SZ[5:0]和T1SZ[5:0]字段中给出必须全部为0或全部为1的最有意义位的数量。
I: 比如指定16位,那么有效虚拟地址是 0x0--0x0000ffff_ffffffff 和 0xffff0000_00000000--0xffffffff_0xffffffff.

TCR_EL1 还控制着EL1和EL0的其它内存管理功能:
IPS(中级物理地址大小)字段控制最大输出地址大小。如果映射指定了超出此范围的输出地址,则访问失败。000=32位物理地址,101=48位。
TG(映射颗粒)字段用于控制映射颗粒的大小,TG1和TG0字段分别给出内核或用户空间颗粒的大小,00-4KB, 01=16KB, 11=64KB.

EL2和EL3只有一个TTBR0,没有TTBR1,这意味着如果EL2和EL3使用的是AArch64, 它只能使用地址范围 0x0--0x0000ffff_ffffffff.

4. 安全和非安全地址
理论上,安全和非安全物理地址空间是相互独立,并行存在的。大多数系统将安全和非安全视为访问控制属性。正常(非安全)世界只能访问不安全的物理地址空间。安全世界可以访问两个物理地址空间。同样,这是通过映射表控制的。

5. 颗粒大小对映射表的影响

4KB:
Level0[47:39]--Level1[38:30]--Level2[29:21]--Level3[20:12]--Offset[11:0]
16KB:
Level0[47]--Level1[46:36]--Level2[35:25]--Level3[24:14]--Offset[13:0]
64KB:
Level0[47:42]--Level1[41:29]--Level2[28:16]--Offset[15:0]

6. 缓存配置
MMU使用映射表和映射寄存器来控制哪些内存位置是可缓存的,MMU控制缓存策略、内存属性和访问权限,并提供虚拟地址到物理地址的映射。

7. 缓存策略
MMU映射表也定义了内存系统中每个块的缓存策略。被定义为Normal的内存区域可能被标记为可缓存或不可缓存。

8. 地址表配置
除了在TLB中存储单个映射关系外,可以配置将MMU将映射表存储在可缓存的内存中,这通常比从外部存储器读取映射表要快的多,TCR_EL1有额外的字段控制这个。

9. 和EL3的转址
ARMv8-A架构的虚拟化扩展引入了第二个映射阶段。当系统中存在一个管理程序时,可能会出现一个或多个客户操作系统,这些系统继续使用 TTBRn_EL1, MMU的操作没什么变化。
管理程序必须在转换过程中执行一些额外的操作步骤,以便在不同的客户操作系统之间共享物理内存。第一阶段,将虚拟地址VA转换为中间物理地址IPA, 通常这是在操作系统的控制之下完成的。第二阶段,由管理程序控制,执行将IPA到最终物理地址PA的转换。
管理程序和安全监控器也有他们自己的代码和数据的第一阶段映射表,直接从VA到PA进行映射。

第二阶段的转换,将中间物理地址转换为物理地址,使用一套额外的表,由管理程序控制。这必须通过写入管理程序配置寄存器 HCR_EL2 来明确启用。这个过程只适用于非安全的EL1/EL0访问。

这个第二阶段的映射表的基地址在虚拟化映射表基础寄存器 VTTBR0_EL2 中指定,它指定了内存底部的一个连续的地址空间。支持的地址空间大小在虚拟化映射控制寄存器 VTCR_EL2 的 TSZ[5:0]字段中指定。该寄存器的TG字段指定颗粒大小,SL0字段控制第一级表的查找。

管理程序EL2和安全监控器EL3有自己的一级表,直接从虚拟地址空间映射到物理地址空间。表的基地址分别在 TTBR0_EL2 和 RTTBR0_EL3 中指定。

10. 访问权限
访问权限是通过转换表项来控制的,控制一个区域是可读还是可写,还是可读可写。可以分别设置非特权的EL0和特权访问的EL1、EL2、EL3.

11. 上下文切换
进程上下文切换需要保存或恢复以下一些或全部元素:

通用寄存器X0--X30
高级SIMD和浮点寄存器V0-V31
一些状态寄存器
TTBR0_EL1和TTBR0
线程进程ID(TPIDxxx)注册。
地址空间ID(ASID)

 

二、内存排序

1. 如果你的代码直接与硬件或在其它核上执行的代码交互,或直接加载或写入要执行的指令,或修改页表,则需要注意内存排序问题。可以通过内存屏障来实现这一点。

2. ARMv8架构采用弱排序的内存模型。一般来说,这意味着内存访问的顺序不需要与加载和存储操作的顺序相同。处理器能够相对于彼此重新排序内存读取操作。写入也可以重排序(例如写入组合)。

3. 对普通内存的读取和写入可以由硬件重新排序,仅受内存依赖性和显示内存屏障指令的影响。某些情况需要更严格的排序规则,可以通过描述该内存转换表条目的内存类型属性向内核提供有关信息。

4. 非常高性能的系统可能支持诸如推测性内存读取、多出发出指令、乱序执行等技术。

5. 内存类型
ARMv8架构支持两种互斥的内存类型,所有内存区域都配置为这两种类型中的一种,即 NormalDevice。除了内存类型外,属性还提供对可缓存性、可共享性、访问和执行权限的控制,可共享和可缓存属性仅适用于普通内存。设备区域始终被视为不可缓存且可外部共享。对于可缓存位置,可以使用属性向处理器指示缓存分配策略。

内存类型不直接编码在转换表条目中,相反,每个块条目都为内存类型表指定一个3位索引,存储在内存属性间接寄存器 MAIR_ELn 中,有8个条目,每个条目8位。

6. 设备内存
有四种不同类型的设备内存,适用于不同的规则:

Device-nGnRnE 限制性最强(相当于v7架构中的强有序内存)
Device-nGnRE
Device-nGRE
Device-GRE 最低限制

Gathering or non Gathering(GornG)此属性确定是否可以将多个访问合并到此内存区域的单个总线事务中。
Re-ordering(Ror nR)这决定了对同一设备的访问是否可以相互重新排序。
Early Write Acknowledgemlent (Eor nE)这确定是否允许处理器和正被访问的从设备之间的中间写缓冲区发送写完成的确认。

7. 内存屏障


8. 内存属性

 

 

参考:

12.内存管理单元: https://armv8-doc.readthedocs.io/en/latest/12.html
13.内存排序: https://armv8-doc.readthedocs.io/en/latest/13.html

posted on 2024-07-23 13:59  Hello-World3  阅读(113)  评论(0编辑  收藏  举报

导航