我正在使用双Cortex-A9系统而且我一直在努力 了解为什么自旋锁功能需要使用DMB。它似乎 只要合并存储缓冲区刷新了锁定值 应该在解锁核心的L1上结束并且SCU应该 要么使另一个核心的L1中的值无效,要么更新。 这足以保持一致性和安全锁定吗?和 STREX不会跳过合并存储缓冲区,这意味着我们没有 甚至需要冲洗?
DMB似乎是一种生硬的锤子,特别是因为它 默认为系统域,这可能意味着一直写入 到主内存,这可能很昂贵。锁定中的DMB是否为驱动程序的解决方法 正确使用smp_mb?
我目前看到,基于性能指标,约占5% 我的系统周期在DMB引起的停顿中消失。
答案 0 :(得分:2)
在SMP情况下需要DMB,因为其他处理器可能会看到内存访问在没有它的情况下以不同的顺序发生,即从关键部分内部的访问可能发生在从视图的角度进行锁定之前。第二个核心。
因此,第二个核心可以看到自己持有锁定,并且还看到在另一个核心上运行的cricital部分内部的更新,从而打破了一致性。
答案 1 :(得分:2)
我发现这些文章可以回答你的问题:
特别是:
您将注意到获取锁定后发出的数据存储器屏障(DMB)指令。 DMB保证在内存屏障之后进行所有内存访问之前,系统中的所有其他CPU将观察到内存屏障之前的所有内存访问。如果您认为一旦获得锁定,程序将访问锁定锁定的数据结构,这就更有意义了。上面锁定函数中的DMB确保在访问锁定后可以访问锁定的数据结构。