欢迎光临散文网 会员登陆 & 注册

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





简单分析Linux内核基础篇——initcall的评论 (共 条)

分享到微博请遵守国家法律