我正在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.