描述
CPU具有存储缓冲区,其具有用于正常存储器区域的高速缓存线内的合并能力。只要对同一缓存行执行写访问,缓冲区就会继续合并数据。存储缓冲区有一个小计数器,可在一段时间后将数据推送到内存,以提供存储的外部可见性。问题是每次合并新数据时都会重置计数器。如果软件代码序列正在循环,并且继续在同一缓存行中重复写入数据,则写入数据的外部可见性可能会无限期地延迟。
解
影响: |
次要。如果外部代理在有限的时间内依赖于写入数据的自动可见性,则此问题可能会产生性能问题,或者最坏情况下的实时锁定方案。 |
解决方法: |
在错误的写操作之后,在可能受此错误影响的代码序列中插入DMB操作,以确保任何外部代理可以看到写入的数据。 |
受影响的配置: |
使用一个或两个处理器的系统。 |
受影响的器件版本: | 全部,没有计划修复。请参阅Zynq-7000器件咨询主答复记录 |
该问题只能发生在正常内存区域。下面描述了两个示例场景,可以触发问题:
- 处理器继续递增计数器:在同一地址写入相同的字。外部代理(可能是另一个处理器)正在轮询该地址,等待计数器值的任何更新继续进行。存储缓冲区将继续在其缓存行中合并计数器的更新值,以便外部代理永远不会看到任何更新的值,可能导致实时锁定。
- 处理器在给定字中写入值以指示其任务的完成;然后,继续在同一缓存行中的相邻字中写入数据。外部代理继续轮询第一个字的内存位置,以检查处理器何时完成其任务。问题与上述相同,因为缓存行可以无限期地保留在合并存储缓冲区中,从而在系统中创建可能的实时锁定。
推荐的解决方法是在连续保存在存储缓冲区中的写操作之后插入DMB操作。这样做是为了确保写入数据对任何外部代理的可见性。用户必须在他看到此问题的任何地方插入内存屏障。
没有回复内容