如果我有两个静态链接的模块.一个模块的module_init函数依赖于已经运行的另一个模块的module_init函数.有没有办法强制一个模块在另一个模块之前加载?
另外,第一个模块的init函数是否可以在调用第二个模块之前完成?
最后,如果上面的答案为NO,那么同步两个模块init调用的推荐方法是什么,以确保我不会遇到问题?
我正在我的 Raspberry Pi 4 - 基于 Yocto 的嵌入式 Linux 系统上尝试启动优化,并希望在加载 vc4-drm 内核模块时进行设置。
我想让 vc4-drm 内核模块更早加载,以便 /dev/fb0 更早准备好。现在,它超出了我的用户空间启动时间,因此我在大约 9 秒内无法在其上显示任何内容。但是,如果我移动它以使其更早初始化,我认为会更好。
下面的图像显示了在完整调试模式下加载到我的系统上的主要内核模块(启用 bootchart+initcall_debug+serial+printk)。您将看到 vc4_drm_register 几乎已结束。
为了解决这个问题,我找到了这些:Linux内置驱动程序加载顺序是什么?Linux如何确定模块 init 调用的顺序?。Yasushi Shoji 说道;
将你的 init 函数放在较高的位置,或者将你的设备驱动程序放在 Makefile 的较高位置
对于第一种方法,在我正在编译的内核中,我找到了 中的模块drivers/gpu/drm/vc4,然后module_init(vc4_drm_register)用early_initcall(vc4_drm_register)和替换subsys_initcall(vc4_drm_register)。两次尝试都没有任何区别,vc4 仍然在第 9 秒左右加载。要么我在这里遗漏了一些东西,要么这是以不同的方式处理的。
建议的第二种方法是调整 drivers/Makefile 中的顺序。然而,对我来说,GPU/驱动程序似乎已经处于相当早期的阶段。
obj-y += irqchip/
obj-y += bus/
obj-$(CONFIG_GENERIC_PHY) += phy/
# GPIO must come after pinctrl as gpios may need to mux pins etc
obj-$(CONFIG_PINCTRL) …Run Code Online (Sandbox Code Playgroud)