linux字符设备驱动程序设计

linux字符设备驱动程序设计

ID:18752655

大小:62.00 KB

页数:6页

时间:2018-09-22

linux字符设备驱动程序设计_第1页
linux字符设备驱动程序设计_第2页
linux字符设备驱动程序设计_第3页
linux字符设备驱动程序设计_第4页
linux字符设备驱动程序设计_第5页
资源描述:

《linux字符设备驱动程序设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Linux字符设备驱动程序设计付智华(四川大学计算机学院,四川成都)摘要:本文主要涉及Linux字符设备驱动程序设计中的预处理、模块的初始和终止、设备驱动程序的装配和卸载、以及文件操作。通过代码片断阐述了各个部分的设计要点。关键词:设备驱动程序;模块中图分类号:文献标识码:ADesignofLinuxCharacterDeviceDriverLUTAONetworkInformationCenterofSouth-westUniversityofScienceandTechnologyAbstract:ThepapermainlydealswithLinuxcharacte

2、rdevicedriverdesignthatincludepretreatment,initializtionandterminationofthemodule,loadandunloadofthedevicedriverandsomefileoperations.Elaboratedvariouspartsofthedesignfeaturesbycodefragment.Keywords:devicedriver;module1.概述Linux系统中,设备驱动程序是操作系统内核的重要组成部分,它与硬件设备之间建立了标准的抽象接口。通过这个接口,用户可以像处理普通文件一

3、样,对硬件设备进行打开(open)、关闭(close)、读写(read/write)等操作。通过分析和设计设备驱动程序,可以深入理解Linux系统和进行系统开发。Linux设备分为字符设备、块设备和网络设备。字符设备是不需要缓冲而直接读写的设备,如串口、键盘、鼠标等;块设备的访问通常需要缓冲来支持,以数据块为单位来读写,如磁盘设备等;网络设备是通过套接字来访问的特殊设备。本文主要讨论字符设备驱动程序的设计。2.预定义和必要的头文件首先,在包含任何头文件前,我们需要在预定义器中定义符号__KERNEL__。这个符号用于选择使用头文件的哪一部分。由于libc包含了这些头文件,应

4、用程序最终也会包含内核头文件,但应用程序不需要内核原型。于是就用__KERNEL__符号将那些额外的去掉。将内核符号和宏开放给用户空间的程序会造成那个程序的名字空间污染。另一个很重要的符号就是MODULE,必须包含前定义此符号。除非要把设备驱动程序编译到内核映象中,MODULE一般是定义了的。由于本文所涉及的驱动程序不是直接连接到内核中去的,所以定义了这个符号。对于连接的每一个不同版本的内核,模块都要相应地编译一次。version.h定义了整数宏LINUX_VERSION_CODE。这个宏展开后是内核版本的二进制表示,利用这个信息,可以判断出

5、处理的是哪个版本的内核。当用户利用类结构加载模块时,在标准输出设备和系统日志上会显示一个坏模块的出错信息。为了消除这条信息,用户需要为MODULE_LICENSE()宏增加一个示例,例如MODULE_LICENSE("GPL")。这种2.4内核以后的版本才引入的宏,可以将模块定义为获得GPLVersion2或更新版本许可的模块。为了确保模块是否可以安全地卸载,系统为每个模块保留了一个使用计数。由于模块忙的时候是不能卸载模块的,系统需要这些信息。例如你不能在应用程序使用某个设备时就去掉它。驱动程序通过宏来维持使用计数。下面是示例代码:#ifndef__KERNEL__#def

6、ine__KERNEL__//按内核模块编译#endif#ifndefMODULE#defineMODULE//设备驱动程序模块编译#endif//必要的头文件#include//同kernel.h,最基本的内核模块头文件#include//同module.h,最基本的内核模块头文件#include//这里包含了进行正确性检查的宏#include//文件系统所必需的头文件#include//这里包含了内核空间与用户空间进行数据交

7、换时的函数MODULE_LICENSE("GPL");#defineMOD_INC_USE_COUNT//当前模块计数加1#defineMOD_DEC_USE_COUNT//当前模块计数减13.模块初始化和终止驱动程序可以按照两种方式编译。一种是编译进kernel,另一种是编译成模块(modules),如果编译进内核的话,会增加内核的大小,还要改动内核的源文件,而且不能动态的卸载,不利于调试,所以推荐使用模块方式。一个应用程序是从头到尾完成一个任务,而模块则是为了以后处理某些请求而注册自己,完成这个任务后它的“主”

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。