程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了编译进入内核的驱动程序的init函数调用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决编译进入内核的驱动程序的init函数调用?

开发过程中遇到编译进入内核的驱动程序的init函数调用的问题如何解决?下面主要结合日常开发的经验,给出你关于编译进入内核的驱动程序的init函数调用的解决方法建议,希望对你解决编译进入内核的驱动程序的init函数调用有所启发或帮助;

内置驱动程序的 init@H_607_4@ 例程仍可以使用@H_2_5@module_init()宏声明该入口点。或者,device_initcall()当驱动程序永远不会被编译为可加载模块时,驱动程序可以使用。或者要在启动顺序的早期阶段移动其初始化,驱动程序可以使用subsys_initcall()

include/linux/init.h调用这些 初始化@H_607_4@ 例程的顺序中,描述为:

/* initcalls are Now grouped by functionality into separate 
 * subsections. Ordering insIDe the subsections is determined
 * by link order. 
 * For BACkWARDs compatibility, initcall() puts the call in 
 * the device init subsection.
 *
 * The `ID' arg to __define_initcall() is needed so that multiple initcalls
 * can point at the same handler without causing duplicate-symbol build errors.
 */

我假定设备驱动程序的这些 小节@H_607_4@drivers与linux内核源树的目录中的子目录相对应,并且 链接顺序@H_607_4@ 记录在中的每个子目录的 内置.o@H_607_4@ 文件中drivers。因此,在内核引导过程中,每个内置驱动程序的 init@H_607_4@ 例程最终都由do_initcalls()in 执行init/main.c

设备驱动程序的 初始化@H_607_4@ 例程负责探测系统,以验证硬件设备是否确实存在。探测失败时,驱动程序不应分配任何资源或注册任何设备。

: 在内核命令行中传递选项“ initcall_deBUG”将导致每个initcall的计时信息被打印到控制台。initcall用于初始化静态链接的内核驱动程序和子系统,并为linux引导过程贡献大量时间。输出如下:

calling  tty_class_init+0x0/0x44 @ 1
initcall tty_class_init+0x0/0x44 returned 0 after 9765 usecs
calling  spi_init+0x0/0x90 @ 1
initcall spi_init+0x0/0x90 returned 0 after 9765 usecs

http ://elinux.org/Initcall_DeBUG

解决方法

在Linux中,如果将设备驱动程序构建为可加载的内核模块,则在插入设备驱动程序内核模块后,内核会调用@H_2_5@module_init()宏所指出的设备驱动程序的init函数。

这对于静态编译到内核中的设备驱动程序如何起作用?他们的init函数如何调用?

大佬总结

以上是大佬教程为你收集整理的编译进入内核的驱动程序的init函数调用全部内容,希望文章能够帮你解决编译进入内核的驱动程序的init函数调用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。