Linux内核--各种宏定义
2016-06-21 09:27
465 查看
1. asmlinkage宏
[cpp] view
plain copy
#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
/*
* "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宏
[cpp] view
plain copy
#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宏
[cpp] view
plain copy
# 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相关的符号。
[cpp] view
plain copy
#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
/*
* "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宏
[cpp] view
plain copy
#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宏
[cpp] view
plain copy
# 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相关的符号。
相关文章推荐
- Linux 自检和 SystemTap
- LKRG:用于运行时完整性检查的可加载内核模块
- 一张图看尽 Linux 内核运行原理
- Greg Kroah-Hartman 解释内核社区是如何使 Linux 安全的
- Linux内核链表实现过程
- PHP内核探索之解释器的执行过程
- 深入理解PHP内核(二)之SAPI探究
- C++中Semaphore内核对象用法实例
- 一张图看尽Linux内核运行原理
- 深入理解PHP内核(一)
- PHP内核探索之变量
- 深入php内核之php in array
- 浅谈Linux内核创建新进程的全过程
- 修改内核 内存分配 root、文件系统和内核镜像的位置
- 移植linux-2.6.30.4到S3C2440
- 看《Linux0.11内核完全注释2.01》的方法
- 升级LINUX内核(支持8G内存)的命令
- FreeBSD系统优化部分内核参数调整中文注释
- Linux2.6X内核中文件相关结构体总结
- 内核的主要配置文件的详细说明