Linux内核源码特殊用法 - Xinrea/Learn GitHub Wiki
__attribute__
GCC扩展语法
例如:
struct __attribute__((aligned(4)) sample_struct {
...
}
多个属性可以使用“,”隔开
-
aligned:设置数据对齐
-
packed:设置结构体按最小大小排列成员
-
noreturn:函数无返回
-
pure:函数不修改任何全局变量
-
const:函数不读/写任何全局变量
-
noinline:不能扩展为内联函数
-
unused:表示该函数或者变量可能不使用
-
used:与上相反
-
alias:别名(针对函数)
-
deprecated:表示弃用,会使编译器产生warning信息
指定以上属性,可以方便编译器对其进行优化
关键字替代
__asm__与asm
__inline__与inline
__typeof__与typefo
等
编译时若开启-std和-ansi,则后者不能使用,前者仍能使用
参数传递
asmlinkage
在本地堆栈中传递参数
fastcall
在通用寄存器中传递参数
例:
fastcall unsigned long func(){
...
}
UL
即为unsigned long
,放在一个常数后面,告诉编译器如何处理该常数,避免溢出
例:
#define MASK 0x99fffffffcccccUL
volatile
每次访问时,该变量必须重新加载,而不是从缓存中读取,在处理中断寄存器或多进程时使用
例:
volatile int a;
likely和unlikely
太常见了,不再赘述