专题4讲义:设备驱动_第1页
专题4讲义:设备驱动_第2页
专题4讲义:设备驱动_第3页
专题4讲义:设备驱动_第4页
专题4讲义:设备驱动_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

操作系统课程设计专题四:设备驱动李航funfind@1AbstractLinux设备驱动程序12实验要求设备驱动举例321.Linux设备驱动程序3Linux设备分类字符设备

(characterdevices)以字符为单位进行I/O操作;只能顺序存取;无需缓冲区;如:Keyboard,SerialPort块设备(blockdevices)以固定大小的数据块为单位进行I/O操作;数据块可以被随机存取;需要一定内存做为缓冲区;如:HD,CDROM,Floppy网络设备(Networkdevices)面向数据包的传输设备在文件系统中没有相应的inode表示,只有一个符号名,如eth0。4Linux将硬件设备看做一类特殊的文件(/dev/*):设备文件是逻辑概念,是应用访问设备的途径;代表一个驱动程序的入口及与之相关联的数据结构;设备是实体。设备文件操作为设备编写几个基本的函数,向VFS注册就可以完成设备驱动程序;安装设备驱动程序就是将该设备的操作函数集在内核中注册。/proc/devices列出系统当前的设备。intfd=open(“/dev/null”,O_WRONLY);write(fd,“1234567890”,10);close(fd);设备文件5设备文件设备文件的3个基本属性:类型:Blockorcharacter

主设备号(Majornumber)Identifiesthedevicetypeandrangefrom1to255;associatedwitheachdevicedrivermajor.h中定义了主设备号次设备号(Minornumber)区分使用同一驱动程序的不同设备。创建设备文件:mknod/dev/foo

b600例:运行命令’ls-l/dev/hda*/dev/tty[012]’查看设备的3个属性brw-rw----1rootcdrom3,0May61998hdabrw-rw----1rootdisk3,1May61998hda1brw-rw----1rootdisk3,2May61998hda2brw-rw----1rootdisk3,3May61998hda3crw-------1rootroot4,0Dec2909:55tty0crw-------1rootroot4,1Dec2909:56tty1crw-------1rootroot4,2Dec2909:56tty2Documentation/devices.txt6设备驱动程序

用户进程VFS设备驱动程序设备控制器设备本身用户进程请求设备服务流程图用户进程发出I/O请求,系统将请求处理下传到VFS上;VFS通过驱动程序提供的接口将任务分配到驱动程序;驱动程序根据需要对设备控制器进行操作;设备控制器去控制设备。设备制造商范围OS可管辖范围7物理文件系统层VFSMINIXEXT2MSDOS用户进程内核其他子系统内核空间用户空间VFS设备驱动程序设备缓存VFS对上提供统一接口和数据表示,对下管理物理FSVFS对上:提供通用接口和数据表示对下:管理各物理文件系统8设备驱动程序组成设备服务子程序每个服务子程序只处理一种设备或与其紧密相关的设备;从与设备无关的软件中接受抽象的命令并执行;中断处理程序主要用来检测I/O操作是否完成,以唤醒被阻塞的进程。特点驱动程序属于内核代码的一部分,运行在内核空间;向OS内核提供统一接口,便于内核对设备的管理;在编译内核时,连入内核的设备驱动程序是可以配置的;多以内核模块方式实现,使系统资源有效利用。9设备驱动的注册和管理内核设备驱动程序表结构(infs/devices.c)structdevice_struct{

constchar*name;//devicename

structfile_operations*fops;

};字符设备驱动程序:设备表:全局数组chrdevs[255],主设备号是它的下标登记:register_chrdev()/unregister_chrdev()缺省操作集合:file_ops:def_chr_fops,仅定义了open方法;inode_ops:chrdev_inode_operations,仅定义了其中的file_operation=&def_chr_fops.10设备驱动的注册和管理块设备驱动程序:设备表:全局数组blkdevs[255],主设备号是它的下标登记:register_blkdev()/unregister_blkdev()缺省操作集:file_ops:def_blk_fops,仅定义了open方法;inode_ops:blkdev_inode_operations,仅定义了其中的file_operation=&def_blk_fops.structblk_dev_struct{//blkdev.h

request_queue_trequest_queue;//请求队列

queue_proc*queue;…

}blk_dev[255];112.设备驱动举例12假想的字符设备实现一个字符设备,支持以下功能:用户可以向设备写入字符串;用户可以从设备读出写入的字符串;用户通过系统调用ioctl清除设备中写入的字符串;测试程序示例//process1:readercharyourmsg[1000];inth=open(“/dev/rwbuf”,O_RDONLY);//打开设备失败时

h<0intn=read(h,yourmsg,sizeof(yourmsg));//读设备失败时n<0,n=0表示文件结束

close(h);//process2:writercharyourmsg[1000];inth=open(“/dev/rwbuf”,O_WRONLY);//打开设备失败时h<0

intn=write(h,yourmsg,sizeof(yourmsg)+1);//写设备失败时n<0,否则表示写入的字节数

close(h);//process3:cleanercharyourmsg[1000];inth=open(“/dev/rwbuf”,O_RDWR);//打开设备失败时h<0

intn=ioctl(h,RW_CLEAR,0);//写设备失败时n<0,否则表示成功

close(h);13字符设备驱动的实现//rwbuf.h,driverforvirtualchar-device#defineDEVICE_NAME“ChrDev_A”#defineRWBUF_CLEAR0x909090//IOCtrlCommand//rwbuf.c,driverforvirtualchar-device#include“rwbuf.h”linuxuaccess/#include<linux/kernel.h>//forkernelprogramming#include<linux/module.h>//forkernelmodulestruct.#include<linux/fs.h>//structfile_operations14//rwbuf.c,driverforvirtualchar-deviceintinit_module(){printk("Helloworld\n");if(register_chrdev(254,DEVICE_NAME,&rwbuf_fops))

{printk("registererror\n");return-1;}printk("registerok\n");return0;}字符设备驱动的实现//rwbuf.c,driverforvirtualchar-devicestaticstructfile_operationsrwbuf_fops={

