### 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币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 20190313-100538-非对称电容在变压器油中10kv高压电作用下产生力的现象
- GB材料数据库(!请注意鉴别其中的材料参数并不是完全正确!)
- JAVA商城,支持小程序商城、 供应链商城 小程序商城 H5商城 app商城超全商城模式官网 支持小程序商城 H5商城 APP商城 PC商城
- springboot的在线商城系统设计与开发源码
- springboot的飘香水果购物网站的设计与实现 源码
- NO.4学习样本,请参考第4章的内容配合学习使用
- 20190312-084407-旋转磁体产生的场对周围空间长度的影响-数值越大距离越短
- 嵌入式系统应用-LVGL的应用-智能时钟 part 2
- 国家安全教育课程结课论文要求.docx
- FIR数字滤波器设计与软件实现.pdf