Linux 内核常见宏定义
来源:互联网 发布:台达人机界面编程软件 编辑:程序博客网 时间:2024/05/16 14:51
http://www.cnblogs.com/chris-hoo/archive/2012/07/01/2571585.html
我们在阅读Linux内核是,常见到这些宏 __init, __initdata, __initfunc(), asmlinkage, ENTRY(), FASTCALL()等等。它们定义在 /include/linux/init.h 和 /include/linux/linkage.h 以及其他一些.h 文件中。
1. __init
位置:/include/linux/init.h
定义: #define __init __attribute__ ((__section__ (".init.text")))
注释:这个标志符和函数声明放在一起,表示gcc编译器在编译时,需要把这个函数放在.text.init Section 中,而这个Section 在内核完成初始化之后,就会被释放掉。
举例:asmlinkage void __init star_kerne(void) { ... }
2. __initdata
位置:/include/linux/init.h
定义:#define __initdata __attribute__ ((__section__ (".init.data")))
注释:这个标志符和变量声明放在一起,表示gcc编译器在编译时,需要把这个变量放在.data.init Section中,而这个Section 在内核完成初始化之后,会释放掉。
举例:static struct kernel_param raw_params[] __initdata ={ ... }
3. __initfunc()
位置:/include/asm-i386/init.h
定义:#define __initfunc(__arginit) \
__arginit __init; \
__arginit
注释:__initfunc() 是一个自定义宏,用来定义一个 __init 函数,在Linux-2.4中已被__init宏所取代。
举例:__initfunc (void mem_init(unsigned long start_mem, unsigned long end_mem)) { ... }
4. asmlinkage
位置:/include/linux/linkage.h
定义:#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
注释:这个标志符和函数声明放在一起,带regparm(0)的属性声明告诉gcc编译器,该函数不需要通过任何寄存器来传递参数,参数只是通过堆栈来传递。gcc编译器在汇编过程中调用c语言函数时传递参数有两种方法:一种是通过堆栈,另一种是通过寄存器。缺省时采用寄存器,假如你要在你的汇编过程中调用c语言函数,并且想通过堆栈传递参数,你定义的 c 函数时要在函数前加上宏asmlinkage。
举例:asmlinkage void __init start_kernel(void) { ... }
5.ENTRY()
位置:/include/linux/linkage.h
定义:#define ENTRY(name) \
.globl name; \
ALIGN; \
name:
注释:将name 声明为全局,对齐,并定义为标号。
举例:
ENTRY(swapper_pg_dir)
.
long
0x00102007
.fill __USER_PGD_PTRS-1,4,0
<span style=
"color: #0000ff;"
>
/* default: 767 entries */
</span>
.
long
0x00102007
<span style=
"color: #0000ff;"
>
/* default: 255 entries */
</span>
.fill __KERNEL_PGD_PTRS-1,4,0
等价于
.globl swapper_pg_dir
.align 16,0x90
<span style=
"color: #0000ff;"
>
/* if i486 */
</span>
swapper_pg_dir:
.
long
0x00102007
.fill __USER_PGD_PTRS-1,4,0
<span style=
"color: #0000ff;"
>
/* default: 767 entries */
</span>
.
long
0x00102007
<span style=
"color: #0000ff;"
>
/* default: 255 entries */
</span>
.fill __KERNEL_PGD_PTRS-1,4,0
6. FASTCALL ()
位置:/include/linux/kernel.h
定义:#define FASTCALL(x) x __attribute__((regparm(3)))
注释:这个标志符和函数声明放在一起,带regparm(3)的属性声明告诉gcc编译器,这个函数可以通过寄存器传递多达3个的参数,这3个寄存器依次为EAX、EDX 和 ECX。更多的参数才通过堆栈传递。这样可以减少一些入栈出栈操作,因此调用比较快。
举例:extern void FASTCALL(__switch_to(struct task_struct *prev, struct task_struct *next))
这个例子中,prev将通过eax,next通过edx传递。
7. __sched
位置:/include/linux/sched.h
定义:/* Attach to any functions which should be ignored in wchan output. */
#define __sched __attribute__((__section__(".sched.text")))
- Linux 内核常见宏定义
- linux内核源码中常见宏定义
- linux内核源码中常见宏定义
- linux内核中两个常见宏定义
- linux内核宏定义
- linux内核宏定义
- linux内核宏定义
- linux内核宏定义
- Linux内核--各种宏定义
- Linux内核--各种宏定义
- Linux常见定义记录
- linux内核的宏操作定义之一
- linux驱动 内核函数 变量 宏定义
- linux内核container_of宏定义分析
- linux内核的container_of()宏定义分析
- linux内核container_of宏定义分析
- linux内核container_of宏定义分析
- linux内核container_of宏定义分析
- setbuf函数详解
- 软件过程开发方法(RUP、AP、MP、HP) CMMI/SPCA业务介绍
- Java中线程的介绍和使用
- 如何让vim编辑器永久显示行号
- 工作回顾121026
- Linux 内核常见宏定义
- 为什么学C++比C#的长期风险低
- 软件架构——系统分析员、系统架构师、项目经理的区别
- OK6410——uboot
- 一元二次方程
- 软件架构——设计原则
- Java通过JDBC调用oracle存储过程
- 利用matlab进行简单的贝叶斯网络构建
- 给定key值,在Binary Search Tree中查找最接近该键值的结点集合