资源描述:
《字符设备驱动程序.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux字符设备驱动程序Linux驱动程序的分类字符设备驱动:用于驱动能够像字节流(文件)一样被访问的设备。应用程序通常可以利用open、close、read、write等系统调用访问字符设备驱动。块设备驱动:块设备和字符设备只在系统内核内部的管理上有所区别。应用程序对于字符设备的每一个I/O操作都会被内核直接传递给对应的驱动程序;而应用程序对于块设备的操作要经过虚拟文件系统(VFS)和缓冲区管理系统间接地传递给驱动程序处理。网络设备驱动:应用程序必须利用套接字(socket)接口访问网络设备。网络设备驱动程序字符设备驱动程
2、序基本结构字符设备开发的基本步骤确定主设备号和次设备号实现字符驱动程序实现file_operations结构体构造字符设备结构体cdev在模块加载函数中注册字符设备在模块卸载函数中注销字符设备创建设备文件节点设备文件与设备号为了体现“一切都是文件”的设计思想,linux将每个已安装的设备都表示为一个设备文件。设备文件通常位于/dev子目录。对于字符设备,应用程序可以利用open、close、read、write等系统调用访问其设备文件,这些I/O操作都被直接传递给该设备文件所对应的设备。每个设备文件中都存储了该设备的“主设备号
3、”和“次设备号”。一般由同一个内核模块管理的多个设备占用同一个主设备号,具体设备用次设备号标识。用mknodfilenamecmajorminor命令创建设备文件用rmfilename命令删除设备文件。注意删除设备文件并不会影响驱动模块。应用程序如何访问设备fd1=open(“/dev/ttyS1”,O_RDWR);//阻塞fd2=open(“/dev/ttyS1”,O_RDWR
4、O_NONBLOCK);//非阻塞intread(intfd,constvoid*buf,size_tlength);intwrite(intfd,
5、constvoid*buf,size_tlength);intlseek(intfd,offset_toffset,intwhence);intioctl(intfd,intcmd,void*arg);intclose(intfd);设备号的内部表达设备编号的内部表达dev_t类型(32位):用来保存设备编号(包括主设备号(12位)和次设备号(20位))从dev_t获得主设备号和次设备号:MAJOR(dev_t);MINOR(dev_t);将主设备号和次设备号转换成dev_t类型:MKDEV(intmajor,intminor
6、);主设备号与次设备号分配主设备号手工分配主设备号:找一个内核没有使用的主设备号来使用。#includeintregister_chrdev_region(dev_tfirst,unsignedintcount,char*name);要分配的设备编号范围的起始值,次设备号经常为0所请求的连续设备编号的个数和该编号范围关联的设备名称主设备号与次设备号动态分配主设备号:#includeintalloc_chrdev_resion(dev_t*dev,unsignedintfirstm
7、inor,unsignedintcount,char*name);输出的设备号要使用的被请求的第一个次设备号主设备号与次设备号释放设备号voidunregister_chrdev_region(dev_tfirst,unsignedintcount);通常在模块的清除函数中调用。记录字符设备的结构体cdev实现字符驱动程序cdev结构体structcdev{structkobjectkobj;/*内嵌的kobject对象*/structmodule*owner;/*所属模块*/structfile_operations*ops
8、;/*文件操作结构体*/structlist_headlist;dev_tdev;/*设备号*/unsignedintcount;};cdev的kobj、list、count字段不用我们关系和维护(内核代劳),我们只需将其ops字段指向为我们自己的fileoperations结构。对cdev结构体的操作操作cdev的函数voidcdev_init(structcdev*,structfile_operations*);structcdev*cdev_alloc(void);intcdev_add(structcdev*,dev
9、_t,unsigned);voidcdev_del(structcdev*);用于初始化cdev的成员,并建立cdev和file_operations之间的连接分别向系统删除一个cdev,完成字符设备的注销,通常在模块的卸载函数中调用分别向系统添加一个cdev,完成字符设备的