open:rwbuf_open,

release:rwbuf_close,

read:rwbuf_read,

write:rwbuf_write,

ioctl:rwbuf_ioctl,};15//rwbuf.c,driverforvirtualchar-devicevoidcleanup_module(){去掉if语句,但不是去掉unregisterif(unregister_chrdev(254,DEVICE_NAME)!=0) printk("unregerr\n");else printk("unregok\n");printk("bye\n");}字符设备驱动的实现//rwbuf.c,driverforvirtualchar-devicestaticstructfile_operationsrwbuf_fops={ open:rwbuf_open, release:rwbuf_close, read:rwbuf_read, write:rwbuf_write, ioctl:rwbuf_ioctl,};16字符设备驱动的实现//rwbuf.c,driverforvirtualchar-devicestaticintinuse=0; //onlyoneprocesspermitedatthesametimestaticintrwbuf_open(structinode*inode,structfile*filep){if(inuse==1)return-1;inuse=1;MOD_INC_USE_COUNT; //increasetheusecountinstructmodulereturn0;}staticintrwbuf_close(structinode*inode,structfile*filep){ inuse=0; MOD_DEC_USE_COUNT; return0;}17字符设备驱动的实现//rwbuf.c,driverforvirtualchar-device#definerwbuf_size200//MAXsizeofbufferstaticcharrwbuf[rwbuf_size];//thebufferkeepingstringstaticintrwlen=0;//lengthofstringstaticssize_trwbuf_write(structfile*filep,constchar*buf,size_tcount,loff_t*ppos){ //判断写入的长度是否有效

copy_from_user(rwbuf,buf,count);//从用户空间复制到内核空间

rwlen=count;//printsomemessagebyprintk(); returncount;}18字符设备驱动的实现//rwbuf.c,driverforvirtualchar-devicestaticssize_trwbuf_read(structfile*filep,char*buf,size_tcount,loff_t*ppos){//判断读取的长度是否有效

copy_to_user(buf,rwbuf,count);//从内核空间复制到用户空间

//printsomemessagebyprintk() returncount;}2.6以下版本内核注意:__generic_copy_to_user(buf,rwbuf,count);__generic_copy_from_user(rwbuf,buf,count);19字符设备驱动的实现//rwbuf.c,driverforvirtualchar-devicestaticintrwbuf_ioctl(structinode*inode,structfile*filep, unsignedintcmd,unsignedlongarg){ if(cmd==RW_CLEAR){ rwlen=0; //clearbufbysetitslentozero printk("rwbufinkernelzero-ed\n"); break; }; return0;}20字符设备驱动的实现编译

2.4:gcc-crwbuf.c-I/usr/src/linux/include-D__KERNEL__-DMODULE-Wall 2.6:建立Makefile,其内容为:

obj-m:=rwbuf.o

然后使用:

转入驱动程序源码所在目录,执行:

make–C内核源码目录

M=`pwd`(反单引号)

modules安装与卸载:

mknod/dev/rwbufc2540 创建设备文件

2.4:insmodrwbuf.o 安装设备驱动 2.6insmodrwbuf.ko

/sbin/rmmodrwbuf 卸载设备驱动213.实验要求22题目要求完善例子中的字符设备程序,使之满足以下功能:安装设备后从设备中读出字符串为你的学号;(字符设备驱动的实验,或者在黄色那块直接写进去)设备支持每次写入字符不超过1024个,超过部分被丢弃;用户可以读出最近写入到设备中的字符;设备关闭前不能被多次打开;设备支持系统调用ioctl(intd,intreq,…)req=0x909090,清除设备中写入的字符串;自己编写测试程序,验证以上功能(三块)/home/chenshang/OS7/class7.c:Infunction‘rwbuf_ioctl’:/home/chenshang/OS7/class7.c:63:error:‘retuen’undeclared(firstuseinthisfunction)/home/chenshang/OS7/class7.c:63:error:(Eachundeclaredidentifierisreportedonlyonce/home/chenshang/OS7/class7.c:63:error:foreachfunctionitappearsin.)/home/chenshang/OS7/class7.c:63:error:expected‘;’beforenumericconstant/home/chenshang/OS7/class7.c:64:warning:noreturnstatementinfunctionreturningnon-void/home/chenshang/OS7/class7.c:Infunction‘init_module’:/home/chenshang/OS7/class7.c:68:error:stray‘\342’inprogram/home/chenshang/OS7/class7.c

温馨提示

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

最新文档

评论

0/150

提交评论