Linux内核宏__init

阅读数:6 评论数:0

跳转到新版页面

分类

Linux

正文

【include/linux/init.h】
#define __init	__section(".init.text") __cold  __latent_entropy __noinitretpoline
#define __initdata	__section(".init.data")
#define __initconst	__section(".init.rodata")
#define __exitdata	__section(".exit.data")
#define __exit_call	__used __section(".exitcall.exit")

1、__section(".init.text")的含义

__section是GCC的一个编译特性,在编译时带该关键字的函数,放在.init.text的数据段中。

这样做的目的就是将相关的函数全部放在一起,比如将相关的初始化时需要运行的函数全部放到.init.text数据段,在系统运行时直接让PC指针按顺序执行这些函数。

(1)__section关键字

#define __section(section)              __attribute__((__section__(section)))

(2)__attribute__

它其实是编译指令。用它可以设置函数属性、变量属性和类型属性。

(3)__attribute__((__section__(name)))

告诉编译器把函数或数据放到name的数据段中。

2、这样做的好处:

(1)系统在初始时,不需要知道有什么模块需要初始化,只需要把name数据段的所有初始化接口执行一遍即可。

(2)当系统启动完毕后,这个段中的内存会被释放掉供其他使用。

3、__cold宏

#define __cold                          __attribute__((__cold__))

用于通知编译器该函数不太可能执行,该函数会针对大小而不是速度进行优化。

4、__latent_entropy宏

【include/linux/complier-gcc.h】
#if defined(LATENT_ENTROPY_PLUGIN) && !defined(__CHECKER__)
#define __latent_entropy __attribute__((latent_entropy))
#endif

  它是gcc编译器支持的一个编译特性,它只能作用于函数和变量。

如果它是在一个函数上,那么插件将对其进行检测。

如果它是在一个变量上,那么插件将用一个随机值初始化它。

5、__noinitretpoline宏

【include/linux/complier-gcc.h】
#ifdef CONFIG_RETPOLINE
#define __noretpoline __attribute__((__indirect_branch__("keep")))
#endif

/* Built-in __init functions needn't be compiled with retpoline */
#if defined(__noretpoline) && !defined(MODULE)
#define __noinitretpoline __noretpoline
#else
#define __noinitretpoline    /一般情况下,定义了MODULE,就会走这个分支**/
#endif

用于预测间接分支指令的目标地址的方法。