Die*_*yen 26 linux linux-device-driver linux-kernel
我们如何定制内置驱动程序加载顺序(首先加载一些内置驱动程序模块,然后加载依赖模块)?
Yas*_*oji 40
内置驱动程序无法加载,因此内置.调用它们的初始化函数,并在内核自行设置时激活驱动程序.调用这些init函数init/main.c::do_initcalls().所有init调用都按级别分类,这些级别在initcall_levels和中定义include/linux/init.h
这些级别是链接描述文件(arch/*/kernel/vmlinux.lds.*)中定义的实际符号.在内核编译时,链接收集所有的功能标记module_init()或其他*_initcall(),分类级别中,把所有的功能在同级别一起在同一个地方,并创建一个类似函数指针的数组.
do_initcall_level()在运行时执行的操作是调用数组中指针指向的每个函数.在do_initcall_level中除了级别之外没有调用策略,但是数组中的顺序是在链接时决定的.
所以,现在您可以看到驱动程序的启动顺序在链接时是固定的,但您可以做什么?
Makefile如果你已经阅读了上述内容,那么第一个是清楚的.即)如果合适,请使用early_initcall().
第二个需要更多解释.Makefile问题的顺序是当前内核构建系统如何工作以及链接器如何工作的原因.总而言之,构建系统将所有目标文件放在obj-y一起并将它们链接在一起.它高度依赖于环境,但链接器很可能将第一个目标文件obj-y放在较低的地址中,因此,之前会调用它.
如果您只想比同一目录中的其他驱动程序更早地调用驱动程序,这是最简单的方法.