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

如何构建Linux内核模块,使其与所有内核版本兼容?

安明亮
2023-03-14
问题内容

我想构建一个将与所有内核发行版兼容的内核模块。例如,如果我在内核3.2.0-29上构建内核模块并尝试在3.2.0-86上加载它,则会出现以下错误:

modprobe my_driver

致命:插入my_driver(/lib/modules/3.2.0-86-generic/kernel/fs/my_drv/my_drv.ko)时出错:无效的模块格式

[在日志消息中:my_drv:对符号module_layout的版本持不同意见]

如何在3.2.0-29上构建适用于所有3.2.0版本的内核模块。


问题答案:

简而言之 :您 几乎 无法编写有用的内核模块,该模块可以加载到相对广泛的版本的内核中。

当针对编译时使用的内核构建模块时CONFIG_MODVERSIONS(如您的情况),对于从内核导出的每个符号,该符号的CRC都存储在模块文件中。CRC是某种
控制总和 ,除其他事项外,还考虑了用于函数参数的类型布局。例如,如果假设的布局struct A在两个内核f(struct A *a)中不同,则这些内核中功能的CRC也将不同。

将模块加载到正在运行的内核时,会将模块中所有功能的CRC与内核的功能进行比较。如果它们不同,则内核拒绝加载模块。要了解有关此机制的更多信息,请参阅内核的文档(Documentation
/ kbuild /
modules.txt

)。

因此,为了使一个模块可加载到两个不同的内核中,您仅受参数在两个内核中具有相同布局的函数的限制。特别是,如果类型的布局struct module不同,则无法为两个内核加载单个模块。

有几种方法可以交付适用于多个内核的驱动程序。最简单的方法是交付驱动程序的
并将其添加到中dkms。这样,如果正在运行的内核没有构建驱动程序,则将使用其源代码 自动 编译驱动程序。



 类似资料:
  • 主要内容:initramfe虚拟文件系统GRUB 加载了内核之后,内核首先会再进行二次系统的自检,而不一定使用 BIOS 检测的硬件信息。这时内核终于开始替代 BIOS 接管 Linux 的启动过程了。 内核完成再次系统自检之后,开始采用动态的方式加载每个硬件的模块,这个动态模块大家可以想象成硬件的驱动(默认 Linux 硬件的驱动是不需要手工安装的,如果是重要的功能,则会直接编译到内核当中;如果是非重要的功能,比如硬件驱动会编译为模块

  • 主要内容:内核模块保存位置与模块保存文件,内核模块的查看,内核模块的添加与删除Linux 的内核会在启动过程中自动检验和加载硬件与文件系统的驱动。一般这些驱动都是用模块的形式加载的,使用模块的形式保存驱动,可以不直接把驱动放入内核,有利于控制内核大小。 模块的全称是 动态可加载内核模块,它是具有独立功能的程序,可以被单独编译,但不能独立运行。模块是为内核或其他模块提供功能的代码集合。这些模块可以是 Linux 源码中自带的,也可以是由硬件厂商开发的(可以想象成驱动)。不过内

  • 由于Linux系统的特殊性,G01对于Linux系统的支持主要以内核版本为主,即"uname -a"所显示的版本信息;而不以系统的版本信息为支持标准。 以下表格中为当前G01支持的Linux系统内核版本,安装时请进行参考。 CentOS/RedHat Linux 内核版本 CentOS 7/RedHat Linux 7 CentOS 6/RedHat Linux 6 CentOS 5/RedHat

  • MANAGING THE LINUX KERNEL AND LOADABLE KERNEL MODULES 所有操作系统至少由两个主要组件组成。其中第一个也是最重要的是内核。 内核位于操作系统的中心,控制着操作系统所做的一切,包括管理内存,控制 CPU,甚至控制用户在屏幕上看到的内容。操作系统的第二个元素通常被称为用户区域,几乎包括其他所有元素。 内核被设计成一个受保护或特权的区域,只能由 roo

  • 内核模块 对于模块而言,引导选项只能用于直接编译到核心中的模块,格式是"模块名.选项=值",比如"usbcore.blinkenlights=1"。 动态加载的模块则可以在 modprobe 命令行上指定相应的选项值,比如"modprobe usbcore blinkenlights=1"。 可以使用"modinfo -p ${modulename}"命令显示可加载模块的所有可用选项。已经加载到内

  • 问题内容: 我正在从事学术项目,该项目修改了一些代码并包含了新代码。 我正在使用QEMU加载修改后的内核并进行测试。 但是,我发现某些操作系统需要完整的操作系统才能进行调试。 没有它可能吗? 或者,这是可以与Kernel 2.6一起用于系统的发行版。除了运行程序的功能(包括网络支持)以外,发行版不需要具有任何功能。 问题答案: 我认为最简单的方法是使用buildroot http://buildr