Linux 内核可装载模块对设备驱动的影响
从 到 ,内核在可装载模块机制、设备模型、一些核心 等方面发
生较大改变,设备驱动开发人员面临着将驱动从 移植到 内核,或是使驱动同时支
持 与 内核的任务。站在设备驱动开发人员的角度,驱动由一个或几个外部可加载
内核模块组成,本文针对 内核里模块机制的改变对编写设备驱动程序的影响,从内核
模块的编译、装载时的版本检查、初始化与退出、模块使用计数、输出内核符号、命令行
输入参数、许可 证声明等方面比较了 与 内核的区别;并总结了使设备驱动同时
支持 与 内核的一系列模板。
1.获取内核版本
当设备驱动需要同时支持不同版本内核时,在编译阶段,内核模块需要知道当前使用
的内核源码的版本,从而使用相应的内核 。与 内核下,源码头文件
定义有:
!内核版本的二进制表示,主、从、修订版本号各对应一
个字节;
"#$%&'$'%(- 由主、从、修订版本号构造二进制
版本号。
在同时支持 与 内核的设备驱动程序中,经常可以看到以下代码段:
清单 ):判断内核版本的代码段。
*+,-**+,-*
2.内核模块机制的改变
) 模块编译
从 到 ,外部可装载内核模块的编译、连接过程以及 .%-/ 的书写都发生
了改变。
内核中,模块的编译只需内核源码头文件;需要在包含 $, 之前定
义 . ;编译、连接后生成的内核模块后缀为。
内核中,模块的编译需要配置过的内核源码;编译、连接后生成的内核模块后缀
为-;编译过程首先会到内核源码目录下,读取顶层的 .%-/ 文件,然后再返回模块
源码所在目录。
清单 :内核模块的 .%-/ 模板