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

Linux内置驱动程序加载顺序是什么?

公良子轩
2023-03-14
问题内容

我们如何自定义内置驱动程序加载顺序(先加载一些内置驱动程序模块,然后加载相关模块)?


问题答案:

内置驱动程序不会被 加载
,因此是内置的。当内核自行设置时,将调用它们的初始化函数并激活驱动程序。这些init函数在中调用init/main.c::do_initcalls()。所有init调用都按级别进行分类,这些级别在initcall_levels和中定义include/linux/init.h

这些级别是在链接描述文件(arch/*/kernel/vmlinux.lds.*)中定义的实际符号。在内核编译时,链接器收集标记为module_init()或其他的所有函数*_initcall(),按级别分类,将同一级别中的所有函数放在同一位置,然后像函数指针数组一样创建。

do_initcall_level()在运行时所执行的操作是调用数组中指针所指向的每个函数。在do_initcall_level中,除了级别以外,没有任何调用策略,但是数组的顺序由链接时间决定。

因此,现在您可以看到在链接时驱动程序的启动顺序是固定的,但是您该怎么办?

  1. 将您的init函数放在更高的级别,或者
  2. 将设备驱动程序放在更高的位置 Makefile

如果您已阅读以上内容,则第一个内容很清楚。即)如果合适,请使用early_initcall()。

第二个需要更多解释。Makefile问题的顺序是当前内核构建系统的工作方式以及链接器的工作方式。简而言之,构建系统将所有目标文件放入obj-y并将它们链接在一起。它是高度依赖于环境的,但是链接程序很有可能将第一个目标文件obj-y放在较低的地址中,因此称为较早的地址。

如果只希望您的驱动程序早于同一目录中的其他驱动程序被调用,这是最简单的方法



 类似资料:
  • 问题内容: 有人告诉我,加载JDBC驱动程序的首选方法是: 我知道,这对于从XML配置文件或用户输入中读取多个驱动程序之间的动态决策更好。我很好奇的是,调用此语句如何将指定的驱动程序加载到我们什至没有将生成的“ Class”对象存储在任何地方的环境中。JavaDocs条目说: 返回与具有给定字符串名称的类或接口关联的Class对象 在那种情况下,Java开发人员仅凭此语句如何设法促进驱动程序对象的

  • 主要内容:GRUB加载内核的过程在刚刚的启动过程中,我们已经知道启动引导程序(Boot Loader,也就是 GRUB)会在启动过程中加载内核,之后内核才能取代 BIOS 接管启动过程。如果没有启动引导程,那么内核是不能被加载的。 本节,我们就来看看启动引导程序加载内核的过程,当然 initramfs 这个虚拟文件系统也是要靠启动引导程序调用的。在 CentOS 6.x 中,启动引导程序默认是 GRUB,GRUB 是现在最为流行

  • 我正在处理Spring Boot项目,突然遇到应用程序无法加载MySQL jdbc的问题。(我编译了一次这个项目,没有改变任何东西) 这是我的pom.xml: 这是我的application.properties: Logcat: MySQL数据库最初是使用hibernate创建的。这些配置工作正常,但我不确定这里的真正问题是什么 编辑:我删除了。m2文件夹并从一开始安装所有依赖项。

  • 问题内容: 在Windows 10 Enterpise 64位(Microsoft Edge版本:25.10586.672.0)和Microsoft WebDriver-版本10240的本地计算机上运行selenium时出现错误。我的Selenium版本为:3.6.0 当我运行代码时,打开边缘浏览器并出现错误: 问题答案: 您可能会考虑研究发行说明中提到的内容: 更新.NET绑定以不发送不正确的W

  • 我有一个Spring应用程序,在IDE和本地mariadb中运行良好,在POM中使用mariadb 2.7.4,如下所示,但我在Ubuntu上运行它时出现了第二个错误。我已经删除了mysql连接器,但仍然存在问题。为什么会出现差异和问题? 原因:组织。springframework。豆。BeanInstationException:未能实例化[com.zaxxer.hikari.HikariDat

  • 嘿,伙计们,还有一个问题,下面是信息