|
vxworks文件系统的文章(推荐)
来自: 电子产品世界 alahover
论坛里好像没有关于文件系统的文章,所以就vxworks程序员手册对VxWorks文件系统的组织、配置和使用做以下讲解,希望大家喜欢,由于水平有限,其中不妥的地方望大家予以纠错。
VxWorks为块设备(磁盘)的实时使用提供了两种本地文件系统:一种与MS-DOS文件系统相兼容,另一种与RT-11文件系统相兼容。这些文件系统的支持库分别为dosFsLib和rt11FsLib。VxWorks还提供了一种简单的raw文件系统,这个文件系统把整个磁盘作为一个单独的大文件。这个文件系统的支持库是rawFsLib。
VxWorks还为不使用标准文件或目录结构的磁带设备提供了一个文件系统。磁带卷被看作一个raw设备,整个卷就是一个大文件。这个文件系统的支持库是tapeFsLib。另外,VxWorks提供了一个文件系统支持库cdromFsLib,它允许应用程序从依照ISO9660标准文件系统格式化的CD-ROMs中读取数据。
在VxWorks中,文件系统不受块设备种类型或它的驱动程序的约束。VxWorks块设备都使用一个标准接口,以便文件系统可以与设备驱动程序自的混合。做为选择,你可以写自己的能被驱动程序以相同方式使用的文件系统,只要在文件系统、驱动程序和I/O系统间遵循同样的标准接口。VxWorks的I/O体系结构使得在一个VxWorks系统中可以有多样的文件系统,甚至其类型也可以不同。块设备界面在3.9.4块设备中讨论?BR>
1 与MS-DOS兼容的文件系统:dosFs
使用dosFs文件系统格式化的磁盘与MS-DOS(直至6.2版本)磁盘是相兼容的。由两个文件系统初始化的硬盘之间在格式上有细微区别。然而,数据自身是兼容的,而且dosFs可被配置成使用MS-DOS格式化的磁盘。
DosFs文件系统向不同要求的实时应用程序提供了良好的适应性。主要特点包括:
l 文件和目录分等级排序,允许有效地组织,在一卷上可以创建任意数量的文件。
l 每个文件可以是连续存储或非连续存储的。非连续存储的文件可使硬盘空间利用率更高,连续存储的文件可以增强系统性能。
l 具有与广泛可用的存储器和可恢复介质的兼容性。应用VxWorks(不使用dosFs文件扩展名)、MS-DOS PCs和其它系统创建的磁盘可以自的交换。如果分区表被说明,那么硬盘也是兼容的。
l 具有从有dosFs文件系统的本地SCSI设备引导VxWorks的能力。
l 可以使用比通常MS-DOS允许的8个字符的文件名加3个字符的扩展名更长的文件名。
l NFS(网络文件系统)的支持。
1.1磁盘组织
MSDOS/ dosFs文件系统提供了一种以灵活方式组织磁盘数据的方*。它维护指定目录、每个包含文件或其它的目录的等级设置。文件可以被设置其搜索路径;文件扩展时,新的磁盘空间被自动分配。分配给一个文件的磁盘空间不必一定是连续的,这样可以使磁盘空间浪费最小。然而,为了提高它的实时性,dosFs文件系统允许连续空间被预先个别地分配给文件,从而使查找操作最块,行为更加确定。MS-DOS/dosFs文件系统的通常组织结构如图1,其中的多个单元在下面的部分论述。
图1 MS-DOS磁盘组织
-------------------------------
引导扇区 扇区0
-----------------------------
文件分配表(FAT)
-----------------------------
根目录
------------------------
文件和子目录
----------------------------
簇
在MS-DOS/dosFs文件系统中,分配给文件的磁盘空间由一个或多个磁盘簇组成。一个簇为一组连续的磁盘扇区 。软盘通常由两个扇区组成一簇;固定硬盘由更多的扇区组成一簇。文件系统可以一次分配的最小的磁盘空间为一簇。虽然每簇有巨大数量的扇区允许在固定大小的文件分配表( FAT;见 文件分配表)中描述一个巨大的磁盘,但是这可能会导致磁盘空间的浪费。
引导扇区
MS-DOS/dosFs硬盘或磁盘的第一个扇区称为引导扇区。其中包含有多种配置数据。其中一些数据域描述硬盘的物理性质(例如总扇区数),另外一些域描述文件系统变量(例如根目录的大小)。
引导扇区信息在初始化时写入磁盘。dosFs文件系统可以使用在另一个系统上初始化过的磁盘(例如,在MS-DOS PC上使用FORMAT),或者VxWorks可以使用ioctl()调用中的FIODISKINIT函数初始化磁盘。
随着MS-DOS标准的发展,多样的域被加入到引导扇区的定义中。VxWorks 下的磁盘初始化使用MS-DOS 5.0版本定义的引导扇区域。
MS-DOS 初始化硬盘时,在引导扇区中加入一个分区表。而VxWorks不创建这样一个表。所以两个系统初始化的硬盘是不同的。如果设备的块补偿参数创建程序将超出分区表范围的数据指向数据区的第一个字节,那么VxWorks可以读取被 MS-DOS 格式化的磁盘文件。
文件分配表
每个MS-DOS/dosFs卷包含一个文件分配表(FAT)。对每一个分配给文件或目录的磁盘上的簇,FAT中都有一个条目。当簇没有使用过时(可分配),它的条目值为零。如果簇分配给一个文件,它的条目值是文件下一部分的簇号。如果簇位于文件的最后,它的条目值是-1。所以,文件或目录的表述由一个FAT条目链表组成。如2例所示,一个文件由簇2、300和500组成。簇3是没有使用过。
注意:dosFs不映射坏的磁盘扇区到FAT中
图2:FAT条目
<img src="http://bbs.edw.com.cn/skins/default/filetype/bmp.gif">screen.width-500)this.style.width=screen.width-500;" border=0> 点击浏览该文件
<img src="http://bbs.edw.com.cn/uploadImages/200331820151996732.bmp">screen.width-500)this.style.width=screen.width-500;" border=0>
FAT的每个条目占12或16位。最多包含4085簇的磁盘卷用12位条目;多于4085簇的磁盘用16位条目。条目(特别是12位条目)最初利用英特尔8088体系配置的优点,编码为特殊形式。然而,因为所有的FAT操作都通过dosFs文件系统执行;所以编码和译码与 VxWorks应用程序无关。
一个卷通常包括多个FAT拷贝。这种冗余允许数据在第一份FAT中发生介质错误事件时得到恢复。
警告:如果是指定配置,dosFs 文件系统维护多个FAT拷贝;然而,在错误事件中,拷贝不是自动使用的。
FAT的大小和FAT拷贝的数量是由引导扇区中的域决定的。对于使用dosFs文件系统初始化的磁盘,这些参数是在dosFsDevInit( )调用(通过设置卷配置结构DOS_VOL_CONFIG中域)期间被指定的。
根目录
每个MS-DOS/dosFs卷包含一个根目录。根目录总是占有紧接着FAT拷贝的一组连续的磁盘扇区。根目录占领的磁盘区域不在FAT中被条目描述。
根目录的大小是固定的,它的大小被引导扇区中的一个域指定,作为允许的目录项的最大数值。对于使用dosFs文件系统初始化的磁盘,这个大小是在dosFsDevInit( )调用(通过设置卷配置结构DOS_VOL_CONFIG中域)期间被指定的。
因为根目录有一个固定的大小,所以目录为满时再向其中加入项将返回一个错误。
子目录
除了根目录外,MS-DOS/dosFs卷有时包含一个子目录层。和根目录一样,子目录也包含文件和其它子目录项; 不过,在有些方面它们不同与根目录,而是类似于文件。
l 第一、象文件一样,每个子目录都被另一个目录中的项描述。这样的一个目录项通过在文件属性字节中一个位设置来说明它描述了一个子目录。同时,子目录与根目录不同,它有用户指定名。
l 第二、分配给子目录的磁盘空间由FAT条目连接而成的一组磁盘组成。这意味着子目录可以随着条目的加入而增大,并且子目录不一定要由连续的簇组成。根目录与子目录不同,能由任意数量的扇区组成,并且不必等于簇的整数倍数。
l 第三,子目录通常包含两个专用的项。“.”项指向子目录本身,“..”项指向子目录的父目录。而根目录不包含这些专用项。
文件
在MO-DOS/dosFs文件系统中分配给文件的磁盘空间是由FAT中的条目链在一起的一组簇。一个文件不一定由连续的簇组成;可以以任意顺序分配磁盘任意位置的不同的簇。
每个文件在其目录中有一个描述项。这个项包含文件名、大小、最后一次修改的时间和日期,还有文件的几个重要属性(只读文件,系统文件,隐藏文件,存档文件)。这个条目也包含文件的起始簇数;剩下的簇用FAT定位。
卷标
一个MS-DOS/dosFs磁盘可以有一个相关的卷标。卷标在根目录中是一个特殊项。它不包含文件名和子目录,而是包含一个识别卷的字符串。这个字符串可以包含最多11个字符。卷标项是通过在目录项中的一个特殊的文件属性字节的值来识别的。
注意虽然卷标条目没有用ls()报告出来。不过它占了根目录固定数目的条目中的一个。
卷标可以通过使用带有FIOLABELSET函数参数的ioctl()调用加入到dosFs卷。如果卷标不存在,就在卷的根目录加一个卷标项,否则,改变卷标字符串的值。这个卷标条目占据一个固定的根目录条目数;当根目录满时增加一个条目将导致一个错误。
当前的卷标字符串可以通过调用带有FIOLABELGET函数参数的ioctl()来获得。如果没有卷标,这个调用将返回一个错误,并设置errno为S_dosFsLib_NO_LABEL。
在VxWork或MS-DOS5.0(或更高版本)下初始化的磁盘,其引导扇区也包含卷标字符串。
1.2 初始化dosFs文件系统
注意在任何其它操作能被执行之前,dosFs文件系统库(dosFsLib)必须通过dosFsInit()调用进行初始化。这个程序带有一个参数――可以在同一时间打开的dosFs文件描述符的最大数。文件描述符的数目是在初始化时被分配,而且应用程序打开一个文件、目录或文件系统设备时,就使用了一个文件描述符。
dosFsInit()程序在I/O系统驱动器表中也为文件系统创建了一个条目(用isoDrvInstall())。这个条目为dosFs文件操作指定条目指针,并且可以用于dosFs文件系统中所有的设备。分配给dosFs文件系统的驱动器数记录在全局变量dosFsDrvNum中。
DosFsInit()通常在VxWorks系统启动之后被usrRoot()任务调用。使用这种初始化,在项目工具VxWorks view中选择INCLUDE_DOSFS,在Params属性标记中设置NUM_DOSFS_FILES为想打开文件的最大数。
1.3 使用dosFs初始化设备
dosFs文件系统初始化后,下一步是创建一个或更多的设备。设备通过设备驱动器的设备创建程序(xxDevCreate())来创建。驱动程序向块设备描述符结构(BLK_DEV)返回一个指针。BLK_DEV结构描述了设备的物理形式,同时也指定设备驱动程序提供给文件系统的程序。更多块设备的信息参见3.9.4块设备。
设备刚创建之后,块设备没有与其相关联的名字和文件系统。为了初始化一个块设备用于dosFs文件系统,已经创建好的块设备必须与dosFs相关联,并指派一个名字。这由dosFsDevInit()完成。它的参数有:用来标识设备的名字、块设备描述符结构和卷配置结构DOS_VOL_CONFIG(见4.2.4卷结构)。例子:
DOS_VOL_DESC *pVolDesc;
DOS_VOL_CONFIG configStruct;
pVolDesc = dosFsDevInit ("DEV1:", pBlkDev, &configStruct);
dosFsDevInit()调用执行下列任务:
l 为设备命名,把设备加入I/O系统设备表(用iosDevAdd())。
l 为设备分配并初始化文件系统卷描述符
l 返回指向卷描述符的一个指针。这个指针用来在一些文件系统调用时识别磁卷
用dosFs初始化设备并不格式化磁盘,也不用MS_DOS结构(根目录,FAT,等等)初始化磁盘。可以在有数据存在于MS_DOS文件系统中的磁盘上使用dosFsDevInit()调用;可以使用ioctl()函数中FIODISKFORMAT和FIODISKINIT分别实现磁盘格式化和DOS磁盘初始化。
DosFsMkfs()调用提供了一种简易的dosFs设备初始化的方*。如下
l 提供了一组缺省的配置值。
l 调用dosFsDevInit()。
l 使用带有FIODISKINIT的ioctl()函数初始化磁盘。
默认的dosFsMkfs()不能使任何dosFs-specific卷选项
(DOS_OPT_CHANGENOWARN,DOS_OPT-AUTOSYNC,DOS_OPT-LONGNAMES,DOS_OPT_LOWERCASE,或DOS_OPT_EXPORT)可用。在调用dosFsMkfs()初始化磁盘之前使用dosFsMkfsOptionsSet(),可以使这些选项中的所有组合有效。有关默认配置值的更多信息,见dosFsMkfs()手册。
1.4 卷配置
卷的配置结构(DOS_VOL_CONFIG)在调用dosFsDevInit()时使用。这个结构包含多种描述磁盘上数据分布的dosFs文件系统变量。结构中的大多数域与引导扇区中的相符。表1列出在DOS_VOL_CONFIG结构中的域。
表1:DOS_VOL_CONFIG域。
域 描述
dosvc_mediaByte 媒体描述符字节
dosvc_secPerClust 每簇的扇区数
dosvc_nResrvd 第一个FAT拷贝之前的保留扇区数,最小值为1(引导扇区)
dosvc_nFats FAT拷贝数
dosvc_secPerFat 每个FAT拷贝的扇区数
dosvc_maxRootEnts 根目录中条目的最大值
dosvc_nHidden 隐藏扇区数,通常为0
dosvc_options VxWorks特殊文件系统选项
dosvc_reserved 风河公司为将来使用保留
调用dosFsConfigInit()是初始化DOS_VOL_CONFIG的简便方*。它把配置变量作为参数并装入结构。这对从Tornado shell中交互地初始化设备很有用(见Tornado 用户手册:shell)。DOS_VOL_CONFIG结构必须在dosFsConfigInit( )调用前被分配。
DOS_VOL_CONFIG 域
在表1中除了最后两个DOS_VOL_CONFIG域,都描述了标准MS_DOS的特征。
域dosvc_options对于dosFs文件系统很特殊。这个域可能的选项见表2
表2:dosFs卷选项
选项 16进制值 描述
DOS_OPT_CHANGENOWARN 0x1 磁盘可能在没有警告的情况下被改动.
DOS_OPT_AUTOSYNC 0x2 I/O期间使磁盘同步
DOS_OPT_LONGNAMES 0x4 使用不受8.3规格的限制的大小写敏感文件名
DOS_OPT_EXPORT 0x8 允许使用NFS输出
DOS_OPT_LOWERCASE 0x40 在磁盘上使用小写文件名
前两个选项说明同步磁盘缓存块与物理设备的动作。剩下的选项用于扩展dosFs的性能。
DOS_OPT_CHANGENOWARN
如果磁盘没有被卸载就可被替换,或在状态就绪检查中发生变化,则设置这个选项。在这种情形中,有规则的检查磁盘来确定否发生改变。这将引起系统重大的开支;那么,我们推荐使用一种总是在移除前同步和卸载磁盘的机制,或至少声明状态就绪改变的机制。如果这样的机制适当,或磁盘是不可移动的,则不设置这个属性。自动同步模式在DOS_OPT_CHANGENOWARN被设置时自动允许(见下面有关DOS_OPT_AUTOSYNC的描述)。
DOS_OPT_AUTOSYNC
设置这个属性可确保磁盘缓存器中的目录和FAT数据被修改后尽快写入物理设备,而不仅仅是在文件关闭时被写入物理设备。数据尽可能存储到物理介质上,从而避免在系统紧急事件中丢失数据。因为使用自同步模式时将降低性能,所以 。
然而,DOS_OPT_AUTOSYNC设置不能使dosFs在每个write()后自动向磁盘中写数据。这将意味着极大地降低了性能。如果你的应用程序要求dosFs在每个write()后自动向磁盘中写数据,每次调用write()后使用带有FIOFLUSH的ioctl()函数
注不论什么时候设置DOS_OPT_CHANGENOWARN,自动同步模式都可以自动允许。
DOS_OPT_LONGNAMES
设置这个属性使系统允许使用大小写敏感文件名,文件名长度不受MS-DOS8.3版本的限制。
DOS_OPT_EXPORT
设置这个选项来初始化想使用NFS输出的文件系统。dosFs初始化生成附加的支持NFS协议所需的内存数据结构。这个选项对初始化文件系统(可以被输出的)是必不可少的,但它不真正输出文件系统。
DOS_OPT_LOWERCASE
设置这个选项来迫使dosFs创建的文件名使用小写字母字符。
(除了DOS_OPT_LONGNAMES选项是激活的,通常文件名用大写字母字符)如果dosFs卷是通过基于PC的NFS的客户机装载的,则需要设置这个选项。如果DOS_OPT_LONGNAMES选项也被指定,则这个选项无效。
计算配置值
在DOS_VOL_CONFIG结构中,dosvc_secPerClust和dosvc_secPerFat的值必须基于被使用的特殊的设备进行计算。
dosvc_secPerClust
这个域用来说明组成一个单独的簇的连续扇区数。因为一簇是每次可以被分配的最小磁盘空间,簇的大小决定了磁盘分配控制的细微程度。每簇中扇区数越多,每次分配的扇区数越多,从而降低了磁盘空间使用的整个效率。因此,通常每簇使用尽可能少的扇区,不过每簇少于两个扇区通常是不必要的。
FAT条目最大为16位;那么,可以被描述的簇的最大值为65536(64KB,或0x1000),这就是一个设备的簇的最大值。为了确定一簇中适当的扇区数,以0x1000(64k)划分磁盘上的所有扇区(BLK_DEV结构中的bd_nBlocks域),进位舍入到下一个整数,最终结果就是每簇中的扇区数;把这个值赋予DOS_VOL_CONFIG结构中的dosvc_secPerClust域。
dosvc_secPerFat
这个域指定磁盘上每个FAT拷贝必需的扇区数。要计算出这个值,首先确定磁盘的总簇数。总簇数等于总扇区数(BLK_DEV结构中的bd_nBlocks)除以每簇的扇区数。如前面提到的,磁盘的簇的最大数为64KB。
簇数随每个FAT条目的位数增加:如果总簇数小于等于4085,FAT条目为12位;如果簇数大于4085,FAT条目为16位。增加的结果是每个FAT拷贝所需的总字节数。这个字节数除以每个扇区的大小(BLK_DEV结构中的bd_bytesPerBlk域),决定了每个FAT拷贝的扇区数(按扇区的大小划分);如果有一些残余,结果再加一。把最终的值赋予dosvc_secPerFat域。
假定512字节扇区,每个拷贝最大可能的FAT占用256个扇区,计算如下
标准磁盘配置
对于软盘,许多标准磁盘配置用于MS-DOS系统。通常,配置通过媒体描述符字节的值唯一识别(至少针对一种给定大小的软盘),虽然一些制造商对不同的格式使用完全相同的值。一些广泛使用的配置参见表3。
固定磁盘不使用标准磁盘配置,因为它们很少附属于外部的系统,。通常固定磁盘使用0xF8的介质格式字节。
表3:MS_DOS 软盘配置
容量 160KB 180KB 320KB 360KB 1.2MB 720KB 1.44MB
尺寸 5.25" 5.25" 5.25" 5.25" 5.25" 3.5" 3.5"
面 1 1 2 2 2 2 2
磁道 40 40 40 40 80 80 80
扇区/磁道 8 9 8 9 15 9 18
字节/扇区 512 512 512 512 512 512 512
secPerClust 1 1 2 2 1 2 1
nResrvd 1 1 1 1 1 1 1
NFats 2 2 2 2 2 2 2 |
|