驱动程序框架及实例分析.doc,将演示编写一个名为“mydriver”的简单字符设备弧动程序,该驱动程序以可加载的模块方式进行编译,免去了重新编译内核的工作。基本要求:编写模块初始化和注销函数:init_module()和clean叩_module()函;编写3个基本操作:mydriver_open()>niydriver_rcad()、mydriver_release();编写一个测试程序来测试所编写的字符设备驱动程序。注:为了简化起见,该实例省略了初始化时为字符设备分配内存空间的步骤。#define__NO_VERSION—p#include<linux/>*J#include<linux/>^charkernel_version[]=UTS_RELEASE;^#ifndef_KERNEL_一#define_KERNEL_曰#endif^#include<linux/>/*调用printk()函数*/<-'#include<linux/> /*定义file^perations,file等结构体*#include<linux/>^#include<linux/>/*定义ssize_t*/^^include<asm-i386/>/*定义verify_area,_put__user*/#defineMYDRIVER_MAJOR0^'intmydriver_major=MYDRIVER_MAJOR;/*向系统申请的主设备号*//*open操作的实现staticintmydriver_open(structinode*inode,structfile*filp)『{一MOD_INC_USE_COUNT;/*增加该模块的用户数目*川return0;3扣/*release操作的实现*/〃staticintmydriver_release(structinode*inode,structfile*filp)^{―MOD_DEC_USE_COUNT;/*该模块的用户数目减1return0;,I/*read操作的实现*/..staticssize_tmydriver__read(stnjctfile*filp,char*buf,size_tcount,loff_t*fpos)inti;>.1/*验证用户内存空间地址是否合法*/..if(verify_area(VERIFY_WRITE,buf,count)==-EFAULT)..return-EFAULT;.Ifor(i=count;i>0;i—)._puJuser(Lbuf);/*从内核空间分配ASCII码值为1的字符到用户空间buf++;.,}.returncount;..}.,t/*write空操作*/.staticssize_tmydriver_write(structfile*filp,constchar*buf,size_tcount,loff_t*fpos)..returncount;..)■.1structfile_operationsmydriver_fops={.,NULL, /*structmodule*/.NULL, /*llseek*/.mydr
驱动程序框架及实例分析 来自淘豆网www.taodocs.com转载请标明出处.