vxWorks下dosFs文件系统的创建

  文件系统,是指操作系统根据目录和文件的组织形式在磁盘设备上应用的一种设备驱动,不同的文件系统对目录和文件有不同的限制(如目录名限制,文件大小限制等)。

VxWorks支持多种文件系统,比较重要的有:

1、dosFs:适用于块存取设备(比如硬盘、软盘),和MS-DOS文件系统兼容;

2、rawFs:提供了一种简单的原始文件系统。该文件系统将整个硬盘当作一个单独的大文件;

3、cdromFs:允许系统从按照ISO9660标准文件系统格式化的CD-ROM上读取设备;

    通常文件系统驱动位于磁盘(块存取)设备驱动和IO系统之间,这一点在VxWorks中也不例外,但它在此基础上扩充了功能,即在文件系统下方增加了一个CBIO(Core Blocked IO)接口,在CBIO下方才是块存取设备驱动,其示意图如下:
 

图1 VxWorks I/O系统层次图

而CBIO接口部分又细分为4个逻辑子层,每个逻辑层都有与创建文件系统相关的函数,将CBIO接口部分细分后,包含各子层相关操作函数的VxWorks文件系统示意图如下:

图2 CBIO层内部结构层次图

图中线框中的四层就是CBIO接口层里的子层,对内核配置了dosFs支持的VxWorks来说,对磁盘的管理是从BLK_DEV API设备驱动子层上开始的,不同子层上的函数创建出的CBIO句柄分属不同的层,下层的CBIO句柄即为上层CBIO句柄的附属CBIO句柄,也就是说它们虽然都是CBIO_DEV_ID类型,但根据产生它们的函数所在的层把它们按等级划分,一个CBIO缓冲区可以在每个子层上都有一个CBIO句柄,也可以在部分子层上有CBIO句柄。CBIO缓冲区在基本CBIO to BLK_DEV设备子层上就没有句柄。图右侧函数间的箭头指示了各子层间句柄的关系。此外,从图中可以看出,头文件也是根据层的划分来组织的,这样使得函数调用层次清晰。

 

2 在磁盘上建立dosFs文件系统

以运行在摩托罗拉公司的PPC860 CPU上的VxWorks为例,在配置VxWorks内核时添加IDE/ATA磁盘设备驱动,在系统启动后,系统就和磁盘相连,系统启动后会发现磁盘(执行指令:devs,列出的设备中有一个/ata0a),此时该设备尚无法访问(就像刚出厂的硬盘用启动盘引导后能发现却不能使用一样,在dos下需要用fdisk工区来创建分区,格式化后才能使用),而在VxWorks下,系统也提供了类似的操作(如图2)。

在创建文件系统之前,应通过在内核中包含dosFs组件来初始化dosFs文件系统,即让系统加载文件系统驱动,允许系统在块设备上创建文件系统设备。

至此,系统启动后,用户直接面向的已经是BLK_DEVAPI设备驱动子层了,所有的操作都是从该层上方开始的。为了在磁盘上上创建分区、格式化并使用它,应进行以下操作:

2.1创建块存取设备:

对于磁盘设备,使用ataDevCreate()函数在BLK_DEV API设备驱动子层上创建一个指向块存取设备的指针pAta:

BLK_DEV * ataDevCreate(int ctrl,intdrive,int nBlocks,int blkOffset)

 

参数1表示磁盘设备控制器号,0表示primary,

参数2表示磁盘设备驱动器号,0表示master,

参数3表示驱动器设备上的块数量,0表示使用整个磁盘,

 

参数4表示从驱动器开始处偏移的块数量,0表示从头开始。

函数为指定的ATA/IDE磁盘或ATAPI CDROM创建一个设备,返回一个指向块设备结构(BLK_DEV)的指针,图2中在此处用pAta=ataDevCreate(0,0,0,0)创建一个指向块设备的指针pAta,该设备对应磁盘primary master,并且使用整个磁盘的从头开始的所有块。(不要混淆设备和磁盘,可以把磁盘的一部分创建为一个设备,即一个设备对应于一个磁盘和该磁盘里的块,而磁盘由控制器号和驱动器号唯一指定)

2.2 创建磁盘高速缓冲区:

