Linux引导启动顺序

Posted hellokitty2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux引导启动顺序相关的知识,希望对你有一定的参考价值。

1.所有的__init函数在区段.initcall.init中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些__init函数,并在整个初始化完成后,释放整个init区段(包括.init.text,.initcall.init等)。注意,这些函数在内核初始化过程中的调用顺序只和这里的函数指针的顺序有关,和这些函数本身在.init.text区段中的顺序无关。在2.4内核中,这些函数指针的顺序也是和链接的顺序有关的,是不确定的。在2.6内核中,initcall.init区段又分成7个子区段,如下:,数字越小越先调用,数字越大越后调用

.initcall1.init 
.initcall2.init 
.initcall3.init 
.initcall4.init 
.initcall5.init 
.initcall6.init 
.initcall7.init

数字越小越先被调用,include/linux/init.h文件中,包括各种常见的包装:

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

#define core_initcall(fn)          __define_initcall(fn, 1)
#define core_initcall_sync(fn)     __define_initcall(fn, 1s)
#define postcore_initcall(fn)      __define_initcall(fn, 2)
#define postcore_initcall_sync(fn) __define_initcall(fn, 2s)
#define arch_initcall(fn)          __define_initcall(fn, 3)
#define arch_initcall_sync(fn)     __define_initcall(fn, 3s)
#define subsys_initcall(fn)        __define_initcall(fn, 4)
#define subsys_initcall_sync(fn)   __define_initcall(fn, 4s)
#define fs_initcall(fn)            __define_initcall(fn, 5)
#define fs_initcall_sync(fn)       __define_initcall(fn, 5s)
#define rootfs_initcall(fn)        __define_initcall(fn, rootfs)
#define device_initcall(fn)        __define_initcall(fn, 6)
#define device_initcall_sync(fn)   __define_initcall(fn, 6s)
#define late_initcall(fn)          __define_initcall(fn, 7)
#define late_initcall_sync(fn)     __define_initcall(fn, 7s)

 

 

2. Linux内核启动流程

进入子系统初始化时,在内核init进程中进行设备初始化,最为复杂、诡异的机制莫过于do_initcalls()函数调用,该函数完成了所有需要静态加载模块的初始化,需要进行静态加载的内核模块,需要使用一些特定的宏进行处理,

 

3.1.linux内核中initcalls机制

  先来看看do_initcalls()函数原型:该部分是一个函数指针调用,遍历_initcall_start~_initcall_end范围,逐个调用这里面的函数指针指向的函数。

 

 

以上是关于Linux引导启动顺序的主要内容,如果未能解决你的问题,请参考以下文章

linux系统启动顺序及init模式

云服务器 ECS Linux CentOS 修改内核引导顺序

linux操作系统的详细启动过程,谢谢(硬件启动的先后顺序)

Linux启动过程

Linux启动顺序运行级别及开机启动

Linux运维基础(九):Linux的引导过程