资源描述:
《驱动程序框架及实例分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、13.1驱动程序框架及实例分析在本节中,将演示编写一个名为“mydriver”的简单字符设备驱动程序,该驱动程序以可加载的模块方式进行编译,免去了重新编译内核的工作。基本要求:(1)编写模块初始化和注销函数:init_module()和cleanup_module()函;(2)编写3个基木操作:mydriver_open()nmydriver_read()>mydriver_release();(3)编写一个测试程序來测试所编写的字符设备驱动程序。注:为了简化起见,该实例省略了初始化时为字符设备分配内存空间的步骤。1.编写字符
2、设备驱动程序mydriver.c#define__NO_VERSION―心#ineludevlinux/modijle,h>#includecharkernel_version[]=UTS_RELEASE;#ifndef_KERNEL_p#define―KERNEL—#endif#include#includevlinux/fs.h>#include/*调用printk()函数*/p/*定5tfile_operations,file
3、等结构体5V*#includevlinux/types.h>/*定义ssize_t*A'#include广定义verify_area,_put_user*/#defineMYDRIVERMAJOR0intmydriver_major=MYDRIVER_MAJOR;/*向系统申请的主设备号*7/*open操作的实现staticintmydriver_open(structinode*inode,structfile*filp)<-MOD」NC_USE_COUNT;/*増加该模块的用户数目*
4、/^return0;a/*release操作的实现水“staticintmydriver_release(structinode*inode,structfile*filp)MOD_DEC_USE_COUNT;/*该模块的用户数目减1*/^return0;^/*read操作的实现*/..staticssize_tmydriver_read(structfile*filp,char*buf,size_tcount,fpos)inti;.,•IF验证用户内存空间地址是否合法*/..if(verify_area(VERIFY_WRI
5、TE,buf,count)==-EFAULT)..return七FAULT;..for(i=count;i>0;i—).-pucuserd.buf);广从内核空间分配ASCII码值为1的字符到用户空间水几buf+4-;..returncount;..・■/*write空操作*/..staticssize_tmydriver_write(structfile*filp,constchar*buf3size_tcountyfpos)..returncount;..}-structfile_operationsmydriver_ft
6、ips=NULL,/*structmodule*/,.NULL,/*llseek*/.mydrive^read,/*read字符设备的写操作水人mydriver-write,/*write字符设备的写操*/..NULL,/*readdir*/..NULL,/*poll*/.NULL,/*ioctl*/.NULL,/*mmap*/.mydriver_open3/*open字符设备的打开探作*/.NULL,/*flush*/.mydrive^release,/*release字符设备的释放操作*/.NULL,,・■#ifdefMO
7、DULE..intinit_module(void)MODULE^LICENSEC'GPL");..intresult=register_chrdev(mydriver_major3"mydriver",&mydriver^fops);if(result<0)严申谙失败显示出错信息并返回错误編号水几一printk(KERN_WARNING"mydriverdriver:can'tgetmajor%d”;mydriver_major);..returnresult;..}-if(mydriver_major==0)/*mydn
8、ver_majorj^O>动态分配主设备号mydriver_major=result;../*模块注销函数*/..voidcleanup_module(void)..unregiste^chrdevtmydriver^major,"mydriver");.#endif.由于该