LINUX内核中的xx_initcall初始化标号

LINUX内核中的xx_initcall初始化标号

 

田海立@CSDN 2011-07-02

 

          LINUX内核中有很多的初始化指示标志postcore_initcall(), arch_initcall(), subsys_initcall(), device_initcall(), etc. 这些起什么作用呢?查阅源代码(android goldfish-2.6.29)并搜索网上相关文章,对此做一总结。

  1. 初始化标号

先看这些宏的定义(定义在文件include/linux/init.h中)

view plaincopy to clipboardprint?
  1. #define pure_initcall(fn)               __define_initcall("0",fn,0)   
  2. #define core_initcall(fn)               __define_initcall("1",fn,1)   
  3. #define core_initcall_sync(fn)          __define_initcall("1s",fn,1s)   
  4. #define postcore_initcall(fn)           __define_initcall("2",fn,2)   
  5. #define postcore_initcall_sync(fn)      __define_initcall("2s",fn,2s)   
  6. #define arch_initcall(fn)               __define_initcall("3",fn,3)   
  7. #define arch_initcall_sync(fn)          __define_initcall("3s",fn,3s)   
  8. #define subsys_initcall(fn)             __define_initcall("4",fn,4)   
  9. #define subsys_initcall_sync(fn)        __define_initcall("4s",fn,4s)   
  10. #define fs_initcall(fn)                 __define_initcall("5",fn,5)   
  11. #define fs_initcall_sync(fn)            __define_initcall("5s",fn,5s)   
  12. #define rootfs_initcall(fn)             __define_initcall("rootfs",fn,rootfs)   
  13. #define device_initcall(fn)             __define_initcall("6",fn,6)   
  14. #define device_initcall_sync(fn)        __define_initcall("6s",fn,6s)   
  15. #define late_initcall(fn)               __define_initcall("7",fn,7)   
  16. #define late_initcall_sync(fn)          __define_initcall("7s",fn,7s)  

 

  1. __define_initcall

这些宏都用到了__define_initcall(),再看看它的定义(同样定义在文件include/linux/init.h中)

view plaincopy to clipboardprint?
  1. #define __define_initcall(level,fn,id) \   
  2.         static initcall_t __initcall_##fn##id __used \  
  3.         __attribute__((__section__(".initcall" level ".init"))) = fn  

 

这其中initcall_t是函数指针,原型如下,

view plaincopy to clipboardprint?
  1. typedef int (*initcall_t)(void);  

 

而属性 __attribute__((__section__())) 则表示把对象放在一个这个由括号中的名称所指代的section中。

所以__define_initcall的含义是:

1) 声明一个名称为__initcall_##fn的函数指针;

2) 将这个函数指针初始化为fn;

3) 编译的时候需要把这个函数指针变量放置到名称为 ".initcall" level ".init"的section中。


3.  放置.initcall.init SECTION

明确了__define_initcall的含义,就知道了是分别将这些初始化标号修饰的函数指针放到各自的section中的。

SECTION“.initcall”level”.init”被放入INITCALLS(include/asm-generic/vmlinux.lds.h)

view plaincopy to clipboardprint?
  1. #define INITCALLS                                                   \   
  2.             *(.initcallearly.init)                                  \  
  3.             VMLINUX_SYMBOL(__early_initcall_end) = .;               \  
  4.             *(.initcall0.init)                                      \  
  5.             *(.initcall0s.init)                                     \  
  6.             *(.initcall1.init)                                      \  
  7.             *(.initcall1s.init)                                     \  
  8.             *(.initcall2.init)                                      \  
  9.             *(.initcall2s.init)                                     \  
  10.             *(.initcall3.init)                                      \  
  11.             *(.initcall3s.init)                                     \  
  12.             *(.initcall4.init)                                      \  
  13.             *(.initcall4s.init)                                     \  
  14.             *(.initcall5.init)                                      \  
  15.             *(.initcall5s.init)                                     \  
  16.             *(.initcallrootfs.init)                                 \  
  17.             *(.initcall6.init)                                      \  
  18.             *(.initcall6s.init)                                     \  
  19.             *(.initcall7.init)                                      \  
  20.             *(.initcall7s.init)  

 

__initcall_start和__initcall_end以及INITCALLS中定义的SECTION都是在arch/xxx/kernel/vmlinux.lds.S中放在.init段的。

