简单分析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充电站