该步骤是可选的。通过调用dcacheDevCreate()函数为一个块设备创建磁盘高速缓冲区并在CBIO to CBIO设备(dcacheCbio)子层上生成CBIO句柄。用法如下:

     CBIO_DEV_ID dcacheDevCreate(CBIO_DEV_ID subDev,char *pRamAddr,int memSize,char*pDesc)

 

参数1表示一个CBIO句柄,该句柄作为返回的CBIO to CBIO设备(dcacheCbio)子层的CBIO句柄的附属CBIO句柄,该附属句柄由函数CBIO_DEV_ID cbioWrapBlkDev(BLK_DEV *)在基本CBIO to BLK_DEV设备(cbioLib)子层上生成。也可以使用块设备,当使用块设备时,实际上是将块设备转换成在基本CBIO to BLK_DEV设备(cbioLib)子层上的CBIO句柄后作为参数的;

 

参数2表示该CBIO高速缓冲区在内存中的位置;

 

参数3表示为该CBIO高速缓冲区使用多少内存;

参数4表示设备描述字符串。

函数创建一个CBIO层磁盘高速缓冲区实例,并在CBIO to CBIO设备(dcacheCbio)子层生成CBIO句柄,当参数2为NULL时,参数3使用所有内存缓冲磁盘数据,当参数2为0时,参数3使用一个默认内存大小缓冲磁盘数据。参数4为设备描述字符串,会在dcacheShow执行时作为结果的一部分输出。当需要多个高速缓冲区时很需要(支持16个高速缓冲区)。

当内存容量小于指定缓冲区大小时创建失败。

图2中此处用cbio=dcacheDevCreate(pAta,0,0,“cache1”)为块设备pAta创建默认大小的高速缓冲区cbio,同时cbio也是该缓冲区在CBIOto CBIO设备(dcacheCbio)子层上的CBIO句柄。这里用块设备作为参数1比较直观。并描述为“cache1”。也可以先使用bcbio=cbioWrapBlkDev(pAta),再使用cbio=dcacheDevCreate(bcbio,0,0,“cache1”),此时bcbio为cbio的附属句柄。

2.3 创建和安装磁盘分区:

通过调用usrFdiskPartCreate()在磁盘上创建分区表,然后通过调用dpartDevCreate()初始化一个分区的磁盘,并在CBIO to CBIO设备(dpartCbio)子层上创建CBIO句柄。如下:

STATUSusrFdiskPartCreate(CBIO_DEV_ID cDev,int nPart,int size1,int size2,int size3)

参数1表示一个CBIO句柄,分区表将在这个代表整个磁盘的句柄对应的块设备上创建,注意这里不是subDev,而是cDev,表示不要用附属CBIO句柄bcbio,而应使用cbio;

参数2表示要创建的分区数,默认为1,最大为4;

参数3表示第2个分区所占用的空间百分比;

参数4表示第3个分区所占用的空间百分比;

参数5表示第4个分区所占用的空间百分比;

该程序用来创建基本分区表,即对磁盘分区,只能用来创建一个主分区表,即MBR,不能用于创建启动或扩展分区。返回一个指示操作成功与否的状态值。这时磁盘只有分区表,还没有安装分区,可以用usrFdiskPartShow()显示创建的分区。

 

图2中此处用usrFdiskPartCreate(cbio,2,50,0,0)在cbio对应的块设备上创建两个分区,各占磁盘一半空间。

创建磁盘分区的操作函数dpartDevCreate()用法如下:

CBIO_DEV_ID dpartDevCreate(CBIO_DEV_IDsubDev,int nPart,FUNCPTR pPartDecodeFunc)

 

参数1表示一个附属CBIO句柄,即存在于下面子层上的cbio;

 

参数2表示分区数量,

参数3表示能解释分区表的函数。

为了处理一个已分区的磁盘,即在磁盘上安装分区,需要使用该函数,推荐为了操作的高效,为整个磁盘创建一个高速缓冲区并在各分区间共享该高速缓冲区。nPart参数表示特定磁盘驱动器上最大的分区数,可支持最多24个。

分区表解释程序:应该实现的功能是将已分区设备的分区信息解释成特定格式的结果,并将结果写入一个特定类型的表中。

