ARMv8-A Memory systems
0x00 Intro
Firmware(or BootLoad)最重要的作用之一就是初始化系统的存储设备。使得处理器能将非易失性存储设备上的代码搬运到RAM中。存储器的初始化涉及到MMU的配置,以及相关指令的使用。为了深刻理解这些指令和配置背后的逻辑,特地学习整理了ARM v8架构的存储系统。
在研究过程中找到了一份ARM官方文档《ARMv8-A Memory Systems Version 1.0》,所以这篇文章其实也是对这份文档的理解过程。主要内容和该文档基本一致,希望原汁原味的可以直接看官方文档。另外,为了减少歧义有些地方直接使用原词汇来表达。
0x01 Memory Model
Memory Model有很多种类型,具体可以参考这篇文章: Jeff Preshing <Weak vs. Strong Memory Models>
ARMv8-A采用的是weakly ordered model。这意味着内存的真实访问顺序和程序编码的load/strore操作顺序并不完全一致。
- 针对读操作,处理器和系统相关硬件通过重组存储器的读顺序来提高数据吞吐量。
- 针对写操作,通过重组写顺序来降低处理器和外部存储器之间的带宽需求,即降低写操作的时延。
ARMv8-A硬件上通过以下技术来实现memory reorder:
- Multiple issue of instructions
处理器在一个cycle中可以发射和执行多条指令。比如某些指令可能会stall,那后续指令就会先执行。这会导致execute order和program order不一致的情况 - Out-of-order execution
因为指令多发射技术,当相互之间没有依赖关系的指令可以乱序执行。这使得某些指令stall时,不依赖这条指令的其它指令可以继续执行。这也会改变program order - Speculation
当处理器遇到条件指令时,可处理可以在获得条件之前自己预测一个条件,然后根据这个预测条件去取指并并执行。如果预测正确能提升速度。预取指令的操作就会改变program order - Speculative loads
如果是通过推测执行的方式从cacheable位置执行load指令,那推测执行的load指令可能会导致cache line的刷新。因为是推测执行的,如果预测条件是错的,那这个cache更新也是多余的。分支预测技术是推测执行技术的基础。因为分支预测后执行的命令就是推测执行的过程。推测执行会将原本非必须的数据提前更新到cache中,这也是导致spectre漏洞的原因。 - Load and store optimizations
处理器在外部memory进行读写会有比较长的时延,为了减少频繁操作降低时延,处理器可能会把几条stores合并成一个访问操作来降低时延。 - External memory system
如果一个设备(slave device)可以被多个其它设备(master device)同时访问。不同master device访问同一个slave device所需要的cycles不同,这也可能会导致大家看到的数据不一致的问题。 - Cache coherent multi-core processing
不同core看到的cache更新顺序可能会不一样,外部memory也如此。 - Optimizing compilers
编译优化也可以重组指令执行顺序。
0x02 Memory type
ARMv8-A定义了两大memory类型,分别是Normal和Device。所有的memory都被配置为这两种类型中的一种。
Normal memory
Normal memory包括 RAM、Flash、ROM。这种类