手把手教你分析 Linux 启动流程

 

从上文可以得出,start_kernel 函数最后调用的是 rest_init 函数,其实 rest_init 函数不光产生了最重要的 kernel_init (PID=1)和 kthreadd (PID=2)内核进程。

 

kernel_init 最后演变为用户空间 init 进程(PID=1)。

 

rest_init 函数还有一个重要的分支:加载驱动模块,调用流程如下:

 

start_kernel 

  |--->rest_init  

      |--->kernel_init 

          |--->kernel_init_freeable 

              |--->do_basic_setup 

                  |--->driver_init 

                  |--->do_initcalls 

                        |--->do_initcall_level 

                            |--->do_one_initcall 

注意,这里就是驱动的初始化和驱动模块的加载。

 

我们知道在 rest_init 函数中,最重要的 1 号进程和 2 号进程都已经起来了,也就是说系统已经真正起来了。1 号 2 号进程起来之前,文件系统的挂载是在调用 rest_init 函数之前就挂载好了,此时加载驱动是可以的。

 

那么这里是如何挂载的呢?

 

流程中 driver_init 函数会对各个驱动入口函数进行初始化,也就是在内存中对驱动初始化函数进行寻址。而 do_initcalls 函数中,会按照驱动的优先级,对驱动一个一个进行挂载。

 

linux4.14/init/main.c

 

dawei

【声明】:石嘴山站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。