图2中此处通过调用cbio1=dpartDevCreate(cbio,2,usrFdiskPartRead)通过让usrFdiskPartRead程序解释cbio对应块设备的分区表来初始化分区的磁盘。usrFdiskPartRead程序是系统提供的解释分区表信息的程序,可直接调用。至此分区操作完成,在创建文件系统和格式化分区后即可使用分区了。注意程序返回的cbio1虽然和cbio类型相同,注意生成的句柄cbio1位于CBIO to CBIO设备(dpartCbio)子层上。

2.4 创建dosFs文件系统:

文件系统在VxWorks中也被看作一个设备,通过调用函数dosFsDevCreate()来在指定分区上创建dosFs文件系统。dosFsDevCreate()函数用法为:

STATUS dosFsDevCreate(char*pDevName,CBIO_DEV_ID cbio,u_int maxFiles,u_int autoChkLevel)

 

参数1表示创建文件系统后,对应分区的卷名,格式为“/卷名”;

 

参数2表示特定分区的CBIO句柄,对本例,即用dpartPartGet(cbio1,0)或dpartPartGet(cbio1,1)返回的句柄,dpartPartGet要求使用位于CBIO to CBIO设备(dpartCbio)子层上的CBIO句柄,并把它定义为dosFs卷;

参数3表示在设备上能同时打开的文件数;

参数4表示是否在挂载卷时自动进行卷的完整性检测。

该函数在一个特定CBIO句柄对应的分区上创建dosFs文件系统,定义每个磁盘卷的信息并将它们添加到I/O系统中。图中此处用dosFsDevCreate(“/DOSA”,dpartPartGet(cbio1,

0),16,0)在第一个分区(dpartParGet中的参数0)安装文件系统,卷名为/DOSA,并在挂载时自动进行完整性检测。

2.5 格式化磁盘卷

    使用dosFsVolFormat()函数将磁盘卷按dos格式格式化。该步骤只能在磁盘卷第一次初始化时执行一次。如果DOS格式的磁盘卷已经被格式化,可以跳过此步。

    dosFsVolFormat()的函数用法为:

STATUS dosFsVolFormat(void *device,intopt,FUNCPTR pPromptFunc)

 

     参数1表示要执行格式化操作的卷名;

     参数2表示格式化的选项,是比特映射,即选项的组合,0表示使用默认选项。参考帮助;

     参数3表示一个函数,该函数可以提示用户在格式化前改变卷的参数,0表示无函数;

函数返回格式化成功与否的状态值。图2中此处用dosFsVolFormat(“/DOSA”,0,0)将卷/DOSA格式化。

格式化后就可以使用了,可以用ll“/DOSA”挂载卷,此时可执行完整性检测,用dosFsShow “/DOSA”显示卷信息。

执行->devs会发现有/DOSA卷,执行->cd “/DOSA”将当前工作目录切换到该卷上,执行mkdir 目录名,在该卷上创建一个相应的目录。执行rm 目录名,即可删除相应目录。

有些函数里的CBIO句柄参数可以用BLK_DEV变量代替,此时系统会自动进行转换工作。

       至此,磁盘设备上的文件系统创建完毕,用户可以直接访问磁盘并进行相关操作。

时间: 2024-12-03 11:26:40

vxWorks下dosFs文件系统的创建的相关文章

VxWorks下USB驱动总结2

3:USBD驱动详解 这一部分将要描述USBD(USB Host Driver)的典型应用.例如初始化,client注册,动态连接注册,设备配置,数据传输,同时还探讨了USBD内部设计的关键特性.这部分是VxWorks下USB驱动的核心.   1 初始化USBD:分为两步 (1)必须至少调用一次函数usbdInitialize().在一个给定的系统中,usbdlnifialize()初始化内部USBD数据结构,并依次调用其它USB驱动栈模块的入口.usbdinitialize()可以在启动时调用

XFS:大数据环境下Linux文件系统的未来

本文讲的是XFS:大数据环境下Linux文件系统的未来,Linux有好多种件系统,但往往最受关注的是其中两种:ext4和btrfs.XFS开发者Dave Chinner近日声称,他认为更多的用户应当考虑XFS.他谈到了为了解决XFS中最严重的可扩展性问题所做的工作,还谈到了他认为将来的发展走向.如果他说的一点都没错,接下来几年我们在XFS方面有望看到更多的动静. XFS经常被认为是适合拥有海量数据的用户的文件系统.Dave表示,XFS非常适合扮演这个角色;它对许多工作负载而言向来表现不俗.以前往

