在x86_64架构下该函数定义在arch/x86/boot/bitops.h文件中,该函数是一个内联汇编,函数定义如下:
static inline void set_bit(int nr, void *addr)
{
asm("btsl %1,%0" : "+m" (*(u32 *)addr) : "Ir" (nr));
}
btsl在 x86_64 架构中,BTS
指令的扩展版本,它接受两个操作数:一个是内存地址(目标地址),另一个是要设置的位的索引(位偏移量)。作用是将内存地址对应的索引位非1时置1。
+m
约束字符,告诉编译器这个操作数是内存地址,切该地址在汇编指令执行前后都可能发生改变,需要在该指令前后插入内存屏障。
Ir是
一个约束字符组合,告诉编译器该参数是一个立即数,并且该参数应该放在一个通用寄存器上。
所以该函数的作用,内存地址按位置1。