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

13

我是一个Cortex A的新手,我知道ARM采用了弱序内存模型,并且有三种互斥的内存类型:

  • 强序
  • 设备
  • 一般

我大致理解了一般内存的作用,以及强序和设备的含义。然而,强序和设备之间的差异令我感到困惑。

根据Cortex-A系列程序员指南,两者唯一的区别在于:

写入强序内存只有在到达被该写入访问的外围设备或内存组件时才能完成。

可以在写入设备内存之前允许其完成。

我不太确定这意味着什么。我猜想,对于使用强序或设备类型的内存访问顺序应与程序员代码一致(无乱序访问)。但如果类型为设备,CPU可能会在访问内存时执行下一个指令,而如果类型为强序,则会等待访问完成。

如果我理解有误,请纠正我,并请告诉我这样做的意义。

提前感谢。

1个回答

13

需要理解的一点是,内存类型对指令流没有任何保证效果 - 它们只影响内存访问的顺序。(它们可能对特定处理器在特定方式中与特定互连有特定影响 - 但软件永远不能依赖于此。)

另一个需要理解的重要事情是,即使是强排序的内存,也只对同一外设的访问提供隐式的排序保证。任何比这更严格的排序要求都需要使用显式的屏障指令。

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

现在,在这个背景下 - 描述设备和强排序内存之间差异的更简单的方法是,设备内存访问可以被缓冲 - 在处理器本身或互连中。区别在于,缓冲的访问可以在终点完成(甚至开始)之前向处理器发出完成信号。 这提供了更好的性能,但代价是失去了任何错误条件的同步报告。


那么,@unixsmurf,你认为在MMIO设备寄存器中应该使用什么,比如GIC?从解释来看,我认为对于GIC来说它应该是强序的,对吗?请发表评论。 - user435739
@mSO:设备内存是最有效的选项,因为它允许使用写缓冲。强序也可以实现正确的功能,但可能会对性能产生负面影响。 - unixsmurf
unixsmurf,我已经发布了一个类似的问题,链接在这里http://stackoverflow.com/questions/20265729/stage-2-memattr-long-descriptor-arm-pte-query,你能否请评论一下,谢谢。 - user435739
1
底部的表格表明,即使类型已经被强制排序,跨不同类型区域的排序仍然得到执行。我建议这意味着跨适当排序的设备访问也会得到维护。 - Henry Gomersall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接