3. 制作可加载内核模块

LKM 存在于单个 ELF 目标文件(通常命名为 "serial.o")。您通常将所有 LKM 目标文件保存在特定目录中(靠近您的基本内核镜像的位置比较合理)。当您使用 insmod 程序将 LKM 插入内核时,您需要提供该目标文件的名称。

对于属于 Linux 的 LKM,您可以通过生成基本内核镜像的相同内核构建过程来构建它们。请参阅 Linux 源代码树中的 README 文件。简而言之,在使用诸如 make zImage 之类的命令制作基本内核镜像后,您将使用以下命令制作所有 LKM

make modules     

这将在整个 Linux 源代码树中生成一堆 LKM 目标文件 (*.o)。(在旧版本的 Linux 中,在modules目录中会有指向所有这些 LKM 目标文件的符号链接)。这些 LKM 已准备好加载,但您可能希望将它们安装到某些合适的目录中。传统位置在第 5.6 节中描述。 make modules_install 命令会将它们全部复制到传统位置。

配置 Linux 内核(在构建时)的一部分是选择将内核的哪些部分绑定到基本内核中,以及将哪些部分生成为单独的 LKM。在基本问答配置 (make config) 中,系统会询问您,对于内核的每个可选部分,您是希望将其绑定到内核中(“Y” 响应),创建为 LKM(“M” 响应),还是完全跳过(“N” 响应)。其他配置方法类似。

正如第 2.3 节中所述,您应该只将最基本的部分绑定到基本内核中。并且只完全跳过您确定永远不需要的部分。构建一个您不会使用的 LKM 几乎没有什么损失。 一些编译时间,一些磁盘空间,一些代码中问题导致内核构建失败的可能性。 仅此而已。

作为配置对话的一部分,您还必须选择是否使用符号版本控制。此选择会影响基本内核和 LKM 的构建,并且正确理解这一点至关重要。请参阅第 6 节

不属于 Linux 的 LKM(即,未与 Linux 内核一起分发的 LKM)有其自己的构建过程,我将不在此处介绍。 但是,任何此类过程的目标始终是生成一个 ELF 目标文件。

您不必同时重建所有 LKM 和基本内核镜像(例如,您可以仅构建基本内核并使用您之前构建的 LKM),但这始终是一个好主意。 请参阅第 6 节