在ucos—II嵌入式操作系统平台上实现exfat文件系统
2016-01-14杨利
杨利
摘 要:Exfat文件系统是大容量移动存储设备文件系统的新宠,由于其操作简便、支持超大文件等突出特点,应用越来越广泛。该文在研究exfat文件系统结构特点的基础上,成功将exfat文件系统移植到基于ucos-II嵌入式操作系统的开发平台上,使得运行该操作系统的电子产品可以方便地实现音视频播放等功能,极大的增加了产品的多样性,因此该研究成果具有非常好的现实意义。经过测试证明,移植后的exfat文件系统在功能和效率上都达到了预期的目标。
关键词:ucos-II exfat 文件系统
中图分类号:TP316 文献标识码:A 文章编号:1672-3791(2015)02(b)-0011-02
Exfat文件是微软继FAT、NTFS桌面文件系统后推出的全新文件系统,由于其特殊的结构,解决了FAT文件系统不能支持大文件、NTFS文件系统对硬盘读写频繁等问题,是目前大容量移动存储设备文件系统的首选。ucos-II嵌入式文件系统由于其开放性、免费性及精简性等特点,成为许多中小企业作为电子产品研发平台的选择。随着电子技术的发展,几乎所有的电子产品都要求具备多媒体播放等功能,而这些功能都需要有文件系统的支持,因此在ucos-II嵌入式操作系统平台下探索如何实现exfat文件系统,具有很好的现实意义。
1 Ucos-II内核简介
Ucos-II是基于优先级抢占的实时嵌入式操作系统,具有内核源码完全开放且共享资源丰富的特点。ucos-II内核由核心、任务处理、时间处理、任务同步与通信等4个部分,总共有5 500行代码。其中oscore.c源码是内核的处理核心,完成初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等工作。ostask.c是任务处理部分的源码,包括任务的建立、删除、挂起、恢复等函数。任务处理部分中的内容都是与任务的操作密切相关的,ostime.c是时钟处理源码,任务延时等操作是在这里完成的。ucos-II操作系统启动和多任务的调度关键在于时钟节拍处理函数,实际上是一个中断服务程序,是嵌入式系统定时器定时时间到指向的中断服务程序。任务间的通讯与同步包括事件机制、消息队列、信号量集,分别用于两个任务之间、一个任务与多个任务之间、多个任务与多个任务之间的通讯。
2 Exfat文件系统简介
Exfat是为大容量移动存储设备而生的文件系统,提高了单个文件的大小,使得单个文件最大为32EB,从而加强了存储设备和电脑直接的互操作性。并且exfat保留了fat文件系统的操作简便性,克服了NTFS的损害硬件的缺点,使得其成为移动存储设备上文件系统的新宠。
Exfat文件系统的结构见图1。
其中VBR是启动扇区,指卷的物理0扇区,它记录了该卷的相关信息,其具体结构可以参照参考文献[3],该文就不重复叙述。
上电启动后操作系统会最先读取VBR启动扇区的内容,通过分析VBR的内容,可以很清楚地定位FAT表、根目录、数据区的位置,从而也很容易查找到任一指定名的文件。
通常一簇为32个扇区,一个扇区为512字节。簇0除了存放VBR外,其余均为保留扇区;簇1存放Fat表;簇2、簇3分别存放簇位图文件和大写字符文件,其中簇位图表征簇的使用情况,为1表示该簇占用,为0表示该簇空闲;簇4为根目录使用,所以数据一般从簇5开始。
FAT32文件系统采用32字节来记录目录项,在exFAT中,目录项大小仍然是32字节,不过结构上已经做出了重大的改变,目录项的第一个字节表示的是该目录项的类型,不同的目录类型有不同的目录结构,常见的目录项有81H、85H、C0、C1、C2等,目录项的结构请参照参考文献3和4。
一个目录,可以由多个不同的目录类型组成,因为不同的目录类型有不同的目录结构,这样虽然一个目录项只有32个字节表示,但其代表的信息量远比FAT32目录项的结构丰富得多。
3 在ucos-II内核中实现
3.1 实现思路
在ucos-II内核中实现exfat文件系统的前提是先搭建文件系统的框架,这是该课题的准备工作,不在此叙述,可参照参考文献1和2。
根据exfat结构的分析,要实现exfat文件系统,核心工作就是先创建相关的数据结构,如VBR、目录项、目录类型等;然后根据对文件操作的需求,编写相关的操作函数,如打开、读写、关闭文件等,命名以exfat_打头。如打开文件函数命名为exfat_openfile;最后将这些exfat文件操作函数和ucos-II的文件系统关联起来,例如当操作系统上层调用openfile函数时,如果此时存储设备的文件系统格式为exfat,那么openfile函数,最终会调用下层的exfat_openfile函数来完成具体的操作。
3.2 重要数据结构及函数
3.2.1 0扇区VBR
struct exfat_super_block {
__u8 jmp_boot[3]; /* boot strap short or near jump */
__u8 oem_id[8]; /* oem-id */
__u8 unused0;
__u32 unused1[13];
__le64 start_sector; /* start sector of partition */
__le64 nr_sectors; /* number of sectors of partition */
/*0x50*/__le32 fat_blocknr; /* start blocknr of FAT */
__le32 fat_block_counts; /* number of FAT blocks */
......
}
3.2.2 函数列表
unsigned int fsapitbl[]={
(unsigned int)FS_FOpen,
(unsigned int)FS_FClose,
(unsigned int)FS_FRead,
(unsigned int)FS_FWrite,
(unsigned int)FS_GetLength,
(unsigned int)FS_GetTime,
(unsigned int)FS_ConvertName,
......
};
3.3 测试与验证
该课题采用黑盒测试的方法来验证文件系统的功能,如要验证FS_CopyDir函数(拷贝目录)的正确性,可以在U盘下拷贝任一大小的文件夹,然后在ucos嵌入式平台上执行该函数,最后在电脑上用文件比较器软件来比较前后两文件夹的内容是否一样。
经过反复多次的黑盒测试证明,该文移植后的exfat文件系统基本上实现了windows下exfat的全部功能,完全满足了ucos-II嵌入式操作系统平台上的使用。
4 结语
该文经过不断的研究探索,终于在ucos-II嵌入式操作系统平台下实现了exfat文件的基本功能。该成果对于使用ucos-II操作系统来开发电子产品的用户来说,具有非常好的现实意义,利用该成果,产品可以识别并读写文件系统格式为exfat的大容量移动存储设备,从而为多媒体文件的处理提供了可能。
参考文献
[1] 谌爱文,陈仕许.初探在ucos-II上实现大容量内存文件系统[J].怀化学院学报,2006(2):110-112.
[2] 王命延,余爱军.一种加载在uCOS-II内核上的嵌入式文件系统[J].南昌大学学报,2005(2):197-199,204.
[3] 史久根,王跃,韩江洪.exFAT文件系统的优化模型[J].计算机工程,2009(16):54-55,58.
[4] 朱晨.电子词典中文件系统的设计与实现[D].成都:电子科技大学,2012.