1 概述
随着嵌入式技术的飞速发展,嵌入式系统已广泛应用于消费电子、通信设备、工业控制等领域,在许多场合需要存储大量的数据,因此支持大容量数据存储是嵌入式系统设计者必须考虑的问题。如何在VxWorks操作系统下实现对大容量多分区硬盘的支持是本文研究的重点。
1.1 VxWorks及其文件系统
与桌面系统不同,嵌入式产品大多是千差万别的,开发者需要面对非标准的硬件环境,扩展不同的接口设备,并完成驱动程序的编写。块设备即是其中一例。块设备是以“块”为单位、可以对数据进行随机存取的设备,典型的有硬盘、光盘、光驱和磁带等。VxWorks下的块设备不能像字符设备(如键盘)一样与I/O系统通过驱动直接打交道,必须在驱动与I/O系统之间构建文件系统,如图1所示。图中,虚线框中的内容是VxWorks5.5新增加的组件,主要针对硬盘等。
图1VxWorks文件系统的层次关系
操作系统提供文件系统的目的是为应用层提供标准的设备操作接口,以最大程度地屏蔽应用层软件对硬件的相关性。VxWorks支持多种文件系统,包括与DOS文件系统兼容的dosFs、原始文件系统rawFs、磁带文件系统tapeFs、CDROM文件系统cdromFs、网络文件系统NFS及目标机服务器文件系统TSFS等。本文的研究对象是硬盘存储介质,因此采用dosFs文件系统。
1.2 dosFs文件系统
VxWorks的dosFs文件系统可以非常灵活地适应实时应用的要求。其主要特性包括:
◆ 支持层次化的文件和目录结构,能够在一个磁盘上建立一定数目的文件,并进行有效的管理;
◆ 可将每个文件指定为连续存储或非连续存储;
◆ 广泛兼容多种可存储和可检索媒体(如硬盘);
◆ 可从dosFs文件系统中启动VxWorks操作系统;
◆ 支持VFAT(微软的VFAT长文件名格式)和VXLONGS(VxWorks长文件名)目录格式;
◆ 支持FAT12、FAT16和FAT32类型的文件分配表。
1.3 大容量多分区驱动
对于VxWorks操作系统,如果选择从硬盘启动,则需要将引导分区(一般为第一分区)格式化为FAT16格式,但是FAT16最大支持容量为2 GB的硬盘,因此当硬盘容量超过2 GB时,就不得不考虑分区了。但是又会出现一个问题,即VxWorks并不能支持多分区,所以必须为大容量多分区硬盘提供驱动。
2 实现方案
编写多分区的驱动之前,首先需要了解一个重要概念——CBIO接口。CBIO(Cached Block I/O)接口是VxWorks5.5新增加的可选组件,主要提供磁盘高速缓存、创建与PC DOS兼容的磁盘分区等功能。使用CBIO接口的文件系统主要是dosFs和rawFs。VxWorks5.5中的dosFs文件系统以cbioDev结构为接口,同时CBIO接口提供了BLK_DEV到cbioDev的封装。这样各种设备的驱动依旧像以前一样有统一的接口,而不需要关心它使用的文件系统是CBIO接口还是BLK_DEV接口。
VxWorks之所以能够识别多分区,是因为已经在多分区上构建了文件系统,因此编写多分区驱动的问题,也就是如何在多分区上创建dosFs文件系统的问题。主要步骤描述如下:
(1) 配置系统内核
利用dosFs文件系统、CBIO和块设备组件配置用户系统内核,使系统支持dosFs。需要的组件包括:
① 必备的组件: INLCLUDE_DOSFS_MAIN、INCLUDE_DOSFS_FAT和INCLUDE_CBIO。系统内核必须包括组件INCLUDE_DOSFS_DIR_VFAT和INCLUDE_DOSFS_DIR_FIXED其中的一个或全部。除此之外,用户还需加入支持块设备的INCLUDE_ATA组件。
② 可选组件:INCLUDE_DOSFS、INCLUDE_DOSFS_FMT、INCLUDE_DOSFS_CHKDSK、INCLUDE_DISK_UTIL以及INCLUDE_TAR。
③ 支持CBIO的可选组件:INCLUDE_DISK_CACHE、INCLUDE_DISK_PART和INCLUDE_RAM_DISK。
(2) 初始化dosFs文件系统
在执行任何其他操作前,必须初始化dosFs文件系统函数库dosFsLib。如果系统中包括了必备的组件,则该过程是由系统自动完成的。系统进行初始化时会调用iosDrvInstall(),将文件系统登记在I/O系统驱动表中。记录项指定了dosFs文件操作的入口点,由所有使用dosFs文件系统的设备共用。分配给dosFs文件系统的驱动号由全局变量dosFsDrvNum记录。
(3) 创建块设备
设备是由设备驱动中的设备创建程序xxxDevCreate()创建的。块设备创建后还没有与任何文件系统关系,没有设备名。
(4) 创建磁盘高速缓存
磁盘高速缓存是为旋转介质设计的,这一步是可选的。如果系统中包含了INCLUDE_DISK_CACHE组件,可以调用dcacheDevCreate()为每个块设备创建一个磁盘高速缓存。
(5) 初始化分区
在磁盘上创建分区会导致数据丢失,但是对已经分区的磁盘而言,初始化分区是必要的。
(6) 创建dosFs设备
这一步仅是简单地把设备加入到I/O系统中,不会执行格式化等操作,所以可以安全地创建dsoFs设备。在第一次I/O操作时挂载磁盘,也是在挂载磁盘时自动进行磁盘检查,所以即使磁盘不在,或没有格式化,创建设备的操作也会成功。
图2 创建dosFs的步骤
创建流程如图2所示。有关dosFs的API详细信息,可参考库dosFsLib、dosFsFmtLib、cbioLib、dcacheCbio、dpartCbio的帮助方档。
3 实验结果
在DOS下将8 GB硬盘分为4个区,每个区为2 GB,引导分区为FAT16格式,扩展分区为FAT16、FAT32格式均可。在VxWorks操作系统下安装多分区驱动后:
① 在target shell下执行devs
显示设备符:
…
4/sd0a第1分区
4/sd0b第2分区
4/sd0c第3分区
4/sd0d第4分区
② 在target shell下执行
cd"/sd0b"切换到第2个分区
mkdir"newdir"新建目录newdir
ls显示当前目录下文件
显示:
newdir
由上述结果可知,4个分区已经可以被VxWorks识别,并可以在分区上进行文件和目录操作。
4 结论
本文在分析VxWorks文件系统的层次结构基础上,重点介绍了VxWorks下适用于硬盘存储的dosFs文件系统;根据当前嵌入式系统对大容量数据存储的要求,提出了大容量硬盘在VxWorks下多分区识别的问题;在详细分析创建dosFs文件系统的步骤后,用dosFs的API函数编写多分区驱动,最终实现了VxWorks操作系统下对大容量多分区硬盘的支持。