• Linux内核中__init, __initdata, __initfunc(), asmlinkage, ENTRY(), FASTCALL()等作用


     

    在阅读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 声明为全局,对齐,并定义为标号。


    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")))

     

     

  • 相关阅读:
    codeforces 1060 B
    codeforces 1060 A
    牛客 国庆七天乐 day1 L
    BZOJ 1087: [SCOI2005]互不侵犯King
    codeforces 792CDivide by Three(两种方法:模拟、动态规划
    codeforces 797C Minimal string
    codeforces 110E Lucky Tree
    codeforces 798D
    2017福建省赛 FZU2272~2283
    Android -- Looper、Handler、MessageQueue等类之间关系的序列图
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/3134868.html
Copyright © 2020-2023  润新知