什么是Linux内置的驱动程序加载顺序?

我们如何定制内置的驱动程序加载顺序(先制作一些内置的驱动程序模块,然后再加载从属模块)?

Solutions Collecting From Web of "什么是Linux内置的驱动程序加载顺序?"

内置的驱动程序不会被加载 ,因此内置。 它们的初始化函数被调用,当内核自行建立时,驱动程序被激活。 这些init函数在init/main.c::do_initcalls()被调用。 所有的init调用都被分为不同的级别,这些级别在initcall_levelsinclude/linux/init.h

这些级别是链接器脚本( arch/*/kernel/vmlinux.lds.* )中定义的实际符号。 在内核编译的时候,链接器会收集所有标记为module_init()或者其他*_initcall()函数,按级别进行分类,将同一级别的所有函数放在同一个位置,并创建一个类似于函数指针的数组。

do_initcall_level()在运行时所做的是调用数组中指针指向的每个函数。 在do_initcall_level中没有调用策略,除了级别,但数组中的顺序是在链接时间中决定的。

所以,现在你可以看到,司机的启动顺序是固定在连接时间,但你可以做什么?

  1. 把你的init函数放在更高的层次上,或者
  2. 把你的设备驱动程序放在Makefile的较高位置

第一个是清楚的,如果你已经阅读上述。 即)使用early_initcall(),而不是适当的。

第二个需要更多的解释。 Makefile的命令之所以重要,是因为当前的内核构建系统是如何工作的以及连接器是如何工作的。 长话短说,构建系统将目标文件中的所有目标文件连接在一起。 它是高度依赖于环境的,但链接器将较低地址中的第一个目标文件放置在obj-y可能性较高,因此被称为较早的目标文件。

如果你只是想让你的驱动程序比同一目录下的其他驱动程序更早被调用,那么这是最简单的方法。

depmod检查每个模块导出和需要的符号,并对它们进行拓扑排序,以便modprobe稍后可以使用它们以正确的顺序加载模块。 要求你想依赖的模块中的符号足以让它做正确的事情。

正确的模块顺序和依赖关系由modprobe处理,即使在initrd中也是如此 。

最近我遇到了这个问题,我的充电器驱动程序依赖ADC驱动程序,所以在加载ADC驱动程序充电器驱动程序加载之前,检查在DTS文件中定义的adc阶梯,并且必须由ADC驱动程序初始化。 它通过改变drivers / Makefile中模块的顺序来解决