ven*_*s.w 3 x86 assembly kernel linux-kernel
据说以"lock"为前缀的汇编指令是原子的.我想知道"锁定"是否只能影响一个汇编指令; 汇编指令本身不是原子的吗?
以下是linux内核中的原子函数示例:
static __inline__ int atomic_sub_and_test(int i, atomic_t *v)
{ unsigned char c;
__asm__ __volatile__(
LOCK "subl %2,%0; sete %1"
:"=m" (v->counter), "=qm" (c)
:"ir" (i), "m" (v->counter) : "memory");
return c; }
Run Code Online (Sandbox Code Playgroud)
在这个例子中,subl和sete可以被中断吗?
锁定前缀会影响单个指令.
当修改多个CPU之间共享的内存时,指令停止是原子的.涉及读取内存操作数,对其执行某些操作(例如AND,XOR,INC等)然后将其写回的修改不被其他CPU视为原子操作.锁定前缀"锁定"内存位置,因此3个步骤(读取,修改,写入)看起来像一个,即其他CPU只能观察锁定指令之前和之后的内容.
请参阅Intel或AMD的官方CPU文档.
编辑:在你新添加的例子中,如果我们谈论中断,那么这些指令都不会被中断.整个指令之间发生中断.锁前缀使sub指令成为原子.该sete指令不是原子的,它是将ZF标志转换为零或非零整数值.