Linux内核宏__init
阅读数:117 评论数: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
用于预测间接分支指令的目标地址的方法。
相关推荐
mainline 、longterm、stable、linux-next、snapshot这些名词,都是linux kernel sou
linux内核启动过程:
启动Linux内核的最终目的是使用Linux上的应用程序,这些应用程序可以是纯软件的,也可以是硬件相关的。
1.BIOS自检
BIOS(Basic Input/Output
一、概述
在Linux内核中,EXPORT_SYMBOL宏允许内核模块导出符号(通常是函数或变量),使得其他模块可以在它们自己的代码中使用这些符号。这是一种模块间通信的机制,允许模块共享代码而不需要将
重点:linux内核中的汇编基于AT&T的语法。
一、简介
Linux内核中包含的汇编源码主要由两部分组成:一大部分是内核arch目录和其它目录下的纯汇编文件,以.S为后缀的文件;另一小部分是嵌入在C
一、概述
在 Linux 内核中,printk 是一个类似于用户空间 C 语言中的 printf 函数的内核级日志记录功能。它用于内核代码中输出调试信息到控制台或系统日志。printk 可以在几乎任何
一、概述
在日常工作中,经常会需要对内核进行Debug、或者进行优化工作。一些简单的问题,可以通过dmesg/printk查看,优化借助一些工具进行。
但是当问题逻辑复杂,优化面宽泛的时候,往往无从