aarch64 是否有不可缓存=缓存旁路加载或存储指令?

问题描述

在sparc架构中,有ASI(地址空间指示符)传递给加载、存储指令,所以如果ASI是0x20,缓存就像IO访问一样被绕过。即使在页表中将内存范围设置为可缓存,也会绕过缓存。这有时非常方便,例如使用变量等在内核之间同步时
aarch64 架构中是否有类似的东西?我查看了指令内容,但在加载/存储指令列表中找不到任何内容

解决方法

ARMv8 没有这样的指令。加载/存储指令访问内存取决于映射属性。

提及的 LDNPSTNP 指令并非旨在绕过缓存。

加载/存储非时间对指令向内存系统提供一个提示,即访问是非时间的或流式的,并且在不久的将来不太可能重复。这意味着不需要数据缓存。但是,根据内存类型,指令可能允许预加载内存读取和内存写入 收集以加速批量内存传输。 (Arm 架构参考手册)

所以缓存仍然可能涉及。


例如,在 Cortex-A53 TRM 之上,明确声明将涉及缓存。

非时间负载
由非临时加载指令 (LDNP) 发出的缓存请求仅分配给 L2 缓存。分配策略使得该行可能比其他行更早被替换。

对于内核同步,您可以查看 ARMv8 手册以了解锁实现(又名原子)和自旋锁。

附带说明,请检查您的芯片文档。许多现代芯片都具有特殊的硬件功能,可以提供基于硬件的缓存一致性接口。