AR# 47548

Zynq-7000 SoC,APU-不确保对相同内存位置的读访问排序。

描述

在SMP环境中运行的处理器可面临着一个读访问被后续相同内存位置的读访问越过。该问题仅发生在对标记为正常内存写回共享的内存区域进行读访问时。

这不正常且有多种解决方法。

解决方案

影响:

很小。这有多种解决方法。

规避措施:

大多数多处理代码编写风格不会暴露此问题。所以此问题预期将影响依赖此读取顺序行为的特定编码区域。参考解决详情以获得更多信息。

受影响的配置:

使用一个或两个处理器的系统。

受影响的器件修订版本:全部。无计划修复。参考 (Xilinx Answer 47916) - Zynq-7000 SoC 芯片版本差异。

 

ARM结构和一致性的通用规则需要读取相同内存位置,并以顺序被观察。由于一些内部回放通道机制,处理器可看到一个读访问被后续相同存储位置的读访问越过,因此不会按程序顺序观察到该值。

此问题只能发生在工作模式为SMP的处理器中,并在标记为正常内存写回的共享内存区域。

解决方法详情

  • 在读取顺序严格的易失性内存中要求使用LDREX指令而不是标准的LDR指令。
  • 插入DMB指令至需要严格排序规则的受影响的LDR之间。这是用于工具链整合的推荐解决方法。

无DMB屏障指令序列

带DMB屏障指令序列

结果是处理器2能偶尔错误地观察到Rx == <valueB> and Ry == <valueA>。

数据顺序已保存。

 

 

处理器上1

处理器上1

STR <valueA>, [loc]

STR <valueA>, [loc]

 

 

STR <valueB>, [loc]

STR <valueB>, [loc]

 

 

处理器上2

处理器上 2

LDR Rx, [loc]

LDR Rx, [loc]

 

DBM

LDR Ry, [loc]

 

 

LDR Ry, [loc]

 

DMB

此问题可影响所有内存装载指令格式,除了LDREX, LDREXB, LDREXH and LDREXD。

对高级语言而言,编译器经常优化掉或干脆重新对相同内存位置的多访问排序,因此只有声明为volatile的内存位置才考虑受此问题影响。此外,两负载之间的任何阻碍都可有效阻止引发问题的条件,因此只会影响无锁编程方法。

注: LDREX的使用变幻莫测,除非访问正常内存,不然第二序列将不能作为访问所有内存中易失对象的解决方法。

链接问答记录

主要问答记录

Answer Number 问答标题 问题版本 已解决问题的版本
47916 Zynq-7000 SoC 器件:芯片修订差异 N/A N/A
AR# 47548
日期 06/13/2018
状态 Active
Type 设计咨询
器件