6

我正在使用双 Cortex-A9 系统,我一直在尝试准确了解为什么自旋锁功能需要使用 DMB。似乎只要合并存储缓冲区被刷新,锁定值就应该在解锁核心的 L1 中结束,并且 SCU 应该使另一个核心的 L1 中的值无效或更新。这足以保持一致性和安全锁定对吗?STREX 不会跳过合并存储缓冲区,这意味着我们甚至不需要刷新吗?

DMB 似乎是一把钝锤,特别是因为它默认为系统域,这可能意味着一直写入主内存,这可能很昂贵。

锁中的 DMB 是否可以作为未正确使用 smp_mb 的驱动程序的解决方法?

根据性能计数器,我目前看到大约 5% 的系统周期在由 DMB 引起的停顿中消失。

4

2 回答 2

2

在 SMP 情况下需要 DMB,因为如果没有它,其他处理器可能会看到内存访问以不同的顺序发生,即从临界区内部的访问可能发生在从第二个核心的角度获取锁之前.

因此,第二个核心可以看到自己持有锁,并且还可以看到来自关键部分内部的更新在另一个核心上运行,从而破坏了一致性。

于 2012-10-31T18:59:12.597 回答
2

我发现这些文章可能会回答你的问题:

尤其:

您会注意到一旦获得锁定就会发出数据存储器屏障 (DMB) 指令。DMB 保证在内存屏障之后的所有内存访问之前,系统中的所有其他 CPU 都将观察到内存屏障之前的所有内存访问。如果您考虑到一旦获得锁,程序就会访问被锁锁定的数据结构,这就更有意义了。上面lock函数中的DMB保证了对锁的访问,在访问锁之后,可以观察到对锁定的数据结构的访问。

于 2012-10-31T20:09:07.643 回答