Linux内核--各种宏定义

来源:互联网 发布:c语言break和continue 编辑:程序博客网 时间:2024/05/16 14:33

1. asmlinkage宏

[cpp] view plain copy
  1. #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宏

[cpp] view plain copy
  1. /* 
  2.  * "Conditional" syscalls 
  3.  * 
  4.  * What we want is __attribute__((weak,alias("sys_ni_syscall"))), 
  5.  * but it doesn't work on all toolchains, so we just do it by hand 
  6.  */  
  7. #ifndef cond_syscall  
  8. #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")  
  9. #endif  

解释:cond_syscall(sys_socketcall);

    语句的意思是:如果存在sys_socketcall(),则声明这个函数,在程序链接的时候使用这个函数;如果不存在sys_socketcall()这个函数,就使用sys_ni_syscall()函数代替。

3. ALIGN宏

[cpp] view plain copy
  1. #define ALIGN(x,a)      __ALIGN_MASK(x,(typeof(x))(a)-1)  
  2. #define __ALIGN_MASK(x,mask)    (((x)+(mask))&~(mask))  
解释:ALIGN(14, 8);  

    将x以a长度向上对齐;其中,a为2的整次幂; 其结果就是16;

4. weak_alias宏

[cpp] view plain copy
  1. # define weak_alias(name, aliasname) _weak_alias (name, aliasname)  
  2. # define _weak_alias(name, aliasname) \  
  3.        extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));  
解释:weak_alias(__socket, socket); 

    为标号socket定义一个弱化别名__socket。仅当socket没有在其他任何地方定义时,连接器就会用__socket解析socket相关的符号。

0 0
原创粉丝点击