initcall的执行顺序

转载 2015年11月18日 14:56:02

Init.h中有相关initcall的启动次序,在system.map中可看出具体的__initcall指针的前后次序

 

#define pure_initcall(fn) __define_initcall("0",fn,0)

#define core_initcall(fn) __define_initcall("1",fn,1)

#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)

#define postcore_initcall(fn) __define_initcall("2",fn,2)

#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)

#define arch_initcall(fn) __define_initcall("3",fn,3)

#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)

#define subsys_initcall(fn) __define_initcall("4",fn,4)

#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)

#define fs_initcall(fn) __define_initcall("5",fn,5)

#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)

#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)

#define device_initcall(fn) __define_initcall("6",fn,6)

#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)

#define late_initcall(fn) __define_initcall("7",fn,7)

#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)

 

module_init在的启动序号为6,它的展开后就是__define_initcall("6",fn,6)

#definedevice_initcall(fn) __define_initcall("6",fn,6)

#define__initcall(fn) device_initcall(fn)

#definemodule_init(x) __initcall(x);


Kernel通过调用do_initcalls(void)加载模块,具体流程如下图:



static void__init do_initcalls(void)

{

initcall_t*fn;

for (fn =__early_initcall_end; fn < __initcall_end; fn++)

do_one_initcall(*fn);

/* Makesure there is no pending stuff from the initcall sequence */

flush_scheduled_work();

}

因此驱动模块在Kernel启动过程中的启动次序是非常靠后的


具体的每个驱动的启动次序可以从system.map看出,特别对于同一个优先级的各类驱动:

c003288ct __initcall_i2c_init2

c00328b0 t__initcall_video_early_init3

c00328b4 t__initcall_video2_early_init3

c00328b8t __initcall_aml_i2c_init3

c0032c18t __initcall_i2c_dev_init6

c0032c28 t__initcall_videodev_init6

c0032c30t __initcall_v4l2_i2c_drv_init6

c0032c34t __initcall_v4l2_i2c_drv_init6

c0032d24 t__initcall_video_init6

c0032d28 t__initcall_video2_init6

对于同一级别的 __initcall的次序 主要由MakeFile中.o文件的链接次序决定,具体看Kernel下的主Makefile ---- Build vmlinux

以及kernel/driver 下的obj-y

对于内核中各种xxx_initcall调用的分析———linux子系统初始化

对应内核版本  linux-2.6.32.63, 架构arm(版本较老,但已经属于2.6以后的版本了)。 一、 xxx_initcall是一系列子系统的初始化入口函数 对应文件include/l...
  • fridayLL
  • fridayLL
  • 2015年05月17日 23:09
  • 530

Linux中的各种initcall总结

今天看Linux源码中的dma.c
  • sdkhy0808
  • sdkhy0808
  • 2014年07月09日 11:22
  • 492

linux initcall机制

Linux系统启动过程很复杂,因为它既需要支持模块静态加载机制也要支持动态加载机制。模块动态加载机制给系统提供了极大的灵活性,驱动程序既可支持静态编译进内核,也可以支持动态加载机制。Linux系统中对...
  • u012497906
  • u012497906
  • 2015年05月29日 14:02
  • 1009

fs_initcall、early_initcall、__init宏

fs_initcall、early_initcall...分析 在内核代码中经常可以看到类似fs_initcall\early_initcall\late_initcall这样的宏,这些宏有什么...
  • LPSTC123
  • LPSTC123
  • 2015年12月08日 20:20
  • 1612

kernel 启动过程之五, initcall 的来由, console 的初始化。

参见include/linux/init.h和vmlinux.lds1)所有标识为__init的函数在链接的时候都放在.init.text这个区段内,在这个区段中,函数的摆放顺序是和链接的顺序有关的,...
  • pottichu
  • pottichu
  • 2009年06月11日 17:58
  • 4175

各种initcall的执行顺序: module_init subsys_initcall ....

先从module_init 开刀:一层一层的把宏展开 #define module_init(x)    __initcall(x); #define __initcall(fn) dev...
  • Scotthuang1989
  • Scotthuang1989
  • 2015年03月09日 17:57
  • 693

initcall机制原理及实践

说明:以下内容基于linux2.4.0一、initcall机制原理    在linux初始化的过程中,内核采用了一种initcall的机制,它利用gcc的扩展功能以及ld的连接控制脚本实现了在内核初始...
  • jccz_zys
  • jccz_zys
  • 2007年06月01日 11:34
  • 5991

内核arch_initcall的实现及如何自定义initcall

内核版本号:3.4~4.2 赖登群 2016.07.05 内核arch_initcall的实现 内核有种函数的标示方法,比如:arch_initcall(VSBOARD_XXXX),可以在内核初始化后...
  • a657511300
  • a657511300
  • 2016年07月05日 17:17
  • 1204

linux内核段属性机制(以subsys_initcall和module_init为例)

linux内核段属性机制 以subsys_initcall和module_init为例
  • TongxinV
  • TongxinV
  • 2017年01月27日 11:04
  • 1467

initcall_debug参数定位初始化过程的错误信息发生的位置

可用的核心参数可以参考Documents/kernel-parameters.txt 或者看代码的时候有调试功能的函数对应的开关变量。 kernel参数里面加入:initcall_debug即...
  • sitelist
  • sitelist
  • 2015年02月12日 11:37
  • 1372
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:initcall的执行顺序
举报原因:
原因补充:

(最多只允许输入30个字)