Chkdsk 基于所用的文件系统,创建和显示磁盘的状态报告_DOS/BAT

Chkdsk 基于所用的文件系统,创建和显示磁盘的状态报告.Chkdsk 还会列出并纠正磁盘上的错误.如果不带任何参数,chkdsk 将显示当前驱动器中的磁盘状态. 语法 chkdsk [volume:][[Path] FileName] [/f] [/v] [/r] [/x] [/i] [/c] [/l[:size]] 参数 volume:  指定驱动器号(冒号分隔).装入点或卷名.  [Path} FileName]  指定需要 chkdsk 检查碎片整理的文件或文件集的位置和名称.使用通配

Linux下常见文件系统的对比

本文将对Linux下常见的几种文件系统进行对比,包括ext2.ext3.ext4.XFS和Btrfs,希望能帮助大家更好的选择合适的文件系统. 内容来自于网上找的资料以及自己的一些经验,能力有限,错误在所难免,仅供参考 历史 文件系统 创建者 创建时间 最开始支持的平台 ext2 Rémy Card 1993 Linux,Hurd XFS SGI 1994 IRIX, Linux, FreeBSD ext3 Dr. Stephen C. Tweedie 1999 Linux ZFS Sun 20

WinCE下NTFS文件系统的注意点

      借助于第三方提供的驱动程序,WinCE6.0也能支持NTFS文件系统,可以访问超大容量的移动硬盘,并播放存储于其中的1080P的视频文件.       需要注意的是WinCE下NTFS中文件及目录名区分大小写,即在同一目录下,能同时创建多个文件名大小写不同的同名文件,如下图所示.            关于NTFS中文件名区分大小写的说明,请参考http://support.microsoft.com/kb/100625/en-us       实际上,对于WinCE系统来说,如果要

在Oracle下使用PLSQL Developer创建简单的触发器

环境:PLSQL Developer 7.1.5 + Oracle 11.2.0 问题:在Oracle下使用PLSQL Developer创建简单 的触发器. 解决: 步骤一:在PLSQL Developer左边的My Objects展开列表下找到Triggers, 点击右键,选择新建(New): 步骤二:在弹出的对话框里填 入Trigger的名字(Name).触发时间(Fires).事件(Event).表或视图(Table or View),填完后选择 OK(确定):

Delphi下用Windows API创建窗体

// Delphi 下调用Windows API 创建窗体.// program delphi; uses windows, messages; const hellostr='Hello World!'; {$R delphi.res} //窗口消息处理函数. function MyWinProc(hWnd:THandle;uMsg:UINT;wParam,lParam:Cardinal):Cardinal;exp ort;stdcall; var hdca,hdcb:THandle; //设

win7系统下360免费wifi创建不了怎么办

  win7系统下360免费wifi创建不了怎么办?很多用户都知道win7系统可以使用360安全卫士创建免费的wifi,所以很多用户尝试使用360创建免费风wifi,创建过程中问题来了,碰到360wifi上不了网了,怎么回事呢?win7系统下360免费wifi创建不了怎么办?经过小编精心研究后发现原来是因为我的wifi驱动被一些应用程序给破坏掉了,我们只要简单的把驱动重新安装就可以解决了,大家一起来看看下面教程. 1.我们在桌面找到"计算机"然后右键,在弹出菜单点击"管理&q

Vxworks下的SATA提速

  1.       ATA接口的三种数据传输方式   (1)PIO(Programmable Input-Output)传输,可以分为PIO寄存器传输和PIO数据传输.PIO寄存器传输主要用于对ATA设备中的寄存器进行读写.读写的数据位数为8位DD[7:0].ATA主机控制器根据所要读写的寄存器地址设置CS0_.CS1_.DA[2:0]地址信号,同时将DIOW_或DIOR_设为有效,ATA主机控制器或ATA设备驱动数据总线释放数据.当DIOW_或DIOR_撤销时,ATA主机控制器或ATA设备从