linux内核源码中常见宏标志tagLinux认证考试
文章作者 100test 发表时间 2010:03:31 07:29:12
来源 100Test.Com百考试题网
    
	
  这些宏包括 __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")))
  注释:这个标志符和函数声明放在一起,表示gcc编译器在编译的时候需要把这个函数放.text.init section中,而这个section在内核完成初始化之后,会被释放掉。
  举例:asmlinkage void __init start_kernel(void){...}
  2) __initdata
  位置:include\asm-i386\Init.h
  定义:#define __initdata __attribute__ ((__section__ (".data.init")))
  注释:这个标志符和变量声明放在一起,表示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
  注释: 这个宏用来定义一个 __init 函数。
  举例: __initfunc(void mem_init(unsigned long start_mem, unsigned long e
  nd_mem)) {....}
  4) asmlinkage
  位置:Include\linux\linkage.h
  定义:#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
  注释:这个标志符和函数声明放在一起,告诉gcc编译器该函数不需要通过任何寄存器来传递参数,参数只是通过堆栈来传递。