[ARM CortexA]强排序和设备内存类型之间的区别

Cod*_*mer 9 memory assembly arm cortex-a8

我真的是Cortex A的新入门者,我知道ARM应用了弱有序的内存模型,并且有三种互斥的内存类型:

  • 强有序
  • 设备
  • 正常

我粗略地了解了Normal的用途以及强烈有序和设备的含义.然而强烈有序和设备之间的差异让我感到困惑.

根据Cortex-A系列程序员指南,唯一的区别是:

对强排序存储器的写入只有在到达写入访问的外设或存储器组件时才能完成.

允许写入器件存储器在到达写入访问的外设或存储器组件之前完成.

我不太确定这个的真正含义是什么.我猜测,使用强排序或设备键入的内存访问顺序应该与程序员的代码一致(没有无序访问).但是如果输入类型的设备,CPU在访问内存时可能会执行下一条指令,如果键入强排序,它将只是等待访问完成.

如果我错了,请纠正我,请告诉我这样做是什么意思.

提前致谢.

uni*_*urf 7

需要理解的一点是,内存类型对整个指令流没有任何影响 - 它们只影响内存访问的顺序.(它们可能对使用特定互连以特定方式集成的特定处理器产生特定影响 - 但软件永远不能依赖它.)

另一个需要理解的重要事项是,即使是强排序内存,也只能在访问同一外设时提供有序排序保证.任何比这更严格的订购要求都需要使用明确的屏障指令.

第三个要点是,由于内存类型而发生的任何隐式内存访问排序都不会影响对其他内存类型的访问顺序.同样,如果您的应用程序具有这样的依赖关系,则需要显式屏障指令.

现在,在此背景下 - 描述设备和强排序内存之间差异的一种更简单的方法是可以缓冲设备内存访问 - 在处理器本身或互连中.不同之处在于,缓冲访问可以在终端完成(或甚至启动)之前用信号通知处理器完成.这样可以以丢失任何错误条件的同步报告为代价提供更好的性能.