start_kernel 函數(shù)最后調(diào)用的是 rest_init 函數(shù),其實(shí) rest_init 函數(shù)不光產(chǎn)生了最重要的 kernel_init (PID=1)和 kthreadd (PID=2)內(nèi)核進(jìn)程。
kernel_init 最后演變?yōu)橛脩艨臻g init 進(jìn)程(PID=1)。
rest_init 函數(shù)還有一個(gè)重要的分支:加載驅(qū)動(dòng)模塊,調(diào)用流程如下:
start_kernel
|--- >rest_init
|--- >kernel_init
|--- >kernel_init_freeable
|--- >do_basic_setup
|--- >driver_init
|--- >do_initcalls
|--- >do_initcall_level
|--- >do_one_initcall
注意,這里就是驅(qū)動(dòng)的初始化和驅(qū)動(dòng)模塊的加載。
我們知道在 rest_init 函數(shù)中,最重要的 1 號(hào)進(jìn)程和 2 號(hào)進(jìn)程都已經(jīng)起來了,也就是說系統(tǒng)已經(jīng)真正起來了。1 號(hào) 2 號(hào)進(jìn)程起來之前,文件系統(tǒng)的掛載是在調(diào)用 rest_init 函數(shù)之前就掛載好了,此時(shí)加載驅(qū)動(dòng)是可以的。
那么這里是如何掛載的呢?
流程中 driver_init 函數(shù)會(huì)對(duì)各個(gè)驅(qū)動(dòng)入口函數(shù)進(jìn)行初始化,也就是在內(nèi)存中對(duì)驅(qū)動(dòng)初始化函數(shù)進(jìn)行尋址。而 do_initcalls 函數(shù)中,會(huì)按照驅(qū)動(dòng)的優(yōu)先級(jí),對(duì)驅(qū)動(dòng)一個(gè)一個(gè)進(jìn)行掛載。
linux4.14/init/main.c
驅(qū)動(dòng)的優(yōu)先級(jí) :Linux 把系統(tǒng)中需要掛載的各種東西,都分為14個(gè)等級(jí),分別為 1--1s--2--2s--3--3s--4--4s--5--5s--6--6s--7--7s,數(shù)字越小優(yōu)先級(jí)越高,定義在:
linux4.14/include/linux/init.h
一般我們自己寫的驅(qū)動(dòng)模塊,文件最后會(huì)聲明一個(gè) module_init 和 module_exit ,實(shí)際上被定義為 device_initcall,優(yōu)先級(jí)為6,是要比架構(gòu)初始化模塊和文件系統(tǒng)模塊優(yōu)先級(jí)低。
-
驅(qū)動(dòng)
+關(guān)注
關(guān)注
12文章
1852瀏覽量
85675 -
Linux
+關(guān)注
關(guān)注
87文章
11350瀏覽量
210477 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
62999
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
linux驅(qū)動(dòng)開發(fā)_文件系統(tǒng)本地掛載
![<b class='flag-5'>linux</b><b class='flag-5'>驅(qū)動(dòng)</b>開發(fā)_文件系統(tǒng)本地<b class='flag-5'>掛載</b>](https://file.elecfans.com//web2/M00/6A/EF/pYYBAGMlOaKANPlHAACUo7y2ANE955.png)
Linux網(wǎng)絡(luò)文件系統(tǒng)的注冊(cè)與掛載過程分析
![<b class='flag-5'>Linux</b>網(wǎng)絡(luò)文件系統(tǒng)的注冊(cè)與<b class='flag-5'>掛載</b>過程分析](https://file.elecfans.com/web2/M00/70/5D/pYYBAGNHyo6AQegMAAB43FRRPXY135.png)
Linux模塊相關(guān)命令 Linux驅(qū)動(dòng)模塊的編寫與掛載
![<b class='flag-5'>Linux</b>模塊相關(guān)命令 <b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動(dòng)</b>模塊的編寫與<b class='flag-5'>掛載</b>](https://file1.elecfans.com/web2/M00/A5/92/wKgaomUMEU2AEN9DAABfFRzkAmU008.jpg)
Linux 掛載文件系統(tǒng)
Linux基礎(chǔ)教程之Linux查看磁盤掛載有哪些方法詳細(xì)方法概述
關(guān)于Linux系統(tǒng)如何掛載數(shù)據(jù)盤?
如何在Linux掛載Windows共享目錄
Linux中的掛載命令mount是什么
![<b class='flag-5'>Linux</b>中的<b class='flag-5'>掛載</b>命令mount是什么](https://file.elecfans.com/web2/M00/91/D6/poYBAGPu5eyAcF7oAACVx80ay34689.jpg)
Linux系統(tǒng)的三種掛載方式
linux文件掛載相關(guān)介紹
驅(qū)動(dòng)動(dòng)模塊之間如何更改模塊掛載順序
![<b class='flag-5'>驅(qū)動(dòng)</b>動(dòng)模塊之間如何更改模塊<b class='flag-5'>掛載</b>順序](https://file1.elecfans.com/web2/M00/A8/4B/wKgZomUVPgGADHvpAAAw_EeEpxo120.jpg)
評(píng)論