- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux2.6与2.4内核驱动程序的区别
(2008-07-04 16:50:16)
转载
标签:
it 分类:KernelDriver 为了彻底防止对正在被使用的内核模块进行错误操作,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版本中
文档评论(0)