3 将虚拟地址转换位物理地址
当处理器发出64位虚拟地址用于指令获取或数据访问,MMU硬件将虚拟地址转化为对应的物理地址。对于虚拟地址的高16位[63:47]必须为全0或全1,否则地址会触发fault。
最低位用于给出选择的区域的偏移,因此MMU联合物理地址从最低位的块表entry和原始地址的最低位来产生最后地址。
架构也支持taggged地址。这时地址的最高8位会被忽略(不再作为地址的一部分)。这意味着这些位用于其他,比如,记录指针的信息。
简单的地址转换仅涉及一级的查找。它假定我们使用42位虚拟地址,16KB粒度。MMU转换一个虚拟地址如下:
(1)若VA[63:42]=1时,TTBR1用于第一个页表的基地址。当VA[63:42]=0时,TTBR0用于第一个页表的基地址。
(2)页表包含8192个64位的页表项,通过VA[41:29]来索引。MMU从页表读取level2相关的页表项。
(3)MMU检查页表项并验证要求的内存访问是否允许。假设它是有效的,内存访问是允许的。
(4)在上图中,每个页表项涉及一个512M的页(block描述符)。
(5)从页表项中bit[47:29]取出并形成物理地址的bit[47:29]。
(6)因为我们由512M页,虚拟地址的bit[28:0]被取出形成虚拟地址[28:0]。
(7)返回PA[47:0],伴随着从页表项的其他信息。
实际上,这个简单的转换过程限制了你是如何切分你的地址空间。取代仅使用一级转换表,第一级页表项也可以指向第二级页表。
这样一个OS可以将大块的虚拟内存切分为更小的页。对于二级页表,第一级描述符包含二级页表的物理基地址。与处理器要求的虚拟地址对应的物理地址在第二级描述符中找到。
下图显示了一个64位起始于stage1,二级的64KB页的转换。
每个二级表与一个或多个一级项相关。你可以有多个一级描述符,它们指向相同的二级页表,这意味着你将几个虚拟位置别名到相同的物理地址。
上图描述了两级查找的情况。同样,它假设64KB粒度和42位虚拟地址空间:
(1)若VA[63:42]=1时,TTBR1用于第一个页表的基地址。当VA[63:42]=0时,TTBR0用于第一个页表的基地址。
(2)页表包含8192个64位的页表项,通过VA[41:29]来索引。MMU从页表读取level2相关的页表项。
(3)MMU检查页表项并验证要求的内存访问是否允许。假设它是有效的,内存访问是允许的。
(4)在上图中,level2页表项涉及level3页表的地址(table描述符)。
(5)从level2页表项的VA[47:16]取出并形成level3页表的基地址。
(6)虚拟地址的VA[28:16]用于索引level3页表项。MMU从页表中读取相关的level3页表项。
(7)MMU检查level3页表项并检验要求的内存访问是否被访问。假设它是有效的,内存访问时允许的。
(8)在上图中,level3页表项涉及64KB页(page描述符)。
(9)从level3页表项取bit[47:16]并用于形成PA[47:16]。
(10)因为我们使用64KB页,VA[15:0]形成PA[15:0]。
(11)返回完整的PA[47:0],伴随着从页表项的其他信息。
3.1 安全和非安全地址
理论上安全和非安全物理地址空间是分开的,且并行存在的。系统可以被设计位有两个完全分开的内存系统。但是,大多数真实的系统将安全和非安全作为访问控制的属性。正常world(非安全)可以访问非安全物理地址空间。安全world可以访问连个物理地址空间。这也是通过转换表来控制的。
这也有cache一致性的暗示。比如,因为安全0x8000和非安全0x8000为不同的物理地址,它们可能同时在cache中。
在安全和非安全内存在不同的位置的系统中,这也没有问题。它们更可能在相同的位置。最理想的一个内存系统将阻塞安全访问到非安全内存和非安全访问到安全内存。实际上大多数仅阻塞非安全访问到安全内存。这意味着相同的物理内存在cache中可能有两个,安全和非安全。这通常为编程错误。为避免这个,安全world必须通常使用非安全访问到非安全内存。
3.2 配置和使能MMU
写系统寄存器来控制MMU,没有顺序要求。这些事件的结果只有在上下文同步事件时才可见。
MSR TTBR0_EL1, X0
MSR TTBR1_EL1, X1
MSR TCR_EL1, X2
ISB
MRS X0, SCTLR_EL1
ORR X0, X0, #1
MSR SCTLR_EL1, X0
ISB
这是flat映射的需求,它使我们知道在写SCTLR_EL1.M后哪个指令直接运行。如果我们看到写的结果,它为使用新的转换区域。如果我们没有看到写的结果,它仍在执行指令VA+4,这时VA=PA。ISB在这里没有帮助因为我们不能保证它是下一个指令。
3.3 当MMU禁用时的操作
当MMU stage1禁用时,当HCR_EL2.DC位被设置使能数据cache时,对于非安全EL0和EL1,默认的内存类型为正常non-shareable,inner Write-back Read-write allocation,outer Write-back READ-write allocate。