首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

解析 Linux 内核可装载模块的版本检查机制-模块的构建与测试

解析 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'

    返回列表