### Linux 2.6下Driver开发的34个变化 #### 概述 随着Linux 2.6的发布,由于2.6内核做了许多重要的改动,因此各个设备的驱动程序在不同程度上需要进行更新与调整。为了方便各位Linux爱好者更好地理解和适配新版本的内核,下面将详细介绍部分关键的变化。 #### 1. 使用新的入口 在2.6版本中,必须包含 `<linux/init.h>` 头文件,并使用 `module_init()` 和 `module_exit()` 来声明模块的初始化和退出函数。 - **新版本**: ```c #include <linux/init.h> module_init(your_init_func); module_exit(your_exit_func); ``` - **老版本**: - 使用 `int init_module(void)` 和 `void cleanup_module(void)`。 在2.4内核中,两种方式都可以使用。但是2.6以后,必须按照新的规范来编写。 #### 2. GPL许可证 - **新版本**: ```c MODULE_LICENSE("Dual BSD/GPL"); ``` - **老版本**: ```c MODULE_LICENSE("GPL"); ``` 新版本支持更灵活的许可证类型。 #### 3. 模块参数 - **新版本**: ```c #include <linux/moduleparam.h> module_param(name, type, perm); module_param_named(name, value, type, perm); ``` 参数定义: ```c module_param_string(name, string, len, perm); module_param_array(name, type, num, perm); ``` - **老版本**: ```c MODULE_PARM(variable, type); MODULE_PARM_DESC(variable, type); ``` 2.6内核引入了更为强大的模块参数处理机制。 #### 4. 模块别名 - **新版本**: ```c MODULE_ALIAS("alias-name"); ``` - **老版本**: 在 `/etc/modules.conf` 文件中配置。 2.6内核提供了更为便捷的方式来定义模块别名。 #### 5. 模块计数 - **新版本**: ```c int try_module_get(&module); module_put(); ``` - **老版本**: ```c MOD_INC_USE_COUNT; MOD_DEC_USE_COUNT; ``` 模块计数的管理方式变得更加直观。 #### 6. 符号导出 - **新版本**: 只有显式导出的符号才能被其他模块使用。 - **老版本**: 默认导出所有符号,除非使用 `EXPORT_NO_SYMBOLS`。 这种变化有助于提高模块间的隔离性和安全性。 #### 7. 内核版本检查 - **新版本**: 在多个文件中包含 `<linux/module.h>` 时,无需定义 `__NO_VERSION__`。 - **老版本**: 必须在除主文件外的其他文件中定义 `__NO_VERSION__`,以防版本重复定义。 简化了多文件编译时的复杂性。 #### 8. 设备号 - **新版本**: `kdev_t` 被废弃,新的 `dev_t` 扩展到了32位(12位主设备号,20位次设备号)。 ```c unsigned int iminor(struct inode *inode); unsigned int imajor(struct inode *inode); ``` - **老版本**: 8位主设备号,8位次设备号 ```c 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, }; ``` - **老版本**: 非标准的初始化形式: ```c static struct some_structure = { field1: value, field2: value, }; ``` 新版本遵循了更严格的编程规范。 #### 11. 用户模式帮助器 - **新版本**: ```c int call_usermodehelper(char *path, char **argv, char **envp, int wait); ``` 新增 `wait` 参数。 - **老版本**: 无此变化。 这一变化增加了用户模式帮助器的灵活性。 #### 12. request_module() - **新版本**: ```c request_module("foo-device-%d", number); ``` - **老版本**: ```c char module_name[32]; snprintf(module_name, sizeof(module_name), "foo-device-%d", number); request_module(module_name); ``` 新版本简化了动态请求模块的过程。 #### 13. dev_t引发的字符设备的变化 - **新版本**: - 取主次设备号: ```c unsigned int iminor(struct inode *inode); unsigned int imajor(struct inode *inode); ``` - 注册字符设备范围: ```c int register_chrdev_region(dev_t from, unsigned int count, const char *name); ``` 新版本提供了更强大的设备号管理功能。 以上概述了Linux 2.6内核中驱动程序开发的部分关键变化。这些改变旨在提高系统的稳定性和性能,同时简化了开发者的编写过程。对于想要适应最新内核版本的开发者来说,理解这些变化是非常重要的。
剩余9页未读,继续阅读
- 粉丝: 43
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 处理定时器和消息的队列.7z
- 基于netty3.5的游戏服务器端框架 消息封装,编解码结构提供扩展,请求消息队列处理,基于protobuf的实例已经完成.7z
- 一个服务器处理框架,包括 协议处理,消息处理,持久层数据处理.7z
- matlab实现粒子群算法综合线阵低副瓣方向图设计-粒子群算法-天线阵列-PSO算法-matlab
- 动态规划算法详解及应用实例分析
- fscan一款内网资产排查工具提高工作效率
- 800高压脱泡机.STEP全套设计资料100%好用.zip
- 动态规划算法详解及Python代码实现
- 50kg双向单立柱堆垛机step全套设计资料100%好用.zip
- BBR12包装机卷包机热熔编带机sw12可编辑+cad全套设计资料100%好用.zip
- SQLAlchemy 基础用法完整示例
- X射线平板探测器架车step全套设计资料100%好用.zip
- TE-桁架机械手sw12全套设计资料100%好用.zip
- Z2021-4-顶升移栽机sw18可编辑全套设计资料100%好用.zip
- 2024注册测绘师《综合能力》讲义-第3章-工程测量(3)城乡规划与建筑工程测量.pdf
- 点胶贴合机step全套设计资料100%好用.zip