我正在将内核扩展移植到多处理器 PowerPC 上的 32/64 位 AIX,用 C 编写。我只需要原子读取操作和原子写入操作(我不需要获取和添加,比较-and-swap 等)只是为了澄清一下:对我来说,“原子性”不仅意味着“没有交错”,还意味着“跨多个核心的可见性”。这些操作对指针进行操作,因此对“int”变量的操作对我来说毫无用处。
如果我声明变量“volatile”,C 标准说该变量可以被未知因素修改,因此不受优化。
从我读到的,似乎常规的读写应该是非交错的,而且linux 内核源似乎也同意。它说:
__asm__ __volatile__("stw%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i));
stw
是“存储字”,据说是原子的,但我不知道“%U0%X0”是什么意思。我不明白这个汇编指令如何强加可见性。当我编译我的内核扩展时,'std' 用于我想要的分配,但从我读到的内容,它对于 64 位机器也应该是原子的。我对 PowerPC 及其指令集的细节知之甚少,但是我在编译文件的汇编列表中没有找到任何内存屏障指令(“sync”或“eieio”)。
内核提供了 fetch_and_addlp() 服务,可用于实现原子读取(v = fetch_and_addlp(&x, 0)
例如)。
所以我的问题是:
声明变量'volatile'是否足以实现可见性和无交错意义上的读写原子性?
如果 1 的答案是“否”,那么这种原子性是如何实现的?
Linux PowerPC 原子实现中的“%U0%X0”是什么意思?