简而言之 :您 几乎 无法编写有用的内核模块,该模块可以加载到相对广泛的版本的内核中。
当针对编译时使用的内核构建模块时
CONFIG_MODVERSIONS(如您的情况),对于从内核导出的每个符号,该符号的CRC都存储在模块文件中。CRC是某种
控制总和 ,除其他事项外,还考虑了用于函数参数的类型布局。例如,如果假设的布局
struct A在两个内核
f(struct A*a)中不同,则这些内核中功能的CRC也将不同。
将模块加载到正在运行的内核时,会将模块中所有功能的CRC与内核的功能进行比较。如果它们不同,则内核拒绝加载模块。要了解有关此机制的更多信息,请参阅内核的文档(documentation
/ kbuild /
modules.txt)。
因此,为了使一个模块可加载到两个不同的内核中,您仅受参数在两个内核中具有相同布局的函数的限制。特别是,如果类型的布局
structmodule不同,则无法为两个内核加载单个模块。
有几种方法可以交付适用于多个内核的驱动程序。最简单的方法是交付驱动程序的 源
并将其添加到中
dkms。这样,如果正在运行的内核没有构建驱动程序,则将使用其源代码 自动 编译驱动程序。



