解析 Linux 内核可装载模块的版本检查机制(3)

模块的构建与测试

为内核构建外部模块前,我们须准备一颗内核源码树(kernel source tree)。内核源码树就是一套包含系统配置及内核头文件的内核目录树。须指出的是 Linux 2.6 的内核源码树与 2.4 的不同,先前的内核只需一套内核头文件就可以了,但在 2.6 的内核源码树中还需存在一些目标文件及工具,如 scripts/mod/modpost 等。清单 12 所示是从内核源码进行内核模块预编译以此生成内核树,当然您也可使用 Linux 发行版的内核源码树(系统内核树一般存放在 /lib/modules/<kernel version>/build,如果存在的话)。


清单 12. 预编译内核模块

# make menuconfig # make modules_prepare #  

当然,我们最先须根据主机的硬件信息产生内核配置文件 .config。您可使用命令 make menuconfig 或 make config 等来配置与模块相关的选项(清单 13与 清单 14相互对应,显示了模块相关的内核配置选项)。设置选项 CONFIG_MODULES=y 以及 CONFIG_MODVERSIONS=y 使内核支持模块的版本检查。另须注意的是,模块预编译并不生成 Module.symvers 文件,即使您开启了 CONFIG_MODVERSIONS 选项。因此最好的方式是完全编译 Linux 内核。


清单 13. 使用 make menuconfig 配置内核模块选项

# make menuconfig --- Enable loadable module support [ ] Forced module loading [*] Module unloading [ ] Forced module unloading [*] Module versioning support [*] Source checksum for all modules  



清单 14. 模块相关的内核配置选项

CONFIG_MODULES CONFIG_MODULE_FORCE_LOAD CONFIG_MODULE_UNLOAD CONFIG_MODULE_FORCE_UNLOAD CONFIG_MODVERSIONS CONFIG_MODULE_SRCVERSION_ALL  

内核 2.6 时,我们常为模块的构建编写一个 Makefile 文件,但仍可使用类似内核 2.4 下的模块构建命令。清单 15 展示了外部模块构建的 make 命令,其中 $KDIR 是内核树的绝对路径,$MDIR 是期望构建的模块的绝对路径(若是内部模块则可使用 make CONFIG_EXT2_FS=m …)。


清单 15. 构建外部模块

# make -C $KDIR M=$MDIR [target] # make -C /lib/modules/2.6.38-10-generic/build M=$PWD/hello modules make: Entering directory `/usr/src/linux-headers-2.6.38-10-generic' CC [M] /home/harris/work/samples/hello/hello.o Building modules, stage 2. MODPOST 1 modules CC /home/harris/work/samples/hello/hello.mod.o LD [M] /home/harris/work/samples/hello/hello.ko make: Leaving directory `/usr/src/linux-headers-2.6.38-10-generic'  

结束语

虽然本文已尽量集中描述可装载模块的版本检查机制,但是仍然涉及了非常多的内容。您需花一些时间来了解这些看似与模块不相关的内容,如 /proc、/sys 文件系统、ELF(即 Executable and Linkable Format)格式等,以此更好的全面理解内核可装载模块以及模块版本版本检查机制。另外,由于文章讨论的是 Linux 2.6 的外部模块,没有清晰的讲述内核的 Kbuild 系统及 Makefile 文件,但这对于模块亦是重要的内容。

样例代码 samples.tar.gz  下载:

免费下载地址在

用户名与密码都是

具体下载目录在 /2013年资料/7月/11日/解析 Linux 内核可装载模块的版本检查机制

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/4554eb2a2d4589043e3ac8ef5b34832d.html