首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
搜索中心 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>其他编程>正文

Linux2.6与2.4内核驱动程序的区别

http://www.oklinux.cn  2008-07-05  linuxidc   会员收藏  游客收藏  【 】 
您查看的文章来源于http://www.oklinux.cn

  为了彻底防止对正在被使用的内核模块进行错误操作,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的定义要采用下面的形式。这是因为在Linux内核中对结构体的定义形式发生了变化,不再支持原来的定义形式。

  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)Linx内核统一了很多设备类型,同时也支持更大的系统和更多的设备,原来Linux2.4内核中的变量kdev_t已经被废除不可用,取而代之的是dev_t。它拓展到了32位,其中包括12位主设备号和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)所有的内存分配函数不再包含在头文件中,而是包含在中,而原来的已经不存在。所以当在驱动程序中要用到函数kmalloc()或kfree()等内存分配函数时,就必须要定义头文件而不是。同时,前面提到的申请内存和释放内存函数的具体参数也有了一定的改变,包括:分配标志GFP_BUFFER被取消,取而代之的是GFP_NOIO和GFP_NOFS;新增了_GFP_REPEAT、_GFP_NOFAIL和_GFP_NORETRY分配标志等,使得内存操作更加方便。

  8)因为内核中有些地方的内存分配是不允许失败的,所以为了确保这种情况下得成功分配,Linux2.6版本内核中开发了一种称为"内存池"的抽象。内存池其实相当于后备的高速缓存,以便在紧急状态下使用。要使用内存池的处理函数时,必须包含头文件。内存池处理函数主要有以下几个:mempool_t *mempool_create()、void*mempool_alloc()、void mempool_free()、int mempool_resize();

  另外值得一提的是:2.6内核为了区别以.o为扩展名的常规对象文件,将内核模块的扩展名改为.ko,所以驱动程序最后是被编译为ko后缀的可加载模块,在应用程序中加载驱动程序模块时要注意。


上一篇:Linux下对C代码的编译   下一篇:Linux终端不回显

收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·Linux终端不回显
·Linux下对C代码的编译
·升级Linux内核错误解决
·C语言编写Linux下的守护进程
·避免Linux脚本多次运行
·学习Linux源码及实践
·Linux下创建和编译Qt项目
·Linux 下部署Java工程编码问题
·Linux启动时自动加载脚本
·Linux log路径/var/log系统级别log syslog openlog cl
·准备进行Linux设备驱动的开发了
·Ubuntu调用函数分析
·Linux下能不能替换运行中的程序
·在Linux系统中实现虚桩式内核模块
·关于Linux下输出信息到文件的两点认识
·Linux学习笔记之内核基础和控制台
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Linux终端不回显
·Linux下对C代码的编译
·升级Linux内核错误解决
·C语言编写Linux下的守护进程
·避免Linux脚本多次运行
·学习Linux源码及实践
·Linux下创建和编译Qt项目
·Linux 下部署Java工程编码问题
·Linux启动时自动加载脚本
·Linux log路径/var/log系统级别log sys
·准备进行Linux设备驱动的开发了
·Ubuntu调用函数分析
  阅读排行
·开源空间 网络安全工具开发函数库Libne
·Linux下Qtopia Core 4.3(QT/E)交叉编译
·Linux socket编程实例:echo服务器程序
·Linux编程时获取当前时间实例解析
·Linux环境下OpenGL编程学习
·升级Redhat Linux 9.0内核有感
·GNU/Linux应用程序编程:用管道进行编
·Linux中断处理学习笔记
·Linux系统中限制用户进程CPU及内存占用
·解决Linux中Matlab中文乱码问题
·Linux环境下Wine的中文显示以及freetyp
·如何在Ubuntu 7.0上实现C/C++开发环境
·Linux下安装g77 fortran complier过程
·SUSE Linux中安装Quartus 7.2过程笔记
·Linux程序设计入门 系统进程的详细介绍
网摘收藏: