linux – init函数调用驱动程序编译成内核
发布时间:2020-12-14 00:28:48 所属栏目:Linux 来源:网络整理
导读:在 Linux中,如果设备驱动程序是作为可加载的内核模块构建的,那么在插入设备驱动程序内核模块时,内核会调用module_init()宏指出的设备驱动程序的init函数. 这对于静态编译到内核中的设备驱动程序有何用处?他们的init函数如何调用? 解决方法 内置驱动程序的i
在
Linux中,如果设备驱动程序是作为可加载的内核模块构建的,那么在插入设备驱动程序内核模块时,内核会调用module_init()宏指出的设备驱动程序的init函数.
这对于静态编译到内核中的设备驱动程序有何用处?他们的init函数如何调用? 解决方法
内置驱动程序的init例程仍然可以使用module_init()宏来声明该入口点.或者,当驱动程序永远不会被编译为可加载模块时,驱动程序可以使用device_initcall().或者为了在引导序列中尽早移动它的初始化,驱动程序可以使用subsys_initcall().
在include / linux / init.h中,调用这些init例程的顺序描述如下: /* 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. */ 我假设设备驱动程序的这些子部分对应于Linux内核源代码树的drivers目录中的子目录,并且链接顺序记录在驱动程序中每个子目录的built-in.o文件中.因此在内核启动期间,每个内置驱动程序的init例程最终都由init / main.c中的do_initcalls()执行. 设备驱动程序的init例程负责探测系统以验证HW设备是否实际存在.探测失败时,驱动程序不应分配任何资源或注册任何设备. 更新: 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |