Java教程

ARMv8-A编程指导之MMU(2)

本文主要是介绍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 configuration instruction
TLB无效化命令参数描述
ALLEnTLB无效化所有,ELn
ALLEnISTLB无效化所有,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)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!