简单分析Linux内核基础篇——initcall
2023-03-21 15:28 作者:补给站Linux内核 | 我要投稿

写过Linux驱动的人都知道module_init
宏,因为它声明了一个驱动的入口函数。
除了module_init
宏,你会发现在Linux内核中有许多的驱动并没有使用module_init
宏来声明入口函数,而是看到了许多诸如以下的声明:
上述举例的两个驱动入口分别使用了device_initcall()
和arch_initcall()
来声明驱动入口,这些本质上都是对initcall
的调用,module_init
也如此。
initcall等级
Linux内核对initcall进行了等级划分,每一种类型的initcall都有对应等级,等级0-7。
路径:include/init/init.h
id越小等级越高,Linux会按照等级由高到低顺序执行:
这么做的目的主要是根据优先级依次对设备进行初始化,例如会先初始化与架构相关的,然后再初始化内核子系统。
【文章福利】小编推荐自己的Linux内核技术交流群:【749907784】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!(含视频教程、电子书、实战项目及代码)


Linux对initcall的调用
在Linux启动时,会依次遍历所有等级的initcall,以完成一系列的初始化。
initcall
的调用流程:
在do_initcalls()
函数中,会遍历所有等级的initcall
,完成初始化。
do_initcall_level()
会执行对应等级下的所有函数:
module_init等级
module_init
宏使用的是device_initcall
,等级为6
:
在一些内核驱动中,直接使用了device_initcall()
来声明驱动入口,其效果与使用module_init
是一样的。
原文作者:嵌入式Linux充电站
