Linux字符设备驱动实例_第1页
Linux字符设备驱动实例_第2页
Linux字符设备驱动实例_第3页
Linux字符设备驱动实例_第4页
Linux字符设备驱动实例_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux字符设备驱动实例1看了Linux设备驱动程序的前儿章,我结合这篇教程中给出的一个2.4版内核的字符驱动,口己编写了一个2.6版内核的驱动程序,并且加上了详细的注释。这个程序很简单,但是对初学者把握2.6版内核的字符驱动的脉络应该有一定的帮助,也可以算作我对Linux设备驱动程序前几章学习的一个小结。/#globalvarc#include/模块所需的大量符号和函数左义#include/指宦初始化和淸楚函数#include/文件系统相关的函数和头文件#include/cdev结构的头文件#include/在内核和用户空间中移动数据的函数MODULE_LICENSE(nGPL11);/指

2、定代码使用的许可证/文件操作函数的声明intgiobelvdr_open(structinode*,structfile*);intgiostructinode*,structfile*);ssize_tglobalvar_read(structfile*,char*,size_t9loff_tssize_tglobalvar_write(structfile*tconstchar*,size_t,lofft*);intdev_major=50;/指定主设备号intdev_minor=0;/指定次设备号structfile_operationsglobalvar_fops=/将文件操作与分配的

3、设备号相连owner:THIS_MODULEZ/指向拥有该模块结构的指针open:giobdlv*_open,release:gioread:gio,write:globalvar_write,structgiobdlvcr_dev/用來表示我们定义设备的结构intglobal_var;/这个变量代表要操作的设备structcdevcdev;/内核中表示字符设备的结构;structgiobdlvcr_dev*my_dev;/设备结构的指针staticvoidexitgiobdlvdr_exit(void)/退出模块时的操作dev_tdevno=MKDEV(dev_majortdev_minor

4、);/dev_t是用來表示设备编号的结构cdev_del(&my_dev-cdev);/从系统中移除一个字符设kfree(my_dev);/注销已注册的驱动程序/释放口定义的设备结构unregister_chrdev_region(devno,1);printk(nglobalvarunregistersuccessn);staticintinitglobalvar_init(void)/初始化模块的操作intret,err;dev_tdevno=MKDEV(dev_majorfdev_minor);/动态分配设备号,次设备号已经指定ret=alloc_chrdev_region(&devno

5、fdev_minorz1,nglobalvar);/保存动态分配的主设备号dev_major=MAJOR(devno);/根据期望值分配设备号/ret=register_chrdev_region(devnoz1,nglobalvarn);if(retglobel_vdr=O;0/设备变虽:初始化为cdev_init(&my_dev-cdevz&giobdlvcr_fops);/初始化设备中的cdev结构my_dev-cdevowner=THIS_MODULE;所有者字段err=cdev_add(&my_dev-cdevtdevno,1);ev结构的信息if(erri_cdevzstructg

6、iobdlvdr_dev,cdev);/将file结构中的private_data字段指向已分配的设备结构filp-private_data=dev;return0;/关闭设备文件系统调用对应的操作intgiostructinode*inode,structfile*filp)return0;/读设备文件系统调用对应的操作ssize_tglobalvar_read(structfile*filprchar*buf,size_tlen,loff_t*off)/获取指向已分配数据的指针structglobalvar_dev*dev=filp-private_data;/将设备变量值复制到用户空间i

7、f(copy_to_user(buf,&dev-global_var,sizeof(int)return-EFAULT;returnsizeof(int);/返回读取数据的大小/写设备文件系统调用对应的操作ssize_tglobalvar_write(structfile*filp,constcharuf,size_tle/获取指向已分配数据的指针structglobalvar_dev*dev=filp-private_data;/从用户空间复制数据到内核中的设备变量if(copy_from_user(&dev-globel_var,buftsizeof(int)return-EFAULT;r

8、eturnsizeof(int);/返回写数据的大小module_init(globalvar_init);/模块被装载H寸调用globalvar_initmodule_exit(globalvar_exit);/模块被卸载H寸调用globalvar_exit/按如下内容编写一个Makefile文件,然后输入make就可以开始口动编译了。编译之后得到了一个名为globalvar.ko的模块文件,这就是我们需要的设备驱动文件。/#Makefileifneq($(KERNELRELEASE)z)obj-m:=globalvaroelse-r)/buildKERNELDIR?=/lib/module

9、s/$(shellunamePWD:=$(shellpwd)all:$(MAKE)-C$(KERNELDIR)M=$(PWD)modulesclean:$(MAKE)-C$(KERNELDIR)M=$(PWD)cleanendif接下来运行如下代码,将驱动加入内核。insmodglobalvarko此时可以用dmesg或lsmod命令检査一下模块加载是否成功。如果没有问题,就可以使用mknod构造一个设备文件:mknod/dev/globalvarc最肓,按照下面内容编写一个简单的测试文件并用gcc编译。/#testc#include#include#include#includemain()intfd,num;/可读写方fd=open(u/dev/globalvarn.O_RDWR,S_IRUSR|S_IWUSR);式打开设备文件/读取设备read(fdz&num,sizeof(int);变虽:printf(nTheglobalvaris%dnn,num);printf(uPleaseinputthenumwrittenglobalvarnn);scanf(M%dn,&num)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论