APP下载

“操作系统”实验教学之U盘驱动程序开发

2009-08-28文艳军邓胜兰尹俊文

计算机教育 2009年14期
关键词:操作系统U盘设备管理

文艳军 罗 宇 邓胜兰 尹俊文

摘要:本文介绍了一个U盘驱动程序开发实验的设计与实施情况,包括实验内容、实验基本过程和思路、实验组织和效果等。本实验有助于学生更真实地了解设备管理的实际情况,加深对设备管理原理的理解。

关键词:设备驱动程序;U盘;设备管理

中图分类号:G642 文献标识码:B

1引言

设备管理是操作系统的一个关键内容,在实际操作系统的开发中,有相当多的代码是各类设备的驱动程序。因此,在操作系统实践环节中设计一个合适的设备驱动程序开发实验具有非常重要的意义。

本文介绍了一个Linux环境下的U盘驱动程序开发实验的设计与实施情况。U盘是一个典型的块设备,这类设备种类多、使用广泛,其驱动程序的开发也比字符设备复杂。为了降低复杂性,许多相关的实验安排都是针对一个虚拟设备,如内存盘(RAM disk)。但这样做也有它的弊端,即与真实物理设备的驱动程序开发差异很大,学生不能更真实地了解设备管理的实际情况。因此,如果能够设计一个真实块设备(如U盘)的驱动程序开发实验,将能够弥补上述缺憾。

在Linux环境下,已经有一个通用的U盘驱动程序usb-storage.ko,其源程序放在目录driversusbstorage下(相对于内核源码根目录)。但这个驱动的实现相当复杂,它将一个USB设备模拟成了一个SCSI设备,进而通过SCSI设备的接口来访问,该驱动程序很难被学生所理解。在我们设计的实验中,希望学生开发一个相对简单些的U盘驱动程序,不求高性能,只求结构明朗、清晰易懂,主要是让学生掌握一个实际块设备的驱动方式,从而加深对设备管理原理的理解。

事实上,本实验开发的驱动程序应该能够适用于所有基于Bulkonly传输协议的USB大容量存储设备(USB Mass Storage),比如USB移动硬盘和USB外置光驱,U盘只是其中的一种。由于USB大容量存储设备具有容量大、速度快、连接灵活、即插即用、总线供电等优点,它们得到了广泛使用,掌握这类设备驱动程序的开发技术无疑具有很强的实用性。

本文第二节介绍此实验的内容设计情况,包括实验过程和思路的描述,第三节介绍实验的组织情况和实验效果分

析,最后是小结。

2实验内容设计

本实验要求学生在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.c

② drivers/usb/storage/transport.h

③ drivers/scsi/scsi.h

该函数的原型如下所示:

int my_Bulk_transport(

struct usb_device *udev,

struct usb_interface *interface,

struct cmnd_struct *cs,

unsigned char *bulk_buffer,

int bulk_size,

__u8 bulk_in_endpointAddr,

__u8 bulk_out_endpointAddr);

其功能是向USB设备(udev)的接口(interface)发送一个命令(cs),进行相应的数据传递(bulk_buffer),并获取状态反馈信息。内部封装了复杂的USB大规模存储设备的传输协议,学生只需要掌握命令的格式和一些基本的USB设备知识即可,从而有效控制了实验的复杂性。

3教学组织及效果

本实验一人一组,课内安排8个学时的上机时间,学生需要在课外查阅一些相关资料。要求提交实验上机报告和驱动程序源程序,实验成绩由现场上机检查成绩和上机报告成绩两部分构成。

在2007年和2008年秋季学期的“操作系统课程设计课”中,本实验作为一个实验单元进行了教学实践。从实验效果看,有约15%的学生能够比较独立地完成实验,实现U盘的挂载、读写、容量信息读取操作;有约60%的学生在老师进一步给出参考驱动程序的合并雏形后,能够顺利完成合并,并实现部分功能,如容量信息的读取;剩下的大概25%只能进行部分合并工作,不能完成U盘驱动的有效功能。此外,对于fdisk操作和多分区功能的支持,很少有学生能够实现。

总体来看,虽然有U盘帮助函数的辅助,本实验仍然具有较高的难度,其主要困难在于:(1)许多学生对Linux下的程序开发、调试不熟悉,对于内核模块更是如此;(2)参考资料支持不够,这方面的参考资料比较分散,且大部分都是英文资料。完成情况好的学生,大都比较积极主动,自学能力较强。因此,本实验要取得比较好的效果,需要充分激发学生的主动性,同时对参考资料的使用方法进行较好的引导。

4结束语

本文介绍了一个USB块设备驱动程序开发实验的内容设计、教学组织和实验效果,对实验的关键环节和应注意的事项进行了分析,可供开展同类操作系统实验的同行借鉴,从而加深学生对操作系统的设备管理技术的理解,进一步提高“操作系统”课程的教学效果。

参考文献:

[1] 罗宇,陈燕辉,文艳军,等. 操作系统实验教程[M]. 北京:电子工业出版社,2009.

[2] Jonathan Corbert, Alessandro Rubini, Greg Kroah-Hartman,等. Linux设备驱动程序[M]. 3版. 魏永明,耿岳,钟书毅,译. 北京:中国电力出版社,2006.

猜你喜欢

操作系统U盘设备管理
自动辨认插口方向的U盘
让U盘起死回生
智能手机操作系统的分析与比较
国产桌面操作系统中虚拟化技术应用研究
铁路设备管理系统的设计与应用
U盘“闹肚子”