1. asmlinkage宏
#define asmlinkage __attribute__((regparm(0))).解释:gcc编译器在汇编过程中调用c语言函数时传递参数有两种方法:一种是通过堆栈,另一种是通过寄存器。缺省时采用寄存器,假如你要在你的汇编过程中调用c语言函数,并且想通过堆栈传递参数,你定义的c函数时要在函数前加上宏asmlinkage。
跟asmlinkage相对应的是fastcall, fastcall宏是在include/asm-i386/linkage.h中定义的宏,它指导GCC连接时把fastcall修饰的函数的前三个参数用寄存器传递。asmlinkage和fastcall不能共存。
2. cond_syscall宏
/* * "Conditional" syscalls * * What we want is __attribute__((weak,alias("sys_ni_syscall"))), * but it doesn't work on all toolchains, so we just do it by hand */ #ifndef cond_syscall #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") #endif
解释:cond_syscall(sys_socketcall);
语句的意思是:如果存在sys_socketcall(),则声明这个函数,在程序链接的时候使用这个函数;如果不存在sys_socketcall()这个函数,就使用sys_ni_syscall()函数代替。
3. ALIGN宏
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1) #define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))解释: ALIGN(14, 8);
将x以a长度向上对齐;其中,a为2的整次幂; 其结果就是16;
4. weak_alias宏
# define weak_alias(name, aliasname) _weak_alias (name, aliasname) # define _weak_alias(name, aliasname) \ extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));解释:weak_alias(__socket, socket);
为标号socket定义一个弱化别名__socket。仅当socket没有在其他任何地方定义时,连接器就会用__socket解析socket相关的符号。