ARMv8-A编程指导之MMU(2)
2022/2/13 11:16:31
本文主要是介绍ARMv8-A编程指导之MMU(2),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.1 TLB
TLB是MMU中最近访问的页转换的缓存。对于处理器的每次内存访问,MMU检查TLB中转换是否缓存。如果请求的地址转换在TLB中命中,地址转换立即有效。
每个TLB项通常不仅包含物理和虚拟地址,也包含属性如内存类型,cache策略,访问权限,ASID,和VMID。如果TLB不包含处理器发出的虚拟地址的有效转换(TLB未命中),发出一个外部的转换表walk或转换表查找。MMU中的硬件使其读取内存中的转换表。如果转换表walk没有导致page fault,最新加载的转换可能被缓存在TLB中。TLB的具体结构根据ARM处理器的实现存在差异。
如果OS修改了TLB中缓存的转换表项,OS负责无效化stale TLB项。
当执行A64代码,TLBI为TLB无效化指令。
TLBI <type><level>{IS}{,<Xt>}
下列list给出type域的一些公共选择。
ALL 所有TLB项
VMALL 所有TLB项。当前guest OS的stage1
VMALLS12 所有TLB项。当前guest OS的stage1和stage2
ASID 在Xt中匹配ASID项
VA Xt中VA和ASID指定的项
VAA Xt中VA指定的项,任意ASID
EL3,EL2,EL1的异常级别的操作应用于自己的虚拟地址空间。IS域指明了这仅应用于inner shareable项。
NOTE: 看Context Switching关于ASID和转换表配置。
<level>域简单的指明了操作应用的异常级别虚拟地址空间。
IS域指明了这仅用于inner shareable项。
TLB无效化命令 | 参数 | 描述 |
ALLEn | TLB无效化所有,ELn | |
ALLEnIS | TLB无效化所有,ELn,inner shareable | |
ASIDE1 | 通过ASID的TLB无效化,EL1 | |
ASIDE1IS | 通过ASID的TLB无效化,EL1,inner shareable | |
IPAS2E1 | 通过IPA的TLB无效化,stage2,EL1 | |
IPAS2E1IS | 通过IPA的TLB无效化,stage2,EL1,inner shareable | |
VAAE1 | 通过VA的TLB无效化,所有ASID,EL1 | |
VAAE1IS | 通过VA的TLB无效化,所有ASID,EL1,inner shareable | |
VAALE1IS | 通过VA的最后一级的TLB无效化,所有ASID,EL1,inner shareable | |
VAEn | 通过VA的TLB无效化,ELn | |
VAEnIS | 通过VA的TLB无效化,ELn,inner shareable | |
VALEn | 通过VA的最后一级的TLB无效化,ELn | |
VALEnIS | 通过VA的最后一级的TLB无效化,ELn,inner shareable | |
VMALLE1 | 通过VMID的TLB无效化,stage1, EL1 | |
VMALLE1IS | 通过VMID的TLB无效化,stage1, EL1,inner shareable | |
VMALLS12E1 | 通过VMID的TLB无效化,stage1和stage2,EL1 | |
VMALLS12E1IS | 通过VMID的TLB无效化,stage1和stage2,EL1,inner shareable |
下面的代码例子显示了写一个由inner shareable内存后置转换表的时序:
<writes to translation tables> DSB ISHST TLBI ALLE1 DSB ISH ISB
比如,修改转换表项,使用指令:
TLBI VAE1,X0
这将无效化X0寄存器指定的地址相关的转换表项。
TLB能够缓存的转换表项是固定的。你可以通过最小化转换表遍历造成的外部内存的访问并获取更高的TLB命中率来获取更高的性能。ARMv8-A架构提供了contiguous block特性来有效的使用TLB空间。每个转换表block项包含一个contiguous位。当设置时,这个位告诉TLB它可以仅缓存一个表项来覆盖多个block。一次查找索引到一个contigous块覆盖的地址范围。因此TLB可以位一个定义的地址范围缓存一个表项,使其能够在TLB中存储更大范围的虚拟地址。
为了使用contiguous位,这些连续的block必须相连,即它们必须与虚拟地址的连续范围相关。它们必须起始于对齐的边界,有一致性的属性,并指向转换的同一级别的连续的输出地址范围。要求的对齐为4KB粒度的VA[20:16]或64KB粒度的VA[28:21]对于所有地址都相同。下列要求:
(1)16*4KB相连的块给出了4KB粒度的64KB项;
(2)32*32MB相连的块给出了L2描述符的1GB表项,128*16KB给出了当使用16KB时L3描述符的2MB表项;
(3)32*64KB相连的块给出了64KB粒度的2MB表项。
如果这些条件都满足时,一个程序错误产生,这会导致TLB abort或查找奔溃。这些错误包括:
(1)一个或多个表项不包含contiguous位;
(2)其中一个表项的输出超过对齐的范围。
对于ARMv8架构,错误的使用不允许EL0和EL1有效的地址范围的权限的检查,或EL3空间的错误访问。
这篇关于ARMv8-A编程指导之MMU(2)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-14后台交互资料入门指南
- 2024-11-14如何轻松创建项目环境:新手入门教程
- 2024-11-14如何抽离公共代码:初级开发者指南
- 2024-11-14Python编程入门指南
- 2024-11-14Python编程入门:如何获取参数
- 2024-11-14JWT 用户校验:简单教程与实践
- 2024-11-14Pre-commit 自动化测试入门指南
- 2024-11-14Python编程基础
- 2024-11-14Server Action入门教程:轻松掌握服务器操作
- 2024-11-14Server Component入门教程:轻松搭建服务器组件