当前位置: 首页 > 面试题库 >

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

邬安邦
2023-03-14
问题内容

在Linux中,如果将设备驱动程序构建为可加载的内核模块,则在插入设备驱动程序内核模块后,内核会调用module_init()宏所指出的设备驱动程序的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



 类似资料:
  • 之前看到一个说法,linux 的源代码基本都是驱动代码 我想知道的是,这些驱动是作为编译后的内核的一部分吗?还是像 glibc 一样,只是一个内核外的软件包 如果我安装了 nv 的 GPU 驱动,那么这些 GPU 驱动也会进去内核吗?

  • 本文向大家介绍linux编译内核的方法,包括了linux编译内核的方法的使用技巧和注意事项,需要的朋友参考一下 1、下载需要的内核版本 2、上传到操作系统 3、解压到/usr/src目录下 比如:3.19内核 tar -xvf linux-3.19.tar.xz -C /usr/src 4、创建连接 cd /usr/src ln -sv /usr/src/linux-3.19 Linux 5、进行

  • 我试图编译odbc驱动程序,但我有以下错误: 我运行以下命令: 我的Ignite版本是2.5下载者(在01.03.2018): 请帮帮我.

  • 我正在使用英特尔SSE/AVX/FMA内部函数来实现一些数学函数的完美内联SSE/AVX指令。 给定以下代码 clang 3.9生成的程序集-march=x86-64-mfma-O3 虽然为sqrt生成的代码很好,但与std fma(依赖于编译器内部std::fma)相比,fma中存在不必要的VxORP(将绝对未使用的xmm3寄存器设置为零)和MOVS指令 GCC 6.2生成的程序集-march=

  • 问题内容: 我从LDD3第14章读到了有关热插拔驱动程序的信息。我需要编写一个USB鼠标驱动程序,在插入硬件时会加载该驱动程序。现在,通过做一些实验,我知道有一个名为“ hid-generic”的驱动程序,在插拔时会被调用。 另外,lsmod显示 我的疑问如下 1)为了在插入此鼠标时加载模块(hotplug),我必须在内核中禁用这3个驱动程序,并使用id_table中具有供应商和设备ID的驱动程序

  • 为什么有些人想要编译新内核?Debian 自带的默认内核已经包含了绝大部分配置, 所以编译新内核并不是必需的。然而,基于以下这些理由,编译新内核还是很有用的: 支持某些特殊的硬件,或者默认的内核配置和某些硬件冲突。 支持某些没有包含在预装内核中的硬件或选项,例如 APM 或 SMP。 compact 和 idepci 版本的内核没有音效支持。虽然 vanilla 版的内核支持, 但它可能因为其它原