- dosFs文件系统
- 初始化dosfs文件系统库
在用户执行任何文件操作之前,必须先初始化dosFs文件系统库。当在道6下包含了文件系统的组件后,这个初始化的过程就是自动执行的了。文件系统初始化库函数一般在prjConfig.c文件中,调用过程为:usrIosExtraInit--->usrDosfsInit()---->dosFsInit()----->dosFsLibInit()。
在初始化文件系统库的过程中,会调用iosDrvInstall()函数注册驱动程序到I/O系统的驱动程序表中,返回值为驱动号,保存在全局变量dosFsDrvNum中。驱动程序表中保存着使用dosFs文件系统操作文件的函数指针。iosDrvInstall原型如下:
int iosDrvInstall
(
FUNCPTR pCreate, /* pointer to driver create function */
FUNCPTR pRemove, /* pointer to driver remove function */
FUNCPTR pOpen, /* pointer to driver open function */
FUNCPTR pClose, /* pointer to driver close function */
FUNCPTR pRead, /* pointer to driver read function */
FUNCPTR pWrite, /* pointer to driver write function */
FUNCPTR pIoctl /* pointer to driver ioctl function */
)
-
- 创建块存取设备
此步骤可调用设备驱动功能函数创建相应的设备。函数名称格式是xxxDevCreate(),xxx表示设备驱动程序的类型,如:xbdRamDiskDevCreate(),三代台中浏览器模块需要”/”和”/tmp”设备存储一些用户数据,设备的创建和格式化代码如下:
int32_t deviceId;
deviceId = xbdRamDiskDevCreate
(
512, /* number of bytes per block */
20480 * 512, /* number of bytes on this device */
FALSE,
"/"
);
if (deviceId == NULL)
{
printf("usbTargRbcBlockDevCreated:"
"ramDiskDevCreate returned NULL\n");
return(ERROR);
}
/* format the RAM disk, ignore memory contents */
if (dosFsVolFormat("/",
DOS_OPT_BLANK | DOS_OPT_QUIET | DOS_OPT_FAT16,
NULL) != OK)
{
return ERROR;
}
-
- 创建和使用磁盘分区
可以通过调用dcacheDevCreate()函数为每一个块存取设备创建磁盘cache高速缓冲区。原型如下:
CBIO_DEV_ID dcacheDevCreate
(
CBIO_DEV_ID subDev, /* block device handle */
char * pRamAddr, /* where it is in memory (NULL = KHEAP_ALLOC) */
int memSize, /* amount of memory to use */
char * pDesc /* device description string */
)
在宏INCLUDE_DISK_PART被定义后,可以通过调用usrFdiskPartCreate()和dpartDevCreate()函数在磁盘上创建分区。如下代码所示,创建了cache缓冲,创建3个分区和dosfs文件系统设备并调用dosFsVolFormat()对其中一个分区进行格式化,该函数需要指定文件分配表(FAT)的格式和目录的格式两个参数。
CBIO_DEV_ID cbio, cbio1 ;
Int dcacheSize = 0x30000;
//创建磁盘缓冲区
if( (cbio = dcacheDevCreate(blkDevId, NULL, dcacheSize,”/sd0”)) == NULL)
return ERROR;
//创建3个分区,最多可以创建4个
usrFdiskPartCreate(cbio, 3, 50, 45);
if( (cbio1 = dpartDevCreate(cbio, 3, usrFdiskPartRead)) == NULL)
return ERROR;
//创建dosfs文件系统设备
if(dosFsDevCreate(“/sd0a”, dpartPartGet(cbio1, 0), 0x20, 0) == ERROR)
return ERROR;
if(dosFsVolFormat(“/sd0a”, DOS_OPT_BLANK | DOS_OPT_QUIET | DOS_OPT_FAT16, NULL) == ERROR)
return ERROR;
磁盘卷的文件分配表格式是在格式化过程中指定的。通过传递给dosFsVolFormat()函数参数来确定文件分配表格式。
FAT16:簇号用16bit表示,用于簇个数少于65524的磁盘;
FAT32:簇号用32bit表示,用于簇个数少于2^32-12的磁盘;
1.4磁盘卷的一致性问题
DOS文件系统容易受到磁盘更新过程中断而导致的数据结构不一致的影响,它是一个不考虑容错性能的文件系统。DOS文件系统包含一个可选的集成的一致性检测机制,可以检测文件的不一致性,并从不一致性状态中复原。要是用一致性检测机制,需要手动在dosFsDevCreate()函数中第四个参数添加自动检测参数,参数为0表示添加自动检测机制,为-1表示不执行自动检测并强制执行copyback操作。或者调用chkdsk()函数。需要注意的是,一致性检测机制会使系统访问速度降低,特别是第一次访问磁盘时。
STATUS dosFsDevCreate
(
char * pDevName, /* device name */
device_t device, /* underlying XBD block device */
u_int maxFiles, /* max no. of simultaneously open files */
int dosDevCreateOptions /* write option & volume integrity */
)
2.Cache一致性问题
Cache一致性问题是指高速缓冲存储器中的数据必须与内存中的数据保持同步(一致) , 这个问题常发生在CPU内核与另一个设备异步访问内存时。
高速缓冲存储器可以工作在Write-through或copyback模式。
write through:CPU向cache写入数据时,同时向memory(后端存储)也写一份,使cache和memory的数据保持一致。优点是简单,缺点是每次都要访问memory,速度比较慢。但该模式却无法解决输入时的高速缓冲存储器一致性问题。
Copyback:系统只写数据到高速缓冲存储器中,因此对于数据输入和输出都存在高速缓冲存储器一致性问题。
VxWorks下通常有两种方法解决高速缓冲存储器一致性问题。
1)Cache-safe buffer(即non-cacheable 的buffer):CPU读数据会直接从内存读物而不是从CACHE读取,CPU写数据会直接写入内存和cache中。
该方案可通过以下方法实现:
在内存段属性中定义此段buffer,空间属性为non-cacheable; 在内存管理单元MMU支持下,用cache DmaMalloc()/cache DmaFree()获得此段buffer。则此段buffer是non-cacheable的(注意无MMU时 )。
2)对于cacheabale的buffer,采用cacheFlush()/cacheInvalidate()或者宏定义CACHE_DMA_FLUSH()/CACHE_DMA_INVALIDATE()来操作此buffer空间。Cacheflush()将缓存内容写入内存,cacheInvalidate()将内存数据写入缓存器。这两个函数可以保证内存和缓存器的数据保持一致。