其他核读取会清除arm smp上的独占状态(ldrex)吗?

问题描述 投票:0回答:1

我正在SMP内核中编写汇编程序,该程序可能运行在armv7-a或AArch64架构上。

这个程序是在irq_disabled下运行的,所以如果我ldrex一个内存地址,独占状态不会因为中断的到来而被清除(在这个核心上)。

毫无疑问,其他CPU核写入该地址会导致独占状态被清除,但让我困惑的是其他CPU核只读取这个地址(如ldr/ldrex)是否会导致独占状态被清除?

具体场景如下:

假设编译器优化已关闭,并且汇编代码按预期生成,无需内存重新排序:

int x = 0;

core0:
    local_irq_disable();
    int tmp = __ldrex(&x);
    if (tmp)
        return;
    if (__strex(&x, 1)) { // write failed
        assert(READ_ONCE(x));  // Will this assert always succeed?
    }

core1/core2 or others:
    These cores may be in user mode or kernel mode, and they may read or write the variable x.
    If a write operation is performed on variable x, a non-zero value must be written atomically.
assembly arm atomic arm64 load-link-store-conditional
1个回答
0
投票
如果该核心不保留从 LDREX 到 STREX 的缓存行的

MESI 独占/修改所有权,STREX 会失败。 这可以防止两个原子增量从读取相同的值开始,例如,使整个 RMW 成为原子的。

所以,是的,从其他核心到同一缓存行的纯负载(只是

ldr
不一定是
ldrex
)将使
strex
失败。

(您使用内在函数编写的内容就是您从

compare_exchange_weak
上获得的内容。)
    

© www.soinside.com 2019 - 2024. All rights reserved.