13. 内存排序
如果您的代码直接与硬件或在其他内核上执行的代码交互,或者如果它直接加载或写入要执行的指令,或修改页表,您需要注意内存排序问题。
如果你是应用程序开发者,硬件交互可能是通过设备驱动,与其他内核的交互是通过 Pthreads 或其他多线程 API,而与分页内存系统的交互是通过操作系统。在所有这些情况下,相关代码都会为您处理内存排序问题。但是,如果您正在编写操作系统内核或设备驱动程序,或者实现管理程序、JIT 编译器或多线程库,则必须对 ARM 体系结构的内存排序规则有一个很好的理解。您必须确保在您的代码需要显式内存访问顺序的地方,您能够通过正确使用屏障来实现这一点。
ARMv8 架构采用弱排序的内存模型。一般来说,这意味着内存访问的顺序不需要与加载和存储操作的程序顺序相同。处理器能够相对于彼此重新排序内存读取操作。写入也可以重新排序(例如,写入组合)。因此,硬件优化(例如缓存和写入缓冲区的使用)以提高处理器性能的方式起作用,这意味着所需的带宽可以减少处理器和外部存储器之间的延迟,并且隐藏与此类外部存储器访问相关的长延迟。
对普通内存的读取和写入可以由硬件重新排序,仅受数据依赖性和显式内存屏障指令的影响。某些情况需要更严格的排序规则。您可以通过描述该内存的转换表条目的内存类型属性向核心提供有关此的信息。
非常高性能的系统可能支持诸如推测性内存读取、多