linux – init函数调用驱动程序编译成内核
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – init函数调用驱动程序编译成内核,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1614字,纯文字阅读大概需要3分钟。
内容图文
![linux – init函数调用驱动程序编译成内核](/upload/InfoBanner/zyjiaocheng/968/13575362e5044376b300d081ed3f0c45.jpg)
在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设备是否实际存在.探测失败时,驱动程序不应分配任何资源或注册任何设备.
更新:
在内核命令行上传递选项“initcall_debug”将导致为每个initcall打印到控制台的计时信息. initcalls用于初始化静态链接的内核驱动程序和子系统,并为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 – init函数调用驱动程序编译成内核全部内容,希望文章能够帮你解决linux – init函数调用驱动程序编译成内核所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。