1、TpsFs简介
TpsFs(True Power Safe File System)是一款掉电安全的文件系统,该文件系统是SylixOS内建文件系统(专利技术)。TpsFs是基于事务的B+树文件系统:对元数据的修改使用事务提交的机制,保证了文件系统的一致性;使用B+树管理磁盘空间和文件空间,使得存储文件数据与定位速度更快、空间管理效率更高。TpsFs的源码可以在SylixOS Base工程下的"libsylixos/SylixOS/fs/TpsFs/"目录下查看。
2、TpsFs基本数据结构简介
每一种文件系统都有自己特定的数据结构和管理数据的方式,不同的文件系统其数据结构也有所不同,但所有文件系统也有一定的共性。下面介绍TpsFs中用来管理数据的一些结构。
2.1数据单元
当文件系统在磁盘分区上创建后,就可以进行数据的读取和存储了。数据在写入磁盘或从磁盘读取时每次操作的数据量称为数据单元,它的大小在建立文件系统时确定。数据单元在不同的文件系统中有不同的称呼方式,例如FAT中的"簇",EXT中的"块"。一个数据单元由若干个连续物理扇区组成,大小总是2的整数次幂个扇区。存储数据时,系统以数据单元为最小单位为其分配存储空间。在TpsFs中,数据单元以"块"为单位,并且最小不能小于4096字节,块大小可以在格式化TpsFs文件系统时通过tpsFsFormat函数的参数指定,通常情况下将其设置为4096字节。tpsFsFormat函数原型如程序清单2- 1所示。
程序清单2- 1 tpsFs格式化函数
errno_t tpsFsFormat (PTPS_DEV pdev, UINT uiBlkSize)
函数tpsFsFormat原型分析如下:
函数成功返回ERROR_NONE,失败返回错误号;
参数pdev是设备对象;
参数uiBlkSize是块大小。
块号的定义如程序清单2- 2所示。
程序清单2- 2 块号定义
typedef UINT64 TPS_INUM;
2.2超级块
超级块用来描述一个文件系统的基本信息,例如文件系统块大小、总块数、文件系统在磁盘分区内的整体布局(数据区、日志区等位置和大小)、已打开文件链表等等。TpsFs将超级块保存在磁盘分区的第0块内,每一个磁盘分区内只有一个超级块结构体。超级块结构体的定义如程序清单2- 3所示。
程序清单2- 3 超级块结构体定义
typedef struct tps_super_block {
UINT SB_uiMagic; /* magic数值 */
UINT SB_uiVersion; /* 版本 */
UINT SB_uiSectorSize; /* 块设备的扇区大小 */
UINT SB_uiSectorShift;
UINT SB_uiSectorMask;
UINT SB_uiSecPerBlk; /* 每块扇区数 */
UINT SB_uiBlkSize; /* 块大小 */
UINT SB_uiBlkShift;
UINT SB_uiBlkMask;
UINT SB_uiFlags; /* 挂载标识 */
UINT64 SB_ui64Generation; /* 标识一次格式化用于系统修复 */
UINT64 SB_ui64TotalBlkCnt; /* 总块数 */
UINT64 SB_ui64DataStartBlk;