Linux 386+源码中常见宏标识(tag)的定义和注释

这些宏包括 __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编译器该函数不需要通过
          任何寄存器来传递参数,参数只是通过堆栈来传递。

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

5)  ENTRY()

    位置:Include\linux\linkage.h

    定义:    #define ENTRY(name) \
              .globl SYMBOL_NAME(name); \
              ALIGN; \
              SYMBOL_NAME_LABEL(name)

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

    举例:    ENTRY(swapper_pg_dir)
              .long 0x00102007
              .fill __USER_PGD_PTRS-1,4,0
              /* default: 767 entries */
              .long 0x00102007
              /* default: 255 entries */
              .fill __KERNEL_PGD_PTRS-1,4,0
    等价于
              .globl swapper_pg_dir
              .align 16,0x90        /* if i486+ */
              swapper_pg_dir:
              .long 0x00102007
              .fill __USER_PGD_PTRS-1,4,0
              /* default: 767 entries */
              .long 0x00102007
              /* default: 255 entries */
              .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 t
ask_struct *next));

         这个例子中,prev将通过eax,next通过edx传递。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值