start_kernel 函數最后調用的是 rest_init 函數,其實 rest_init 函數不光產生了最重要的 kernel_init (PID=1)和 kthreadd (PID=2)內核進程。
kernel_init 最后演變?yōu)橛脩艨臻g 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 號進程都已經起來了,也就是說系統(tǒng)已經真正起來了。1 號 2 號進程起來之前,文件系統(tǒng)的掛載是在調用 rest_init 函數之前就掛載好了,此時加載驅動是可以的。
那么這里是如何掛載的呢?
流程中 driver_init 函數會對各個驅動入口函數進行初始化,也就是在內存中對驅動初始化函數進行尋址。而 do_initcalls 函數中,會按照驅動的優(yōu)先級,對驅動一個一個進行掛載。
linux4.14/init/main.c
驅動的優(yōu)先級 :Linux 把系統(tǒng)中需要掛載的各種東西,都分為14個等級,分別為 1--1s--2--2s--3--3s--4--4s--5--5s--6--6s--7--7s,數字越小優(yōu)先級越高,定義在:
linux4.14/include/linux/init.h
一般我們自己寫的驅動模塊,文件最后會聲明一個 module_init 和 module_exit ,實際上被定義為 device_initcall,優(yōu)先級為6,是要比架構初始化模塊和文件系統(tǒng)模塊優(yōu)先級低。
-
驅動
+關注
關注
12文章
1918瀏覽量
86931 -
Linux
+關注
關注
87文章
11511瀏覽量
213796 -
函數
+關注
關注
3文章
4381瀏覽量
64865
發(fā)布評論請先 登錄
linux驅動開發(fā)_文件系統(tǒng)本地掛載

Linux 掛載文件系統(tǒng)
Linux基礎教程之Linux查看磁盤掛載有哪些方法詳細方法概述
關于Linux系統(tǒng)如何掛載數據盤?
如何在Linux掛載Windows共享目錄
Linux中的掛載命令mount是什么

Linux系統(tǒng)的三種掛載方式
linux文件掛載相關介紹
驅動動模塊之間如何更改模塊掛載順序

評論