尺寸 5.25\面 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
如前所述,在dosfs文件系统设备应用dosfsdevinit()首次初始化时,多种磁盘配置参数被指定。这些参数保存在卷描述符dos_vol_desc中。而带有不同参数值的磁盘可能被放置在初始化过的设备驱动器中。如果用另一个磁盘取代磁盘(带有最后输入到卷描述符的配置参数),那么新磁盘的配置参数必须在使用之前获得。
当磁盘被装载时,引导扇区信息从磁盘上读取出来。此数据用来更新在卷描述符中的配置数据。注意这个操作发生在磁盘存取的开始。而且在卷被卸载(使用dosfsvolunmount())或一个准备好的替换操作被执行之后,又再次执行这个操作。 配置数据的自动重新初始化有重要的含义。卷描述符数据在初始化磁盘(使用fiodiskinit)时使用;这样,磁盘使用最近装载的磁盘的配置初始化,而不考虑在dosfdevinit()期间的初始规格,因此我们推荐在磁盘装载之前,在dosfsdevinit()之后紧接着使用fiodiskinit。(设备以raw模式打开,fiodiskinit ioctl()函数执行后,关闭设备。) 已初始化过磁盘的使用
如果你使用一块已经初始化过的有ms-dos引导扇区、fat、根目录的磁盘(例如,使用统一的ms-dos格式),则不需要在dosfsdevinit()中提供卷配置数据。 可以忽略ms-dos配置数据(通过指定一个null指针代替在dosfsdevinit( )期间dos_vol_config结构的地址),不过仅仅在你确信卷的首次使用伴随完全格式化和初始化过的磁盘时才使用这种方法。 当装载一个已经初始化过的磁盘时,所有标准的ms-dos配置值都从磁盘引导扇区获取。而指向dosfs的选项必须被指明。 。 dos_opt_longnames(不受8.3版本限制的大小写敏感文件名),使用这个选项初始化过的磁盘可以通过引导扇区中一个特殊的卷id字符串自动识别。
dos_opt_changenowarn, dos_opt_autosync, dos_opt_lowercase, 和 dos_opt_export选项只记录在内存中,不放在磁盘上。因此当用null代替dos_vol_config结构指针初始化磁盘时,不能删除这些选项。另外可以使用dosfsdevinitoptionsset()程序设置这些选项为默认值;除非支持明了的dos_vol_config信息,不然默认值将应用于后面所有使用dosfsdevinit()初始化的dosfs文件系统。 卷配置信息访问
可以通过在tornado shell中使用dosfsconfigshow()2和dosfsconfigget()获得磁盘信息。这里参考tornado(shell)。 使用dosfsconfigshow()显示象最大连续区域和设备名这样的配置信息。例如: -> dosfsconfigshow \value = 0 = 0x0
输出到标准输出设备,如下 device name: /ram1/
total number of sectors: 400 bytes per sector: 512 media byte: 0xf0
# of sectors per cluster: 2 # of reserved sectors: 1 # of fat tables: 2 # of sectors per fat: 1
max # of root dir entries: 112 # of hidden sectors: 0 removable medium: false
disk change w/out warning: not enabled auto-sync mode: not enabled long file names: not enabled
exportable file system: not enabled volume mode: o_rdwr (read/write) available space: 199680 bytes
max avail. contig space: 199680 bytes
dosfsconfigget程序把磁盘信息存储到dos_vol_config结构中。这对于初始化一个新磁盘(与已有磁盘相同配置)很有用,另外对于用dosfsmkfs()在磁盘上初始化dosfs文件系统,并需要获取被计算的目前配置值也很有用。
装载卷
通常磁盘卷在对磁盘上文件或目录的第一个open()或creat()操作时自动装载。(某些ioctl()调用也可以引起磁盘装载)。 如果在dosfsdevinit()调用期间,一个null指针被指定代替dos_vol_config结构的地址,那么磁盘被立即装载以获得配置值。
磁盘装载时,从磁盘上读取引导扇区、fat和目录数据。卷描述符dos_vol_desc被更新以反映新装载磁盘的配置。
自动装载发生在dosfsvolumount()或替换就绪操作之后的第一个文件存取时。如果磁盘在带有dos_opt_changenowarn选项设置的dosfsdevinit()调用期间被定义,磁盘会被周期性地自动装载。当磁盘以raw模式打开时自动装载不会发生;见打开整个设备(raw模式)。
警告:因为设备名是被使用简单子链匹配的i/o系统识别的,所以文件系统不使用单独的斜杠(/)作为文件名。如果使用斜杠可能发生意外的结果。
可以使用usrfdconfig()装载卷,但是这个程序不返回dos_vol_desc结构。用usrfdconfig()装载的卷不能使用许多dosfs命令,包括dosfsvolunmount()。不过dofs的ioctl()命令(包括fiounmount)通过fd存取卷信息,所以可以和usrfdconfig()一起使用。 文件i/o
dosfs文件系统设备上的文件创建、删除、读写都使用标准vxworks i/o程序: creat( )、 remove( )、 write( )和read( )。 整个设备的打开(raw模式)
可以打开整个的dosfs卷。这是在open()和creat()调用期间通过只指定设备名来实现。当一个合法文件被打开时返回一个文件描述符;然而,在文件操作符上的操作影响整个设备。以这种方式打开整个卷叫作raw模式。
打开整个设备的通常原因是为ioctl()函数获得一个不属于某个文件的文件描述符。如fionfree函数,它返回在卷上的有效字节数。然而,对于许多此类函数,文件描述符可以是任何打开的此卷的,甚至一个特定文件的文件描述符。
当一个磁盘用ms-dos数据结构初始化(引导扇区、空的根目录、fat)时,以raw模式打开此设备。ioctl()函数fiodiskinit执行初始化。
可以以raw模式读写磁盘上的数据。在这种模式下,整个的磁盘数据区被看作一个单独的大文件。没有目录条目用来描述用raw模式写的任何数据。 有关对整个设备(包括使用ms-dos的数据结构的区域)低级i/o,,见4.4 raw文件系统:rawfs和有关“vxworks 参考手册>库”下的rawfslib的在线参考。 子目录创建
当子目录达到最大条目数时,子目录可以在根目录以外的任何目录下创建。子目录有两种创建方式: 1. 使用带有fiomkdir函数的ioctl():目录名传递给ioctl()。ioctl()调用使用的文件描述符可以通过以下方式获得:打开整个卷(raw模式)、一个正规文件或卷上的另一个目录。 2. 使用open():创建一个目录,o_creat选项必须设置在标记参量中打开,fstat_dir选项必须设置在模式参量中。open()调用返回一个文件描述符(描述新目录)。这个文件描述符用于只读,当不再需要时关闭这个描述符。
使用以上两种方法的任意一种方法创建目录,新目录名必须被指明。这个名字可以是一个全称路径名,或是一个相对于当前工作目录的路径名。 子目录删除
被删除的目录必须是空的(除了“.”和“..”条目)。删除目录有两种方法:
1. 使用带有fiormdir函数的ioctl()调用,指定目录名。另外,文件描述符可以指向卷上的任何文件、目录、或卷自己。
2. 使用remove()函数,指定目录名。 目录条目
每个dosfs目录包含一组条目描述它的文件和子目录。每个条目包含有关文件或子目录的信息: 文件名
一个8字节字符串(如果需要,空格填补)指定文件名。(命名可以长至40个字符;详情见4.2.18长文件名支持) 文件扩展名
一个3字节的字符串(空格填补)指定文件名或子目录名的一个延长部分。(如果选择了不受8.3版本限制的高级文件名,扩展概念是不适用的。) 文件属性
一个字节域指定文件的特征; 时间
文件编码创建修改的时间 日期
文件编码的创建修改的日期 簇号
文件内开始簇的数目。通过搜索fat找后来的簇 文件大小
文件的大小,对描述子目录的条目来说这个域通常为零。 读目录条目
在dosfs卷上的目录可以使用opendir(),readdir(),rewinddir(),和closedir()程序来搜索。这些调用可以用来确定文件名和子目录。
使用fstat()或stat()函数可以获得有关指定文件更详细的信息。连同标准文件信息,被这些程序使用的结构还从目录条目返回文件属性字节。 文件属性
在dosfs目录条目中的文件属性字节由一组标记位组成,每位标志一个特殊的文件特征。文件属性字节描述的特征见下表。 表:文件属性字节中的标记
vxworks 标记名 十六进制值 描述 dos_attr_rdonly 0x01 只读
dos_attr_hidden 0x02 隐藏文件 dos_attr_system 0x04 系统文件 dos_attr_vol_label 0x08 卷标 dos_attr_directory 0x10 子目录 dos_attr_archive 0x20 存档文件
当一个文件被打开为o_wronly或o_rdwr时,dos_attr_rdonly被选中。如果标记设置了,open()返回error,并且设置errnos为_dosfslib_read_only。
警告:ms-dos隐藏文件和系统文件标记(dos_attr_hidden和dos_attr_system)被dosfslib忽略。虽然他们保持完整,但他们不产生特殊的处理(例如,带有这些标记的条目当搜索目录时被公布)。
卷标标记dos_attr_vol_label用来说明一个包含磁盘的dosfs卷标的目录条目。标签不是必须的,如果使用了,每卷只有一个卷标条目,在根目录中。当读一个目录的内容时,卷标条目不被报告(用readdir())。只有使用ioctl()函数fiolabelget时,卷标条目才被确定。使用ioctl()函数fiolabelset,卷标可以被设置成任何11个字符或更少字符的字符串。在这些ioctl()调用期间任何打开到此卷的文件描述符都可以使用。
目录标记dos_attr_directory用来指出这个条目不是一个正规的文件而是一个子目录。 存档标记dos_attr_archive在文件被创建或修改时被设置。这个标记被其他搜索卷的程序(寻找修改过的文件并选择存档)使用。这样的程序必须清除存档标记,因为vxworks不做这个工作 。
属性字节中的所有标记(除了目录和卷标标记)可以使用ioctl()函数filoattribset设置或清除。这个函数调用在指定文件打开后改变其属性。在filattribset调用中指定的属性字节值被直接复制;为了保护存在的标记设置,使用stat()或fstat()确定当前的属性,然后使用and和or操作改变他们。 例:设置dosfs文件属性
这个例子使一个dosfs文件只读,并保持其他属性不变 #include \#include \#include \#include \#include \
status changeattributes (void) { int fd;
struct stat statstruct; /* open file */
if ((fd = open (\
return (error);
/* get directory entry data */
if (fstat (fd, &statstruct) == error) return (error);
/* set read-only flag on file */
if (ioctl (fd, fioattribset, (statstruct.st_attrib | dos_attr_rdonly)) == error) return (error); /* close file */ close (fd); }
文件日期和时间
目录条目包含一个文件和目录的时间和日期。这个时间在文件创建时被设置,并在文件被修改后关闭时被更新。描述子目录的条目不被更新——它们总是包含目录的创建日期和时间。
dosfslib库在内在结构中维持日期和时间。然而通常没有一个装置来自动更新时间和日期,这提供了两种不同的设置日期和时间的方法。
第一种方法应用两个程序dosfsdateset()和dosfstimeset()。使用如下: dosfsdateset(1990,12,25)/*设置日期为1990年12月25日*/ dosfstimeset(14,30,22)/*设置时间为14:30:22*/ 必须按时调用这些程序来更新日期和时间的值。
第二种方法要求一个用户支持的钩子程序。如果使用dosfsdatetimeinstall()安装了时间和日期的钩子程序,只要dosfslib要求获取当前日期和时间,程序就被调用。这样可以利用可被读取硬件日历时钟来获取当前时间。也可以用于其它的维持当前时间日期的应用软件。
定义日期/时间钩子程序如下(datetimehook是一个例子名,真正的程序名可以是任何名) void datetimehook (
dos_date_time * pdatetime /* ptr to dosfs date & time struct */ )
在钩子程序的入口,包含最近的时间和日期的dos_date_time结构设置在dosfslib中。接下来,钩子程序用当前正确的时间和日期填充结构。结构中没有发生改变的区域保持先前的值。
ms-dos规格在文件时间标记上仅提供了2秒间隔的时间戳。如果在dosfstimeset()或日期/时间钩子程序里指定的秒数是带零头的,那么它四舍五入到下一个偶数。
dosfslib使用的日期和时间被初始为1998年1月1日,00:00:
相关推荐: