Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory [ARM CortexA]强顺序和设备内存类型之间的差异_Memory_Assembly_Arm_Cortex A8 - Fatal编程技术网

Memory [ARM CortexA]强顺序和设备内存类型之间的差异

Memory [ARM CortexA]强顺序和设备内存类型之间的差异,memory,assembly,arm,cortex-a8,Memory,Assembly,Arm,Cortex A8,我是Cortex a的新手,我知道ARM采用弱有序记忆模型,有三种相互排斥的记忆类型: 有序的 装置 正常的 我大致理解了什么是正常,什么是强有序和设备。然而,强有序和器件之间的差异让我感到困惑 根据Cortex-A系列程序员指南,唯一的区别在于: 对强顺序内存的写入只有在到达写入所访问的外围设备或内存组件时才能完成 允许对设备存储器的写入在到达写入设备访问的外围设备或存储器组件之前完成 我不太清楚这句话的真正含义是什么。我猜,访问强顺序或设备类型的内存的顺序应该与程序员的代码一致(没有无序

我是Cortex a的新手,我知道ARM采用弱有序记忆模型,有三种相互排斥的记忆类型:

  • 有序的
  • 装置
  • 正常的
我大致理解了什么是正常,什么是强有序和设备。然而,强有序和器件之间的差异让我感到困惑

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

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

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

我不太清楚这句话的真正含义是什么。我猜,访问强顺序或设备类型的内存的顺序应该与程序员的代码一致(没有无序访问)。但是,如果键入设备,CPU在访问内存时可能会执行下一条指令,如果键入强顺序,它只需等待访问完成

如果我错了,请纠正我,并请告诉我这样做的意义


提前感谢。

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

要理解的另一件重要事情是,即使是强有序内存也提供了仅针对同一外围设备的访问进行排序的隐式保证。任何比要求使用明确屏障说明更严格的订购要求

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

现在,在这种背景下——描述设备和强有序内存之间区别的一种更简单的方法是,设备内存访问可以在处理器本身或互连中进行缓冲。不同之处在于,缓冲访问可以在结束点完成(甚至启动)之前向处理器发出完成的信号。
这提供了更好的性能,但代价是丢失任何错误情况的同步报告。

so@unixsmurf在您看来,MMIO设备注册表应该使用什么?从解释来看,我认为gic的订单应该很严格,对吗?请comment@mSO:设备内存是最有效的选项-因为它允许使用写缓冲。强排序在功能上也是正确的,但可能会对性能产生负面影响。unixsmurf我在类似的行上发布了一个问题,请在这里发表意见,谢谢。底部的表格建议在强排序类型时,仍然强制执行不同类型的区域之间的排序。我认为这意味着还可以维护跨适当顺序的设备的访问。