我们如何定制内置的驱动程序加载顺序(先制作一些内置的驱动程序模块,然后再加载相关的模块)?什么是Linux内置驱动程序加载顺序?
回答
内置驱动程序不会是加载,因此内置。它们的初始化函数被调用,当内核自行建立时驱动程序被激活。这些初始化函数在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
如果你看了上面的第一个是明确的。即)使用early_initcall(),而不是适当的。
第二个需要更多的解释。为什么Makefile
问题中的命令是当前内核构建系统如何工作以及连接器如何工作的原因。长话短说,构建系统将获取obj-y
中的所有对象文件并将它们链接在一起。它依赖于环境,但链接器很有可能将第一个目标文件放置在较低地址的obj-y
中,因此早些时候调用该文件。
如果你只是想让你的驱动程序比同一个目录下的其他驱动程序更早被调用,这是最简单的方法。
depmod
检查每个模块导出和需要的符号,并对它们进行拓扑排序,以便modprobe
稍后可以用来以正确的顺序加载模块。要求你想依赖的模块中的符号足以让它做正确的事情。
最近我遇到了这个问题,我的充电器驱动程序依赖ADC驱动程序,因此在加载ADC驱动程序充电器驱动程序之前已加载并检查在DTS文件中定义的adc phandle并且必须通过ADC驱动程序进行初始化。它通过更改驱动程序/ Makefile中模块的顺序得到解决
- 1. 什么是Windows内核驱动程序?
- 2. Linux内核中的驱动程序探测顺序
- 3. QSqlDatabase:驱动程序未加载驱动程序未加载
- 4. 使用驱动程序内部的驱动程序的Linux
- 5. 使用OSR驱动程序加载程序加载驱动程序错误
- 6. Linux内核配置设备的顺序是什么?
- 7. 加载JDBC驱动程序
- 8. 当驱动程序内置驱动程序时,驱动程序不工作
- 9. 什么是在Linux驱动程序中的wmb()
- 10. Linux I2C内核驱动程序
- 11. 更改内核驱动程序中内置的驱动程序的初始化顺序?
- 12. Linux启动加载程序
- 13. 驱动程序是什么意思?
- 14. 什么是jdbc驱动程序“org.gjt.mm.mysql.Driver”?
- 15. 什么是pyspark驱动程序?
- 16. 什么是Type 4 XA驱动程序?
- 17. QT:驱动程序未加载,但驱动程序存在
- 18. 为什么使用libusb需要卸载内核驱动程序?
- 19. Linux设备驱动程序
- 20. 学习linux驱动程序
- 21. Linux驱动程序和device.h
- 22. 访问Linux驱动程序
- 23. Linux驱动程序phys_mem_access_prot undefined
- 24. hadoop中配置文件的加载顺序是什么?
- 25. Linux内核如何知道在启动时加载哪些驱动程序?
- 26. 手动加载驱动程序
- 27. 启动vim时脚本的加载顺序是什么?
- 28. Linux静态驱动程序加载问题
- 29. 嵌入式Linux的Linux驱动程序
- 30. Chrome驱动程序硒下载位置
感谢@Yasushi Shoji为您提供了非常详细的解释! – 2012-07-26 06:49:11
这是一个很好的答案! – VividD 2014-08-20 08:39:18