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

太常见了,不再赘述