最近有一个问题一直困扰着我。
由于几乎所有专有模块都在树之外(因此不针对任何内核版本进行编译),我想知道它们到底是如何编译和加载的。
许多主要组织允许下载单个或其他任何内容.tar.gz
,.deb
并且它可以跨多个内核版本运行。
下载的模块是在目标机器上构建的吗?
他们分发源代码吗?
源代码是否知道他们正在构建哪个内核模块版本?
或者驱动程序是否强制将自己加载到内核上,finit_module
或者init_module
使用忽略版本魔术标志
还是幕后还有其他事情正在发生?
提前致谢。
答案1
一般方法是提供包含专有代码的目标文件和作为源代码提供的“垫片”,必要时为适当的内核重新构建。接口代码处理内核的所有模块接口,包括带有版本字符串的符号导入等。
例如,NVIDIA 驱动程序包含一个nv-kernel.o
仅以二进制形式提供的文件,并最终包装在内核模块中。