




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计专题四:设备驱动李航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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年滨州新能源集团有限责任公司及权属公司公开招聘工作人员递补笔试备考题库附答案详解(综合题)
- 2025福建晋园发展集团有限责任公司权属子公司招聘7人笔试备考题库含答案详解(综合题)
- 2025年黑龙江省五大连池市辅警招聘考试试题题库附答案详解(b卷)
- 从内容深度、形式创新、精准触达、互动体验
- 2024年湖南省娄底市新化县科头乡招聘社区工作者考前自测高频考点模拟试题(共500题)含答案
- 2025年河北省定州市辅警招聘考试试题题库附答案详解(研优卷)
- 2024年演出经纪人之演出市场政策与法律法规基础试题库附参考答案(突破训练)
- 2025年K2学校STEM课程实施与教师教学满意度调查报告
- 初中数学九年级下册统编教案 7.1正切(第1课时)
- 2025届高考物理大一轮复习课件 第十五章 第80课时 专题强化:气体实验定律的综合应用
- 心理学基础知识题库及解析
- GB/T 10810.3-2025眼镜镜片第3部分:透射比试验方法
- 武汉2025届高中毕业生二月调研考试数学试题及答案
- 初级美甲考试试题及答案
- 2025年南邮面试试题及答案
- 2025年中考数学二轮复习:瓜豆原理(含解析)
- 借哪吒之魂铸中考辉煌-中考百日誓师班会-2024-2025学年初中主题班会课件
- 矩阵之美在科技项目中的具体实践及成效分析
- 男性健康与家庭责任的关系探讨
- 大型活动应急救援职责与组织架构
- 2025年沪教版七年级地理下册阶段测试试卷
评论
0/150
提交评论