内核中的宏定义__init、__initdata和__exit、__exitdata

__init、__initdata和__exit、__exitdata的定义位于<kernel/include/linux/init.h>

 1 /* These are for everybody (although not all archs will actually
 2    discard it in modules) */
 3 #define __init      __section(.init.text) __cold notrace
 4 #define __initdata  __section(.init.data)
 5 #define __initconst __constsection(.init.rodata)
 6 #define __exitdata  __section(.exit.data)
 7 #define __exit_call __used __section(.exitcall.exit)
 8
 9
10 #define __exit          __section(.exit.text) __exitused __cold notrace
11
12 /* For assembly routines */
13 #define __HEAD      .section    ".head.text","ax"
14 #define __INIT      .section    ".init.text","ax"
15 #define __FINIT     .previous
16
17 #define __INITDATA  .section    ".init.data","aw",%progbits
18 #define __INITRODATA    .section    ".init.rodata","a",%progbits
19 #define __FINITDATA .previous
20
21 #define __CPUINIT        .section   ".cpuinit.text", "ax"
22 #define __CPUINITDATA    .section   ".cpuinit.data", "aw"
23 #define __CPUINITRODATA  .section   ".cpuinit.rodata", "a"
24
25 #define __MEMINIT        .section   ".meminit.text", "ax"
26 #define __MEMINITDATA    .section   ".meminit.data", "aw"
27 #define __MEMINITRODATA  .section   ".meminit.rodata", "a"
28
29 /* silence warnings when references are OK */
30 #define __REF            .section       ".ref.text", "ax"
31 #define __REFDATA        .section       ".ref.data", "aw"
32 #define __REFCONST       .section       ".ref.rodata", "a"

这些宏大多跟和section相关的定义

这些宏定义的作用是告诉编译器将这些函数或者数据放入相应的section中,一般是指放置到内核镜像的哪个位置上。内核中的内容按照分段的原则来存放。具体段的存放规则是由vmlinux.lds文件定义,它是负责把段信息告诉链接器的,当然我们也要在代码中声明属于哪个段。

通常编译器将函数放在.text 节,变量放在.data 或 .bss 节,使用 section 属性,可以让编译器将函数或变量放在指定的节中。

在模块加载的阶段,.ko文件中的代码和数据的加载区域是根据section来加载的。

比如:如果函数的定义中带有__init,那么这个函数的所有代码会被放入.init.text的section中。

如果函数的定义中带有__initdata,那么这个函数的所有代码会被放入.init.data的section中。

之所以要使用这个宏定义,其中一个原因是标记为初始化的函数和数据,表明该函数和数据仅在初始化期间使用。在模块装载之后,模块装载就会将初始化函数扔掉。这样可以将该函数占用的内存释放出来。

详见:

关于__init、__initdata和__exit、__exitdata的学习笔记

内核中的宏定义__init,__initdata,__exitdata

原文地址:https://www.cnblogs.com/y4247464/p/10090284.html

时间: 2024-08-10 19:47:01

内核中的宏定义__init、__initdata和__exit、__exitdata的相关文章

Linux内核中的宏:__init and __exit

ZZ FROM: http://blog.csdn.net/musein/article/details/742609 ================================================== The __init and __exit declarations are special kernel macros designed to tell the kernel to flag these functions for special handling in ca

Linux内核导出符号宏定义EXPORT_SYMBOL的源码分析

源代码: <include/linux/moudule.h> --. #ifndef MODULE_SYMBOL_PREFIX #define MODULE_SYMBOL_PREFIX "" #endif --. struct kernel_symbol       //内核符号结构 { unsignedlong value;  //该符号在内存地址中的地址 constchar *name;     //该符号的名称 }; -- #define __EXPORT_SYMBO

iOS开发中使用宏定义提高开发效率

iOS开发中使用宏定义提高开发效率 (2013-07-10 10:47:33) 转载▼ iOS开发中,巧妙的使用宏定义,可以提高开发效率,本篇简单介绍一下宏的定义,设置,应用,并在未来实践中不断追加一些常用的宏定义. 调试Log iPhone应用程序开发调试的时候,在代码中加入NSLog的暴力调试方法是很频繁的,但是在release的时候要删除这些调试代码,那工作量是烦躁,这样的情况下,试用宏就会显得非常的方便. 看下面的例子: #ifdef DEBUG #define LOG(...) NSL

swift中类似宏定义

建一个类 如,在Contans.swift中 import UIKit let kMAIN_SIZE = UIScreen.mainScreen().bounds 在其他地方直接用 比如在 MyTabbarViewController.swift中 var bgView = UIView(frame:CGRectMake(0, 0, kMAIN_SIZE.width, kMAIN_SIZE.height - 20 - 44)); swift中类似宏定义,布布扣,bubuko.com

Makefile中进行宏定义

实际上是gcc命令支持-D宏定义,相当于C中的全局#define: gcc -D name gcc -D name=definition Makefile中可以定义变量(和宏很像),但是是给make解释器用的,对所编译的文件完全没有作用. 关键词: Make宏定义 Make传递宏定义 Makefile中添加宏定义 Makefile -D 在Makefile中我们可以通过宏定义来控制源程序的编译.只要在Makefile中的CFLAGS中通过选项-D来指定你于定义的宏即可. 如:CFLAGS +=

C++中的内联函数和C中的宏定义的区别

在C++中内联函数: 内联函数即是在函数的声明和和定义前面加上“inline”关键字,内联函数和常规函数一样,都是按照值来传递参数的,如果参数为表达式,如4.5+7.5,则函数将传递表达式的值(这里为12),而宏定义则不同. 在C中的宏定义: C语言使用的预处理器语句#define来提供宏,例如:#define SQUARE(X)  X*X,这里宏并不是通过值传递来实现的,而是通过文本替换来实现的. 内联函数和宏定义的区别用下面的代码来观察: //内联函数 inline double squar

stm32工程建立中关于宏定义和启动文件的选择

在STM32的学习过程中,第一步关于stm32工程的建立就会难倒很多人,因为他不像其他AVR 51单片机这些,options中的配置比较复杂,其中最让人头疼的就是关于c/c++ compiler选项中preprocessor这个选择框,现在我就对其中的两项进行说明,一是为了让以后学习STM32的同学能更快的了解,二是为了让我自己更好的复习. 如上图所示  其中 additional include directories下面的框需要添加工程内头文件所在的路径,'$PROJ_DIR$'表示的是工程

C语言学习笔记--C语言中的宏定义

1. C 语言中的宏定义 (1)#define 是预处理器处理的单元实体之一(因此,预处理器只是简单的进行替换,并不(2)#define 定义的宏可以出现在程序的任意位置(包括函数体的内部)(3)#define 定义之后的代码都可以使用这个宏 2. 定义宏常量 (1)#define 定义的宏常量可以直接使用(2)#define 定义的宏常量本质为字面量 3. 宏定义表达式 (1)#define 表达式的使用类似函数调用(2)#define 表达式可以比函数更强大(3)#define 表达式比函数

黑马程序员------C 语言学习笔记---C语言中的宏定义

1.5    C语言程序的运行过程 01 源程序:由高级语言或汇编语言编写,C语言源程序的扩展名为.C 02 目标程序:源程序经“编译程序”翻译所得的二进制代码为目标程序,其扩展名为.obj 03 可执行程序:目标程序与库函数连接,形成可执行程序,.out #include <stdio.h> int main() { #define PI 3.14 double r,len,area; printf("请输入半径:\n"); // 提示用户输入半径 scanf("