我有双核Cortex-A9系统工作,我一直在试图理解 究竟为什么自旋锁功能,需要使用DMB。这似乎 只要合并存储缓冲器被刷新锁定值 应在L1上的解锁核心和SCU最终应该 要么无效或更新其他核心的L1值。 这足以维持一致性和安全锁定权吗?而且 不会STREX无论如何跳过合并存储缓冲区,这意味着我们不需要 甚至需要刷新?螺旋锁确实需要DMB吗?
DMB似乎是一个钝头锤,尤其是因为它 默认为系统域,这可能意味着一直写到主存储器,这可能是昂贵的。
是在锁有一个变通方法的DMB为妥善做好不 使用smp_mb驱动程序?
我目前看到,根据性能指标,我的系统周期在DMB引起的失速中消失了大约5%。
这可能是一个完全误导性的评论,因为我对这种低级别的操作并不是非常有经验,但确实使用自旋锁来保护其他存储位置不受多重访问(可能不是相同缓存页面)..因此,尽管无论如何spinlock本身可能是连贯的,但仍然需要内存屏障来确保其他内存访问在缓存之间是连贯的。 – Mike
好吧,我明白你的意思,但是这个逻辑适用于锁定功能以及解锁?锁定不应该等待关键部分之外的访问才能完成。 –
在我所期望的解锁,这样的临界区中发生的任何变化都保证了锁标志更新之前被刷新,而关键的部分期间发生的任何读操作之前完成前一个完整的内存屏障解锁锁标志被更新。除了缓存问题之外,我认为内存屏障对于告诉CPU什么样的指令重新排序可以通过程序中的不同点是很重要的。 – Mike