Cha*_*Kim 2 assembly arm memory-address cpu-cache arm64
在sparc架构中,有一个ASI(地址空间指示符)被传递给加载、存储指令,因此如果ASI为0x20,则像IO访问一样绕过缓存。即使内存范围在页表中设置为可缓存,缓存也会被绕过。这有时非常方便,例如使用变量在核心之间进行同步等
。aarch64 架构中有类似的东西吗?我查看了指令内容,但在加载/存储指令列表中找不到任何内容。
ARMv8没有这样的指令。加载/存储指令访问内存取决于映射属性。
提及LDNP
和STNP
说明并不是为了绕过缓存。
加载/存储非时间对指令向内存系统提供一个提示:访问是非时间的或流式的,并且在不久的将来不太可能重复。这意味着不需要数据缓存。然而,根据存储器类型,指令可能允许预加载存储器读取并收集存储器写入以加速批量存储器传输。(Arm架构参考手册)
所以仍然可能涉及缓存。
例如,在 Cortex-A53 TRM 之上,明确指出将涉及缓存。
非临时加载
由非临时加载指令 (LDNP) 发出的高速缓存请求仅分配给 L2 高速缓存。分配政策使得该线路有可能比其他线路更早更换。
对于核心同步,您可以查看 ARMv8 手册以了解锁实现(又名原子)和自旋锁。
作为旁注,请检查您的芯片文档。许多现代芯片都具有特殊的硬件功能,可以提供基于硬件的缓存一致性接口。