### Linux 2.6下Driver开发的34个变化 #### 概述 随着Linux 2.6内核的发布,对于驱动开发者来说,需要适应众多的变化与改进。本文将详细探讨从Linux 2.4到2.6版本中驱动开发的一些主要变化,并对每个变化进行深入解释。 #### 1. 模块初始化与卸载接口 在2.6中,模块初始化与卸载的接口有所改变: - **新版本**: - 必须包含`<linux/init.h>`头文件。 - 使用`module_init(your_init_func);` 和 `module_exit(your_exit_func);` 来声明初始化和卸载函数。 - **旧版本**: - 可以使用`int init_module(void);` 和 `void cleanup_module(void);`。 - 不需要显式地包含任何头文件。 #### 2. 模块许可证 - **新版本**: - 使用`MODULE_LICENSE("DualBSD/GPL");`来声明许可证。 - **旧版本**: - 使用`MODULE_LICENSE("GPL");`。 #### 3. 模块参数 - **新版本**: - 必须显式包含`<linux/moduleparam.h>`头文件。 - 使用`module_param(name, type, perm);` 或 `module_param_named(name, value, type, perm);` 来声明参数。 - 可以通过`module_param_string`和`module_param_array`来声明字符串或数组类型的参数。 - **旧版本**: - 使用`MODULE_PARM(variable, type);` 和 `MODULE_PARM_DESC(variable, desc);`。 #### 4. 模块别名 - **新版本**: - 可以通过`MODULE_ALIAS("alias-name");`直接在代码中设置模块别名。 - 在2.4版本中,通常需要在`/etc/modules.conf`中手动配置。 #### 5. 模块计数 - **新版本**: - 使用`int try_module_get(&module);` 和 `module_put();` 来获取和释放模块引用计数。 - **旧版本**: - 使用`MOD_INC_USE_COUNT` 和 `MOD_DEC_USE_COUNT`。 #### 6. 符号导出 - **新版本**: - 只有显式导出的符号才可被其他模块使用。 - 默认情况下不会自动导出所有符号。 - **旧版本**: - 默认导出所有符号,除非使用`EXPORT_NO_SYMBOLS`。 #### 7. 内核版本检查 - **新版本**: - 包含多个文件时,不必定义`__NO_VERSION__`来避免重复定义版本。 - **旧版本**: - 在多个文件中包含`<linux/module.h>`时,除主文件外的其他文件中必须定义`__NO_VERSION__`。 #### 8. 设备号的变化 - **新版本**: - 废除了`kdev_t`类型。 - 新的`dev_t`扩展到了32位,其中12位为主设备号,20位为次设备号。 - 使用`unsigned int imajor(struct inode *inode);` 和 `unsigned int iminor(struct inode *inode);`来获取主次设备号。 - **旧版本**: - 8位主设备号,8位次设备号。 - 使用`int MAJOR(kdev_t dev);` 和 `int MINOR(kdev_t dev);`来获取主次设备号。 #### 9. 内存分配头文件变更 - **新版本**: - 所有的内存分配函数包含在`<linux/slab.h>`中。 - **旧版本**: - 内存分配函数包含在`<linux/malloc.h>`中。 #### 10. 结构体初始化 - **新版本**: - 使用ANSI C的初始化语法,例如: ```c static struct some_structure = { .field1 = value, .field2 = value, }; ``` - **旧版本**: - 使用非标准的初始化语法。 #### 11. 用户模式帮助器 - **新版本**: - 增加了一个新的参数`wait`用于`call_usermodehelper`函数。 #### 12. request_module()函数 - **新版本**: - 可以直接使用`request_module("foo-device-%d", number);`。 - **旧版本**: - 需要手工构建模块名称字符串。 #### 13. dev_t引发的字符设备的变化 - **新版本**: - 主次设备号获取函数变为`unsigned imajor(struct inode *inode);` 和 `unsigned iminor(struct inode *inode);`。 - `register_chrdev()`保持向后兼容,但不能访问设备号大于256的设备。 以上只是从Linux 2.4到2.6版本中驱动开发变化的一部分。这些变化有助于提高系统的稳定性和安全性,同时也使得驱动开发更加标准化和规范化。对于开发者来说,了解这些变化是非常重要的,可以帮助他们更高效地编写和维护驱动程序。
- 粉丝: 2
- 资源: 20
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 5G模组升级刷模块救砖以及5G模组资料路由器固件
- C183579-123578-c1235789.jpg
- Qt5.14 绘画板 Qt Creator C++项目
- python实现Excel表格合并
- Java实现读取Excel批量发送邮件.zip
- 【java毕业设计】商城后台管理系统源码(springboot+vue+mysql+说明文档).zip
- 【java毕业设计】开发停车位管理系统(调用百度地图API)源码(springboot+vue+mysql+说明文档).zip
- 星耀软件库(升级版).apk.1
- 基于Django后端和Vue前端的多语言购物车项目设计源码
- 基于Python与Vue的浮光在线教育平台源码设计