簡單分析Linux內(nèi)核基礎(chǔ)篇——initcall

寫過Linux驅(qū)動的人都知道module_init
宏,因為它聲明了一個驅(qū)動的入口函數(shù)。
除了module_init
宏,你會發(fā)現(xiàn)在Linux內(nèi)核中有許多的驅(qū)動并沒有使用module_init
宏來聲明入口函數(shù),而是看到了許多諸如以下的聲明:
上述舉例的兩個驅(qū)動入口分別使用了device_initcall()
和arch_initcall()
來聲明驅(qū)動入口,這些本質(zhì)上都是對initcall
的調(diào)用,module_init
也如此。
initcall等級
Linux內(nèi)核對initcall進(jìn)行了等級劃分,每一種類型的initcall都有對應(yīng)等級,等級0-7。
路徑:include/init/init.h
id越小等級越高,Linux會按照等級由高到低順序執(zhí)行:
這么做的目的主要是根據(jù)優(yōu)先級依次對設(shè)備進(jìn)行初始化,例如會先初始化與架構(gòu)相關(guān)的,然后再初始化內(nèi)核子系統(tǒng)。
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ??


Linux對initcall的調(diào)用
在Linux啟動時,會依次遍歷所有等級的initcall,以完成一系列的初始化。
initcall
的調(diào)用流程:
在do_initcalls()
函數(shù)中,會遍歷所有等級的initcall
,完成初始化。
do_initcall_level()
會執(zhí)行對應(yīng)等級下的所有函數(shù):
module_init等級
module_init
宏使用的是device_initcall
,等級為6
:
在一些內(nèi)核驅(qū)動中,直接使用了device_initcall()
來聲明驅(qū)動入口,其效果與使用module_init
是一樣的。
原文作者:嵌入式Linux充電站
