1.TPSFS简介
TPSFS文件系统是一款掉电安全的文件系统,该系统是SylixOS内建文件系统(专利技术),该文件系统有如下特点:
采用B+树存储文件数据,读取与定位速度快,空间管理效率高;
对数据使用原子操作,掉电安全;
64位文件系统,支持EP级别文件长度;
大文件处理性能好;
支持文件记录锁,可支持大型数据库;
支持多块分配机制,提高了系统性能,使得分配器有了充足的优化空间;
支持子目录可扩展性,使得在一个目录下可以创建无数多个子目录。
TPSFS文件系统结构如图 1.1所示。
图 1.1 TPSFS文件系统结构图
超级块是TPSFS的第一个块,其中记录了文件系统的基本信息,如:块大小、块数量、数据块位置、log块位置等。TPSFS中每个数据块都被记录在一个以inode块为根的B+树中。
超级块后是空间管理inode块,inode对应的B+树管理整个磁盘的空闲块,可以理解为将所有空闲块记录到空间管理inode形成一个大文件。与普通文件不同的是,空间管理inode B+树节点的key值为磁盘块区间的物理块号,而普通文件的key值为该块区间在文件中的偏移。
2. SD卡分区
1)以nuc970开发板为例,板子上电后,插上SD卡,显示SD卡信息,如图 2.1所示。
图 2.1 SD卡信息显示
2)执行showmount命令查看当前挂载情况,在/dev/blk目录下挂载设备sdcard-0,其中/media/sacard0挂载的是/dev/blk/sdcard-0:0,/media/sacard1挂载的是/dev/blk/sdcard-0:1,如图 2.2所示。
图 2.2设备挂载情况
3)按如图 2.3所示步骤进行SD卡分区。
图 2.3 SD卡分区步骤
图中步骤解读如下:
执行解挂;
执行fdisk相关命令对sdcard-0重新分区;
选择分区数(本文只讨论TPSFS分区,所以此处选择1);
选择字节对齐;
选择0,表示选用所有剩余空间;
确定参数配置;
选择分区格式为TPSFS;
分区完成,可以看到SD卡分区完成,为TPSFS格式。
4)分区完成后执行sync命令将分区信息写入磁盘,完成分区。
5)重启开发板重新完成挂载后,可以看到当前SD卡在/media目录下已挂载设备,如图 2.4所示。
图 2.4 SD卡挂载显示
6)在SylixOS的shell中,执行mkfs sdcard0进行TPSFS分区格式化,如图 2.5所示。
图 2.5 SD卡分区格式化结果
接下来,介绍SylixOS如何完成TPSFS文件系统的格式化。
3.TPSFS文件系统驱动安装
在bspInit.c中,halDrvInit函数的主要作用就是初始化目标系统的静态驱动程序,其中,宏tpsFsDrv就是调用API_TpsFsDrvInstall接口安装TPSFS文件系统驱动程序,如图 3.1所示。
图 3.1 TPSFS驱动安装
API_TpsFsDrvInstall接口主要实现了文件系统的打开、关闭、读写和Ioctl相关操作。最后调用__fsRegister注册该文件系统。
在Ioctl相关操作中,可以识别FIODISKFORMAT命令进行卷格式化,具体实现逻辑如下:
1)检查是否为设备文件,否则返回错误,如图 3.2所示。
图 3.2检查是否为设备文件
2)检查是否该有正在工作的文件,如图 3.3所示。
图 3.3检查是否有正在工作的文件
3)卸载挂载的文件系统,如图 3.4所示。
图 3.4卸载文件系统
4)停止CACHE,并进行底层格式化(需判断当前分区是否为逻辑分区),如图 3.5所示。
图 3.5格式化
4.SD卡格式化命令
4.1 格式化命令初始化
mkfs作为shell关键字,需要在系统shell初始化过程中进行操作函数关联。在bspInit.c中halShellInit中调用API_TShellInit接口,该接口主要作用就是初始化tshell平台,包括初始化系统环境变量、初始化系统命令、初始化文件系统命令等。其中mkfs命令作为文件系统命令,就是调用__tshellFsCmdInit进行命令函数关联,该函数中通过调用API_TShellKeywordAdd向ttiny shell 系统添加一个关键字mkfs,同时将其与命令操作函数__tshellFsCmdMkfs关联起来,如图 4.1所示。
图 4.1 mkfs命令关联函数
这样,我们就可以通过mkfs进行相关文件系统的格式化操作了。
4.2 格式化命令操作函数流程简析
mkfs命令操作函数__tshellFsCmdMkfs,通过宏mkfs调用diskformat函数,该函数中主要执行以下任务:
判断当前是否有root权限,否则无法进行相关操作;
通过设备名打开设备,得到设备句柄;
通过句柄进行ioctl操作,根据FIODISKFORMAT命令进行对应的格式化操作;
格式化完成后,通过句柄进行ioctl操作,根据FIODISKSYNC命令进行对应的清空缓存操作;
通过句柄进行ioctl操作,根据FIODISKINIT命令进行重新初始化设备操作;
关闭设备。
5.格式化最终实现
本文主要讨论的是TPSFS文件系统格式化操作,在章节4.2第三步的ioctl操作最终就是调用的章节3中安装的TPSFS文件系统驱动函数Ioctl相关操作,识别FIODISKFORMAT命令,实现格式化操作。
6. 参考资料
1、《SylixOS应用开发手册》
2、《SylixOS分区教程》
本文出自 “11168899” 博客,请务必保留此出处http://11178899.blog.51cto.com/11168899/1905193
原文地址:http://11178899.blog.51cto.com/11168899/1905193