解析 Linux 内核可装载模块的版本检查机制-模块的构建与测试
- UID
- 1066743
|
解析 Linux 内核可装载模块的版本检查机制-模块的构建与测试
为内核构建外部模块前,我们须准备一颗内核源码树(kernel source tree)。内核源码树就是一套包含系统配置及内核头文件的内核目录树。须指出的是 Linux 2.6 的内核源码树与 2.4 的不同,先前的内核只需一套内核头文件就可以了,但在 2.6 的内核源码树中还需存在一些目标文件及工具,如 scripts/mod/modpost 等。清单 12 所示是从内核源码进行内核模块预编译以此生成内核树,当然您也可使用 Linux 发行版的内核源码树(系统内核树一般存放在 /lib/modules/<kernel version>/build,如果存在的话)。
清单 12. 预编译内核模块1
2
3
| # make menuconfig
# make modules_prepare
#
|
当然,我们最先须根据主机的硬件信息产生内核配置文件 .config。您可使用命令 make menuconfig 或 make config 等来配置与模块相关的选项(与 相互对应,显示了模块相关的内核配置选项)。设置选项 CONFIG_MODULES=y 以及 CONFIG_MODVERSIONS=y 使内核支持模块的版本检查。另须注意的是,模块预编译并不生成 Module.symvers 文件,即使您开启了 CONFIG_MODVERSIONS 选项。因此最好的方式是完全编译 Linux 内核。
清单 13. 使用 make menuconfig 配置内核模块选项1
2
3
4
5
6
7
| # make menuconfig
--- Enable loadable module support
[ ] Forced module loading
Module unloading
[ ] Forced module unloading
Module versioning support
Source checksum for all modules
|
清单 14. 模块相关的内核配置选项1
2
3
4
5
6
| 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. 构建外部模块1
2
3
4
5
6
7
8
9
10
| # 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'
|
|
|
|
|
|
|