1
实验七(
2
)
设备驱动开发指导
块设备种类多,
使用广泛,
其驱动程序的开发也比字符设备复杂。通过本实验,
大家要
开发一个实际块设备
(
U
盘)
的驱动程序,
将能够更深入地掌握块设备驱动程序的开发方法。
Linux
下
已
经
有
一
个
通
用
的
U
盘
驱
动
程
序
usb-storage.o
,
其
源
程
序
放
在
目
录
drivers\usb\storage
下(相对于内核源码根目录)。但这个驱动的实现相当复杂,本实验
希望开发一个相对简单些的
U
盘驱动程序,
不求高性能,
只求结构明朗、
清晰易懂,
主要是
让大家掌握一个实际块设备的驱动方式,从而加深理解。
事实上,本实验开发的驱动程序应该能够适用于所有基于
Bulkonly
传输协议的
USB
大
容量存储设备(
USB Mass Storage
),比如
USB
移动硬盘和
USB
外置光驱,
USB
闪存盘(
U
盘)
只是其中的一种。
由于
USB
大容量存储设备具有容量大、
速度快、
连接灵活、
即插即用、
总线供电等优点,
它们得到了广泛使用,
掌握这类设备驱动程序的开发技术无疑具有很强的
实用性。
实验内容
编写一个
U
盘驱动程序
myudisk
,只要求能够驱动某个型号的
U
盘,能够支持
U
盘的常
规操作,如命令
hexdump
、
mke2fs
和
mount
等。同时,要求在系统内核日志中显示出
U
盘
的容量。若有余力,可增加多分区支持功能。
实验基础和思路
在教材中
P130
,
讲解了如何编写一个
Ramdisk
块设备驱动程序
(sbull.c)
,
称为
radimo
;
在文献《
Linux
Device
Drivers
》讲解了如何编写一个
USB
设备驱动程序,并以
Linux
源代
码中的
usb-skeleton.c
为例。虽然前者驱动的并不是一个实际的块设备,且后者又只是针
对
usb
字符设备,但是它们提供了一个不错的基础,通过合并我们就能基本得到一个支持
usb
块设备的驱动程序。之所以说基本得到,是因为合并后只是有了块设备、
USB
设备的驱
动支持框架,但还缺一样:对
U
盘(
USB
块设备)的实际访问操作。
USB
块设备的访问方法
与
USB
字符设备区别很大,
有一套复杂的协议。
把这样一套协议研究清楚,
将花费大量时间,
也远离了我们驱动程序开发的核心。
这是一大难点,
为此我们专门编写了一个
U
盘访问函数
(
myudisk_Bulk_transport
)
,
以减轻工作量。
下一节将对该函数的使用方法和工作过程进
行专门讲解。
简言之,
合并
radimo
和
usb-skeleton
这两个参考驱动程序,
以构造整体框架,
调用帮
助函数
myudisk_Bulk_transport
以访问
U
盘,从而打造一个简洁的
U
盘驱动程序。本节接
下来介绍这两个参考驱动程序:
radimo
和
usb-skeleton
,着重讲解其工作原理及合并关键
环节。
参考驱动程序一:块设备驱动程序
sbull
请参看教材
P130