【发布时间】:2021-07-21 04:34:11
【问题描述】:
我对基于 Linux 内核的 C 编码风格非常陌生。我试图从“arch/arm64/include/asm/atomic.h”文件(here 的第 112-124 行)中了解“atomic_add”函数的以下实现。
static inline void atomic_add(int i, atomic_t *v)
{
unsigned long tmp;
int result;
asm volatile("// atomic_add\n"
"1: ldxr %w0, %2\n"
" add %w0, %w0, %w3\n"
" stxr %w1, %w0, %2\n"
" cbnz %w1, 1b"
: "=&r" (result), "=&r" (tmp), "+Q" (v->counter)
: "Ir" (I));
}
请帮助我理解以下问题。
-
%w0 或 %w3 是什么意思?我知道 %2 指的是计数器值。
-
%w0 是指(结果)变量还是通用寄存器?
-
约束字符串“Ir”是否代表“立即寄存器”?
【问题讨论】:
标签: linux-kernel embedded-linux atomic inline-assembly arm64