view plaincopy to clipboardprint?
  1. SECTIONS  
  2. {  
  3.         .init : {  
  4.                 __initcall_start = .;  
  5.                         INITCALLS  
  6.                 __initcall_end = .;  
  7.         }  
  8. }  

 

4.   初始化.initcallxx.init里的函数

而这些SECTION里的函数在初始化时被顺序执行(init内核线程->do_basic_setup()[main.c#778]->do_initcalls())。

程序(init/main.c文件do_initcalls()函数)如下,do_initcalls()把.initcallXX.init中的函数按顺序都执行一遍。

view plaincopy to clipboardprint?
  1. for (call = __early_initcall_end; call < __initcall_end; call++)  
  2.         do_one_initcall(*call);  

 

*************************** 本文完 *****************************

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码习惯---打印参数

打印参数很重要。转载于:https://www.cnblogs.com/Andomly/p/6050773.html

javascript设置和获取cookie的方法

设置cookie的方法&#xff0c;和获取cookie的方法例如以下 设置cookie document.cookie"name"value;//获取cookie当中index是cookie的名称function getCookie(index){var allcookies document.cookie; var cookie_pos allcookies.indexOf(index);if (cookie_pos !…

favicon.ico--网站标题小图片二三事

前言: 什么是favicon? 直接用图说话:这个就是favicon favicon.ico 是一种格式&#xff0c;一般用于网页地址栏前或者在标签上以缩略方式显示网站标志&#xff0c;也可以拖曳favicon到桌面以建立到网站的快捷方式。为什么要设置favicon图标&#xff0c;以图像形态显示&#xff…

镜头MTF传递函数解读

什么是镜头的MTF曲线&#xff1f;MTF全称是Modulation Transfer Function&#xff0c;译为调制传递函数&#xff0c;其单位以line/mm来表示。MTF综合反映了镜头的反差和分辨率特性&#xff0c; MTF是用仪器测量的&#xff0c;因而可以完全排除胶片等客观因素的影响和人工判读的…

Java的线程模型

并发不一定要依赖多线程&#xff08;如PHP中很常见的多进程并发&#xff09;&#xff0c;但是在Java里面谈论并发&#xff0c;大多数都与线程脱不开关系。 线程是比进程更轻量级的调度执行单位&#xff0c;线程的引入&#xff0c;可以把一个进程的资源分配和执行调度分开&#…

BT656/BT601/BT1120协议以及DM365/DM355/DM6467上使用的YUV颜色空间说明

ITU-R BT.601和ITU-RBT.656国际电信联盟&#xff08;International Telecommunication Union&#xff09;无线通信部门&#xff08;ITU-R&#xff09;制定的标准。严格来说&#xff0c;ITU-R BT.656应该是隶属ITU-R BT.601的一个子协议。ITU-R BT.601是演播室数字电视编码参数标…

eclispe设置workspace text file encoding

在windows下开发&#xff0c;经常会遇到eclipse新导入的工程 java代码中的注释或者字符串中文显示乱码&#xff0c;每次都要一个个项目更改麻烦&#xff0c;特地找了下&#xff0c;可通过如下方法一次性设置。 转载于:https://www.cnblogs.com/zhjh256/p/7190537.html

工业定焦镜头的选型公式

工业镜头的焦距(f mm)可以根据FOV(视场), WD(工作距离) 和CCD芯片尺寸计算出来:FOV视场指被摄取物体的大小&#xff0c;视场的大小是以镜头至被摄取物体距离(WD)&#xff0c;镜头焦距(F)及CCD芯片尺寸确定的。镜头的焦距&#xff0c;视场大小、工作距离、光学倍率计算如下:焦距…

Nginx系列二:(Nginx Rewrite 规则、Nginx 防盗链、Nginx 动静分离、Nginx+keepalived 实现高可用)...

一、Nginx Rewrite 规则 1. Nginx rewrite规则 Rewrite规则含义就是某个URL重写成特定的URL&#xff08;类似于Redirect&#xff09;&#xff0c;从某种意义上说为了美观或者对搜索引擎友好&#xff0c;提高收录量及排名等。 语法&#xff1a; rewrite<regex><replace…

受限玻尔兹曼机(RBM)以及对比散度(CD)

1. RBM 的提出 BM 的缺点&#xff1a; 计算时间漫长&#xff0c;尤其是无约束自由迭代的负向阶段&#xff1b;对抽样噪音敏感&#xff1b;流行软件的不支持&#xff1b;受限玻尔兹曼机&#xff08;Restricted Boltzmann Machine,简称 RBM&#xff0c;以解决 BM 的学习效率过慢的…

嵌入式系统中看门狗概述。。。

一直以来对于嵌入式中的watch dog&#xff08;看门狗&#xff09;都比较陌生&#xff0c;一直都不知道它到底是做什么的&#xff0c;单从名字上看也不知其所以然&#xff0c;然后就在网上找到了一篇blog&#xff0c;就是再说看门狗的作用和概述&#xff0c;原文如下&#xff1a…

MySQL中的运算符

算术运算符 MySQL 支持常见的五种算术运算&#xff1a;, -, *, /(同 DIV 函数), %(同 MOD 函数)&#xff0c;即加减乘除和取余。&#xff08;被除数为 0则结果为 NULL&#xff09; 比较运算符 当使用 SELECT 语句进行查询时&#xff0c;MySQL 允许用户对表达式的左边操作数和右…

Qt中查看ui_xxx.h文件方法

前提 1、Qt当有界面 2、构造完成 满足以上两个条件qt会生成ui_xxx.h文件。 如何查看 方法1 在cpp文件中找到UI下的一个对象 如&#xff1a; ui->textEdit Ui::QWDialog按住Ctrl键&#xff0c;使用鼠标左键点击UI下的一个对象&#xff0c;如&#xff1a;textEdit、QWDia…

springCloud Finchley 实战入门(基于springBoot 2.0.3)【三 Eureka-高可用服务注册中心】...

Eureka高可用注册中心 Eureka Server的设计一开始就考虑到了高可用的问题&#xff0c;在eureka服务治理设计中&#xff0c;所有的节点即是是服务提供方&#xff0c;也是服务消费方。 在部署高可用注册中心前我们先需要准备一下&#xff0c;本地环境。因为我们实例是在单台电脑上…

Spring 读取配置文件(二)

Spring 读取配置文件并调用 bean package cn.com.test.receive;import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class…

DaVinci的Buffer_Handle和BufTab Cmem函数调用

DaVinci的dvsdk里面&#xff0c;所有的内存用的都是CMEM&#xff0c;而比较上层的一个封装就是BufTab和Buffer_Handle了 每个Tab可以控制好多块内存块。 具体到内存块有两种&#xff0c;一种是创建的时候指定他的大小啊&#xff0c;物理地址啥的。另外一种就是仅仅创建出这个 …

Qt使用两组RadioButton,两组之间相互独立

Qt中使用两组共四个RadioButton时&#xff0c;由于RadioButton的特性&#xff0c;所以两组一共四个按钮每次只能选择一个&#xff0c;要使得两组RadioButton相互独立&#xff0c;需要用到QButtonGroup这个功能&#xff0c;把RadioButton加到QButtonGroup里面&#xff0c;实现两…

sleep 和 wait 的区别

为什么80%的码农都做不了架构师&#xff1f;>>> 面试中常问的就是 sleep 和 wait 有什么不同吗&#xff1f;为了面试时候发挥的更好&#xff0c;我在这里总结分享下。 首先对于 sleep() 方法&#xff0c;我们首先要知道该方法是属于 Thread 类中的。而 wait() 方法…

2016年11月13日周工作知识点总结

jQuery :eq() 选择器选取带有指定 index 值的元素。index 值从 0 开始&#xff0c;所有第一个元素的 index 值是 0&#xff08;不是 1&#xff09;。经常与其他元素/选择器一起使用&#xff0c;来选择指定的组中特定序号的元素&#xff08;如下面的例子&#xff09;。$("p…

DM6467之视频采集(Linux)下MMAP

做&#xff44;&#xff53;&#xff50;&#xff16;&#xff14;&#xff16;&#xff17;是在linux下做视频采集&#xff0c;仅ARM端 一共有三种视频采集方式&#xff1a; 1&#xff09;使用read、write方式&#xff1a;直接使用 read 和 write 函数进行读写。这种方式最简…