Linux内核宏__init

阅读数:62 评论数: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

__CONCAT,连接两个参数,##用于粘贴两个参数,#用于替换参数 #define __CONCAT(a, b) a ##

<img src="http://123.56.17.129:2177/images/linux_kernel.png" alt="" /

重点:linux内核中的汇编基于AT&T的语法。 一、简介 Linux内核中包含的汇编源码主要由两部分组成:一大部分是内核arch目录和其它目录下的纯汇编文件,以.S为后缀的文件;另一小部分是嵌入在C

在编程中,一个符号symbol是一个程序的创建块,它是一个变量名或一个函数名。 内核符号表(Kernel Symbol Table) 内核并不使用符号名。它是通过

在Kernel_path/Makefile中可以查看到 # SPDX-License-Identifier: GPL

内核通过 printk() 输出的信息具有日志级别 #define KERN_SOH "\001" /* ASCI

一、概述  在日常工作中,经常会需要对内核进行Debug、或者进行优化工作。一些简单的问题,可以通过dmesg/printk查看,优化借助一些工具进行。 但是当问题逻辑复杂,优化面宽泛的时候,往往无从

这个宏的作用是保持参数在stack中。查看arch/x86/include/asm/linkage.h里面的定义 #ifdef

上图是Intel手册中对标志寄存器的图示,几个