Chinaunix首页 | 论坛 | 博客
  • 博客访问: 370450
  • 博文数量: 94
  • 博客积分: 3421
  • 博客等级: 中校
  • 技术积分: 919
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-18 16:27
文章分类

全部博文(94)

文章存档

2015年(8)

2013年(6)

2012年(26)

2011年(8)

2010年(26)

2009年(20)

我的朋友

分类: LINUX

2010-01-06 22:33:37

这些宏包括 __init、__initdata、__initfunc()、asmlinkage、ENTRY()、FASTCALL()等等。它们的定义主要位于 Include\linux\linkage.h和 include\asm-i386\Init.h以及其他一些.h文件中。

  1) __init位置:include\asm-i386\Init.h

  定义:#define __init __attribute__ ((__section__ (".text.init")))
网管网bitsCN_com

  注释:这个标志符和函数声明放在一起,表示gcc编译器在编译的时候需要把这个函数放.text.init section中,而这个section在内核完成初始化之后,会被释放掉。
中国网管联盟

  举例:asmlinkage void __init start_kernel(void){...}
网管网bitsCN.com

  2) __initdata

  位置:include\asm-i386\Init.h

  定义:#define __initdata __attribute__ ((__section__ (".data.init")))
网管网bitsCN.com

  注释:这个标志符和变量声明放在一起,表示gcc编译器在编译的时候需要把这个变量放在.data.init section中,而这个section在内核完成初始化之后,会被释放掉。

  举例:static struct kernel_param raw_params[] __initdata = {....}

  3) __initfunc()

  位置:include\asm-i386\Init.h

  定义: #define __initfunc(__arginit) \ feedom.net

  __arginit __init; \ 中国网管联盟www_bitscn_com

  __arginit

  注释: 这个宏用来定义一个 __init 函数。
网管网bitsCN.com

  举例: __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)))

  注释:这个标志符和函数声明放在一起,告诉gcc编译器该函数不需要通过任何寄存器来传递参数,参数只是通过堆栈来传递。

  举例:asmlinkage void __init start_kernel(void){...}

  5) ENTRY()

  位置:Include\linux\linkage.h

  定义: #define ENTRY(name) \

  .globl SYMBOL_NAME(name); \ feedom.net

  ALIGN; \

  SYMBOL_NAME_LABEL(name)

  注释: 将name声明为全局,对齐,并定义为标号。

  举例: ENTRY(swapper_pg_dir) 网管网bitsCN.com

  .long 0x00102007 中国网管联盟

  .fill __USER_PGD_PTRS-1,4,0

  /* default: 767 entries */

  .long 0x00102007

  /* default: 255 entries */ 网管网bitsCN_com

  .fill __KERNEL_PGD_PTRS-1,4,0 中国网管联盟www、bitsCN、com

  等价于 中国网管联盟www_bitscn_com

  .globl swapper_pg_dir 网管联盟

  .align 16,0x90 网管网bitsCN_com

  /* if i486+ */

  swapper_pg_dir: 中国网管联盟

  .long 0x00102007 网管联盟

  .fill __USER_PGD_PTRS-1,4,0

  /* default: 767 entries */ 网管网bitsCN_com

  .long 0x00102007

  /* default: 255 entries */

54com.cn

  .fill __KERNEL_PGD_PTRS-1,4,0
网管网bitsCN.com

  6) FASTCALL()

  位置:Include\linux\kernel.h

  定义:#define FASTCALL(x) x __attribute__((regparm(3)))
中国网管论坛bbs.bitsCN.com

  注释:这个标志符和函数声明放在一起,带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传递。

阅读(1079) | 评论(0) | 转发(0) |
0

上一篇:杂记

下一篇:美国人的名与姓

给主人留下些什么吧!~~