我真的是Cortex A的新入门,我知道ARM应用弱序内存模型,并且有三种互斥的内存类型:
- 强序
- 装置
- 正常
我大致了解 Normal 是什么,以及强序和设备是什么意思。然而,强序和设备之间的差异让我感到困惑。
根据 Cortex-A 系列程序员指南,唯一的区别是:
对强序内存的写入只有在到达写入访问的外围设备或内存组件时才能完成。
允许在写入设备内存到达写入访问的外设或内存组件之前完成。
我不太确定这是什么真正的体现。我猜,使用强序或设备键入的内存的访问顺序应该与程序员的代码一致(没有无序访问)。但是,如果键入了设备,则 CPU 可能会在访问内存时执行下一条指令,如果键入强顺序,它只会等待访问完成。
如果我错了,请纠正我,请告诉我这样做的意义是什么。
提前谢谢。
需要理解的重要一点是,内存类型对整个指令流没有保证的影响 - 它们只影响内存访问的顺序。(它们可能对以特定方式与特定互连集成的特定处理器产生特定影响 - 但软件永远无法依赖这一点。
另一个需要了解的重要事情是,即使是强序内存也仅对访问同一外设提供排序的隐式保证。任何比这更严格的订购要求都需要使用明确的屏障说明。
第三个要点是,由于内存类型而发生的任何隐式内存访问排序都不会影响对其他内存类型的访问顺序。同样,如果您的应用程序具有这样的依赖项,则需要显式屏障指令。
现在,在这种背景下 - 描述设备和强序内存之间区别的更简单方法是,设备内存访问可以在处理器本身或互连中缓冲。不同之处在于,缓冲访问可以在端点完成(甚至启动)之前向处理器发出完成信号。这提供了更好的性能,但代价是丢失了任何错误条件的同步报告。