您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

编译进入内核的驱动程序的init函数调用

编译进入内核的驱动程序的init函数调用

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

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

/* 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.
 */

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

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

: 在内核命令行中传递选项“ 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

其他 2022/1/1 18:18:36 有316人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