全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux2.6与2.4内核驱动程序的区别(2008-07-04 16:50:16) 转载 标签: it分类:Kernel&Driver 为了彻底防止对正在被使用的内核模块进行错误操作,linux2.6内核在加载和导出内核模块方面都较2.4内核有所改进,避免了用户执行将导致系统崩溃的操作(例如强制删除模块等)。同时,当驱动程序需要在多个文件中包含头文件时,不必定义宏来检查内核的版本。 与2.4内核相比,2.6内核在可扩展性、吞吐率等方面有较大提升,其新特性主要包括: 使用了新的调度器算法; 内核抢占功能显著地降低了用户交互式应用程序; 多媒体应用程序等类似应用程序的延迟; 改进了线程模型以及对NPTL的支持,显著改善了虚拟内存在一定成程度负载下的性能; 能够支持更多的文件系统; 引进了内存池技术; 支持更多的系统设备,在2.4内核中有约束大型系统的限制,其支持的每一类设备的最大数量为256,而2.6内核则彻底打破了这些限制,可以支持4095种主要的设备类型,且每个单独的类型又可以支持超过一百万个的子设备; 支持反向映射机制(reverse mapping),内存管理器为每一个物理页建立一个链表,包含指向当前映射页中每个进程的页表条目的指针。该链表叫PTE链,它极大的提高了找到那些映射某个页的进程的速度。 Linux操作系统的设备驱动程序是在内核空间运行的程序,其中涉及很多内核的操作,随着Linux内核版本的升级,驱动程序的开发必然也要作出相应的修改,总之,在linux2.6内核上编写设备驱动程序时具体要注意以下几个方面: 1)Linux2.6内核驱动程序必须由MODULE_LICENSE(Dual BSD/GPL)语句来定义许可证,而不能再用2.4内核的MODULE_LICENSE(GPL)。否则,在编译时会出现警告提示。 2)Linux2.6内核驱动程序可以用int try_module_get(&module)来加载模块,用module_put()函数来卸载模块,而以前2.4内核使用的宏MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT则可不用。 3)前面给出的字符型设备驱动程序模型中结构体file_operations的定义要采用下面的形式。这是因为在2.6Linux内核中对结构体的定义形式发生了变化,不再支持原来的定义形式。这个声明采用了标记化结构初始化语法。这种写法是值得采用的,因为它使驱动程序在结构的定义发生变化时更具有可移植性,并且使代码更加紧凑且易读。标记化的初始化方法允许对结构成员进行重新排列。在某些场合下,将频繁被访问的成员放在相同的硬件缓存行上,将大大提高性能。-LLD3 4)就字符型设备而言,test_open()函数中向内核注册设备的调用函数register_chrdev()可以升级为int register_chrdev_region(dev_t from,unsigned count,char * name),如果要动态申请主设备号可调用函数int alloc_chrdev_region(dev_t * dev,unsigned baseminor,unsigned count,char * name)来完成;原来的注册函数还可以用,只是不能注册设备号大于256的设备,同理,对于块设备和网络设备的注册函数也有着相对应的代替函数。 5)在声明驱动程序是否要导出符号表方面有着很大的变化。当驱动程序模块装入内核后,它所导出的任何符号都会变成公共符合表的一部分,在/proc/ksyms中可以看到这些新增加的符号。通常情况之下,模块只需实现自己的功能,不必导出任何符号,然而,如果有其他模块需要使用模块导出的符号时,就必须导出符号,只有显示的导出符号才能被其他模块使用,Linux2.6内核中默认不导出所有的符号,不必使用EXPORT_NO_SYMBOLS宏来定义;而在2.4内核中恰恰相反,它默认导出所有的符号,除非使用EXPORT_NO_SYMBOLS,因此在上面给出的范例中可以省略去该定义语句。 6)2.6Linx内核统一了很多设备类型,同时也支持更大的系统和更多的设备,原来Linux2.4内核中的变量kdev_t已经被废除不可用,取而代之的是dev_t。它拓展到了32位,其中包括12位(4096个)主设备号和20位次设备号。调用函数为unsigned int iminor(struct inode * inode)和unsigned int imajor(struct inode * inode),而不再用Linux2.4版本中的int MAJOR(kdev_t dev)和int MINOR(kdev_t dev)。 7)所有的内存分配函数不再包含在头文件linux/malloc.h中,而是包含在linux/slab.h中,而原来的linux/malloc.h已经不存在。所以当在驱动程序中要用到函数kmalloc()或kfree()等内存分配函数时,就必须要定义头文件linux/slab.h而不是linux/malloc.h。同时,前面提到的申请内存和释放内存函数的具体参数也有了一定的改变,包括:分配标志GFP_BUFFER被取消,取而代之的是GFP_NOIO和GFP_NOFS;新增了_GFP_REPEAT、_GFP_NOFAIL和_GFP_NORETRY分配标志等,使得内存操作更加方便。 8)因为内核中有些地方的内存分配是不允许失败的,所以为了确保这种情况下得成功分配,linux2.6版本内核中开发了一种称为内存池的抽象。内存池其实相当于后备的高速缓存,以便在紧急状态下使用。要使用内存池的处理函数时,必须包含头文件linux/mempool.h。内存池处理函数主要有以下几个:mempool_t *mempool_create()、void*mempool_alloc()、void
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 构建信任:人文护理中的护患关系重塑
- 2026年高考数学一轮复习:平面向量的数量积及其应用(讲义)解析版
- 2026外研版高考英语复习晨读重点:人与社会
- 医学生基础医学 白细胞计数护理课件
- 2026年人教版九年级物理上册热点题型专练:第十四章 内能的利用(实验题24道)原卷版+解析
- 医学肾病综合征肾活检病理分析案例教学课件
- 医学扫描隧道显微镜防疫流行病学分析教学课件
- 2026年高考作文备考训练:热爱祖国从我做起;奋力拼搏笃行不怠;为者常成行者常至
- 医学脑梗死合并平衡功能障碍康复案例教学课件
- 医学流行病学答辩寄生虫组数据教学课件
- 2025广东河源市高新技术开发区有限公司国企职员招聘19人考试笔试备考试题及答案解析
- 第三章 指数运算与指数函数(高效培优单元测试-强化卷)数学北师大版2019必修第一册(原卷版)
- 桥梁施工关键质量控制方法与要点
- 重庆市国有企业招聘笔试题库2025
- 2025福建厦门轨道交通集团限公司(厦门地铁)社会招聘7人易考易错模拟试题(共500题)试卷后附参考答案
- 主题班会活动方案设计与实施步骤
- 统编版(2024)八年级上册历史第五单元测试卷(含答案)
- 2025年特种设备叉车作业证理论考试笔试试题(附含答案)
- 2025年南昌市消防救援支队水上大队招聘勤务及宣传勤务文员3人笔试考试参考试题及答案解析
- 2025-2026学年北师大版数学九年级上册期末考试模拟试卷
- 航空航天技术:高性能碳纤维复合材料在航天器结构中的应用
评论
0/150
提交评论