“操作系统”实验教学之U盘驱动程序开发-文档资料_第1页
“操作系统”实验教学之U盘驱动程序开发-文档资料_第2页
“操作系统”实验教学之U盘驱动程序开发-文档资料_第3页
“操作系统”实验教学之U盘驱动程序开发-文档资料_第4页
“操作系统”实验教学之U盘驱动程序开发-文档资料_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

“操作系统”实验教学之U盘驱动程序开发引言设备管理是操作系统的一个关键内容 ,在实际操作系统的开发中 ,有相当多的代码是各类设备的驱动程序。因此 ,在操作系统实践环节中设计一个合适的设备驱动程序开发实验具有非常重要的意义。本文介绍了一个Linux环境下的U盘驱动程序开发实验的设计与实施情况。U盘是一个典型的块设备,这类设备种类多、使用广泛 ,其驱动程序的开发也比字符设备复杂。为了降低复杂性 ,许多相关的实验安排都是针对一个虚拟设备 ,如内存盘(RAMdisk)。但这样做也有它的弊端,即与真实物理设备的驱动程序开发差异很大 ,学生不能更真实地了解设备管理的实际情况。因此 ,如果能够设计一个真实块设备(如U盘)的驱动程序开发实验,将能够弥补上述缺憾。在Linux环境下,已经有一个通用的U盘驱动程序usb-storage.ko,其源程序放在目录drivers\usb\storage下(相对于内核源码根目录)。但这个驱动的实现相当复杂,它将一个USB设备模拟成了一个SCSI设备,进而通过SCSI设备的接口来访问,该驱动程序很难被学生所理解。在我们设计的实验中,希望学生开发一个相对简单些的U盘驱动程序,不求高性能,只求结构明朗、清晰易懂 ,主要是让学生掌握一个实际块设备的驱动方式 ,从而加深对设备管理原理的理解。事实上,本实验开发的驱动程序应该能够适用于所有基于Bulkonly传输协议的USB大容量存储设备(USBMassStorage),比如USB移动硬盘和USB外置光驱,U盘只是其中的一种。由于USB大容量存储设备具有容量大、速度快、连接灵活、即插即用、总线供电等优点,它们得到了广泛使用,掌握这类设备驱动程序的开发技术无疑具有很强的实用性。本文第二节介绍此实验的内容设计情况,包括实验过程和思路的描述,第三节介绍实验的组织情况和实验效果分析,最后是小结。实验内容设计本实验要求学生在Linux操作系统下编写一个U盘驱动程序,只要求能够驱动某个型号的U盘,要能够支持U盘的常规操作,如命令hexdump、mke2fs和mount等。同时,要求在系统内核日志中显示出U盘的容量。对于学有余力的学生,可增加多分区支持功能。2.1实验基础和思路在文献[2]中,讲解了如何编写一个 Ramdisk块设备驱动程序,称为sbull;也讲解了如何编写一个USB设备驱动程序,并以Linux源代码中的usb-skeleton.c为例。虽然前者驱动的并不是一个实际的块设备,且后者又只是针对USB字符设备,但是它们提供了一个不错的基础,通过合并就能基本得到一个支持USB块设备的驱动程序。之所以说基本得到,是因为合并后只是有了块设备、USB设备的驱动支持框架,但还缺一样:对U盘(USB块设备)的实际访问操作。USB块设备的访问方法与USB字符设备区别很大,有一套复杂的协议。把这样一套协议研究清楚,将花费大量时间,也远离了驱动程序开发的核心。这是一大难点,为此我们专门编写了一个U盘访问函数(my_Bulk_transport),以减轻工作量。2.3节将进一步介绍该帮助函数。简言之,本实验的思路是:合并sbull 和usb-skeleton 这两个参考驱动程序,以构造出U盘驱动程序的整体框架 ;调用帮助函数my_Bulk_transport 以实际访问U盘。从而开发出一个简洁的 U盘驱动程序。下面分别对参考驱动程序和帮助函数分别进行简要介绍。2.2参考驱动程序文献[2]第16章以一个Ramdisk设备为例讲解了块设备驱动程序的一般编写方法。包括用到的主要数据结构 (如下图所示)和关键函数(如register_blkdev 、add_disk和blk_init_queue 等)。从中可以知道如何向操作系统登记一个块设备、 以及操作系统是如何调用所提供的相关函数来支持块设备的打开、关闭、读写、控制等操作的。这些是块设备驱动程序编写的基础知识。尤其需要说明的是 ,该驱动程序针对的并不是一个真实物理设备 ,而是一个Ramdisk设备。所谓Ramdisk,是指使用计算机内存作为存储介质的盘。一旦加载该驱动 ,就会从内存中划分出一些空间 ,虚拟出几个磁盘,并且可以对这个虚拟磁盘进行格式化、文件复制和查看等操作。因此 ,这个驱动程序只是提供了块设备驱动程序的一般框架。如果要驱动实际的 U盘,还需要给学生提供一些其他知识。文献[2]的第13章讲述了USB字符设备驱动程序的一般编写方法。所用的例子是 Linux内核源码目录中的文件driver/usb/usb-skeleton.c 。它提供了一个最基础的 USB字符驱动程序,称为USB骨架。其中包括了对 USB字符设备的注册、打开、关闭、读写等操作的支持。特别地 ,usb_register 、probe、disconnect和usb_unregister这几个函数是USB设备才有的,支持热插拔等操作。其中的其它一些函数,如skel_read、skel_write、skel_open和skel_release, 是针对字符设备的,并不适用于U盘驱动程序。因此,需要与前一个参考驱动程序合并考虑 ,才能构造出USB块设备的驱动程序。2.3U盘驱动的帮助函数在参考驱动程序usb-skeleton.c 中,当需要对USB设备进行读写的时候,调用了usb_bulk_msg和usb_submit_urb等函数。要使用它们来操作U盘,需要对USB大规模存储设备的相关协议非常清楚 ,会涉及到大量底层细节,对于本科学生而言,需要花大量时间,会非常困难。为此,我们以Linux下的通用USB驱动程序usb-storage 为基础,整理出了一个粒度更大的 U盘访问函数,称为my_Bulk_transport 。主要借鉴了如下几个文件 :drivers/usb/storage/transport.cdrivers/usb/storage/transport.hdrivers/scsi/scsi.h该函数的原型如下所示 :intmy_Bulk_transport(structusb_device*udev,structusb_interface*interface,structcmnd_struct*cs,unsignedchar*bulk_buffer,intbulk_size,__u8bulk_in_endpointAddr,__u8bulk_out_endpointAddr);其功能是向USB设备(udev)的接口(interface) 发送一个命令(cs),进行相应的数据传递(bulk_buffer),并获取状态反馈信息。内部封装了复杂的USB大规模存储设备的传输协议,学生只需要掌握命令的格式和一些基本的USB设备知识即可,从而有效控制了实验的复杂性。教学组织及效果本实验一人一组,课内安排8个学时的上机时间,学生需要在课外查阅一些相关资料。要求提交实验上机报告和驱动程序源程序 ,实验成绩由现场上机检查成绩和上机报告成绩两部分构成。在2007年和2008年秋季学期的“操作系统课程设计课”中 ,本实验作为一个实验单元进行了教学实践。从实验效果看 ,有约15%的学生能够比较独立地完成实验 ,实现U盘的挂载、读写、容量信息读取操作;有约60%的学生在老师进一步给出参考驱动程序的合并雏形后,能够顺利完成合并,并实现部分功能,如容量信息的读取;剩下的大概25%只能进行部分合并工作,不能完成U盘驱动的有效功能。此外,对于fdisk操作和多分区功能的支持,很少有学生能够实现。总体来看,虽然有U盘帮助函数的辅助,本实验仍然具有较高的难度,其主要困难在于:(1)许多学生对Linux下的程序开发、调试不熟悉,对于内核模块更是如此;(2)参考资料支持不够,这方面的参考资料比较分散,且大部分都是英文资料。完成情况好的学生,大都比较积极主动,自学能力

温馨提示

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

评论

0/150

提交评论