我们如何定制内置驱动程序加载顺序(首先加载一些内置驱动程序模块,稍后加载相关模块)?
答案 0 :(得分:37)
内置驱动程序不会加载,因此内置。调用它们的初始化函数,并在内核自行设置时激活驱动程序。这些init函数在init/main.c::do_initcalls()
中调用。所有初始化调用都按级别进行分类,这些级别在initcall_levels
和include/linux/init.h
这些级别是链接描述文件(arch/*/kernel/vmlinux.lds.*
)中定义的实际符号。在内核编译时,链接器收集标记为module_init()
或其他*_initcall()
的所有函数,在级别中进行分类,将所有函数放在同一级别的同一位置,并创建类似函数指针的数组。
do_initcall_level()在运行时所做的是调用数组中指针指向的每个函数。在do_initcall_level中除了级别之外没有调用策略,但是数组中的顺序是在链接时决定的。
所以,现在您可以看到驱动程序的启动顺序在链接时是固定的,但您可以做什么?
Makefile
如果你已经阅读了上述内容,那么第一个很清楚。 ie)如果合适,请使用early_initcall()。
第二个需要更多解释。 Makefile
问题中的顺序是当前内核构建系统如何工作以及链接器如何工作的原因。简而言之,构建系统将obj-y
中的所有目标文件都链接在一起并将它们链接在一起。它高度依赖于环境,但链接器很可能将第一个目标文件放在较低地址的obj-y
中,因此在之前调用。
如果您只想比同一目录中的其他驱动程序更早地调用驱动程序,这是最简单的方法。
答案 1 :(得分:2)
depmod
检查每个模块导出和要求的符号,并对它们进行拓扑排序modprobe
以后可以按正确的顺序加载模块。要求您希望依赖的模块中的符号足以让它做正确的事情。
答案 2 :(得分:0)
答案 3 :(得分:0)
最近我遇到了这个问题我的充电器驱动程序依赖于ADC驱动程序所以在加载ADC驱动程序充电器驱动程序之前已加载并检查在DTS文件中定义的adc phandle并且必须由ADC驱动程序初始化。它通过更改drivers / Makefile中模块的顺序来解决