站长网 系统 Linux 驱动挂载顺序解析

Linux 驱动挂载顺序解析

手把手教你分析 Linux 启动流程从上文可以得出,start_kernel 函数最后调用的是 rest_init 函数,其实 rest_init 函数不光产生了最重要的 kernel_init (PID=1)和 kthreadd (PID=2)内核进程。kernel_init 最后演变为用户空间 init 进程(PID=1)。rest_init 函

手把手教你分析 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

 

本文来自网络,不代表站长网立场,转载请注明出处:https://www.tzzz.com.cn/html/fuwuqi/xt/2021/1027/16060.html

作者: dawei

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

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部