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

摘要:
内核中的内容是根据分割原则存储的。通常,编译器将函数放在中。中的文本部分和变量。数据或。bss部分。使用section属性,编译器可以在指定的节中放置函数或变量。如果函数定义包含s__ Initdata,则此函数的所有代码都将放在的部分中。使用此宏定义的一个原因是,标记为初始化的函数和数据表示这些函数和数据仅在初始化期间使用。
 

__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

免责声明:文章转载自《内核中的宏定义__init、__initdata和__exit、__exitdata》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于MyEclipse10的破解激活android学习ProgressBar的简单使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CentOS 7/8 部署Elasticsearch集群

  首先安装jdk 环境说明:三台百度云服务器,内网IP分别为: 192.168.32.36、192.168.32.37、192.168.32.38, 不开放公网IP访问 分别在三台服务器上执行以下操作: 1.创建目录及下载解压(下载速度很慢) cd /usr/local/ mkdir elasticsearch cd elasticsearch w...

【转载】51单片机data,bdata,idata,xdata使用注意事项

"51单片机编程在不同内存空间data xdata bdata定义变量的注意事项": 关键词:51 单片机 编程 不同 内存空间 data xdatabdata 定义 变量 注意事项 1、data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。 2、data区内最好放局部变量。 因为局部变量的空间是可以...

(1)OracleClient数据库操作(淘汰)

一、数据库连接 Oracle 数据提供程序,位于System.Data.OracleClient命名空间.(.NET 4 以后的版本,会将不在维护和更新了) 第一步:引入命名空间 在程序的开头写上下面的代码 using System.Data.OracleClient; 第二步:引入对应组件 点击项目-右键-添加引用-找到System.Data.Oracl...

async和await的小结

async 配合 await 使用 1、未使用 async 和 await  <el-button @click="getData">Promise</el-button> import getWeater from '@/app/login.js' methods: { getData() { // 未使用async...

vue请求本地json数据

1.下载vue-resource插件   cnpm install vue-resource   1.2全局引入vue-resource:   在main.js   import VueResource from 'vue-resource';   Vue.use(VueResource);   2.把静态josn文件放在项目根的 static文件夹:...

Laravel Ajax的使用

Ajax (异步的 JavaScript 和 XML)是一套运用在客户端用来创建异步Web应用程序的Web开发技术。  在视图文件导入 jQuery 库使用 ajax来发送并从服务器接收数据。  在服务器端,您可以使用 response() 函数发送响应客户端,以及发送JSON格式的响应可以使用 JSON()函数来接收响应的数据。 json()函数语法 j...