专有模块如何适用于大多数内核版本?

专有模块如何适用于大多数内核版本?

最近有一个问题一直困扰着我。

由于几乎所有专有模块都在树之外(因此不针对任何内核版本进行编译),我想知道它们到底是如何编译和加载的。

许多主要组织允许下载单个或其他任何内容.tar.gz.deb并且它可以跨多个内核版本运行。

下载的模块是在目标机器上构建的吗?

他们分发源代码吗?

源代码是否知道他们正在构建哪个内核模块版本?

或者驱动程序是否强制将自己加载到内核上,finit_module或者init_module使用忽略版本魔术标志

还是幕后还有其他事情正在发生?

提前致谢。

答案1

一般方法是提供包含专有代码的目标文件和作为源代码提供的“垫片”,必要时为适当的内核重新构建。接口代码处理内核的所有模块接口,包括带有版本字符串的符号导入等。

例如,NVIDIA 驱动程序包含一个nv-kernel.o仅以二进制形式提供的文件,并最终包装在内核模块中。

相关内容