SoC嵌入式软件架构设计之七:嵌入式系统固件的系统区文件系统设计
嵌入式固件的系统区(system disk,SD)包括操作系统、驱动、中间件、应用和字库、UI资源等文件,本文讲述SD区的文件系统设计。文件系统最主要的目标是为了实现单个文件的定位和读写。因为一般代码都是不可自修改的,即量产之后不会有写操作,嵌入式系统的SD文件系统就是为了能够简单、高效地定位某个文件和读取文件中的数据。设计原则和要点有以下几方面:
1. 逻辑连续存储单个文件,以扇区对齐。
SD区的单个代码和资源文件一般都不大,所以不必要像fat32文件系统那样用fat表把文件簇串起来,直接逻辑连续地存储起来即可,这样定位也会更加简单快速,当然文件应该以扇区来对齐,方便读取,文件偏移信息也能用扇区数来记录。
2. SD头
这是对整个SD区属性的描述,包括校验码、版本号、日期、OEM厂商等等。有时为了保证知识产权,还会加上一些防止拷贝的加密ID信息。
3. DIR节
DIR节就是目录信息,即每个文件在SD区中的定位信息,是SD文件系统最重要的数据结构,文件的定位就是依赖于目录信息进行。打包工具会按一定的顺序将各个文件打包,并相应按顺序产生每个文件对应的目录信息。每个文件的目录数据结构如下:
1)文件名,一般是8+3格式
2)文件属性,区分系统文件和应用文件、隐藏文件等
3)文件在SD区中的偏移量,以扇区为单位
4)文件大小,字节为单位
5)校验码
4. 文件数据
DIR节之后就是一个个真实的代码和资源和配置等文件。
5. fopen
打开文件即根据文件名在DIR节中匹配,匹配成功即可获得文件在SD中的偏移量,将这偏移量右移9位(即512字节,一个扇区)即是文件的位置。fopen返回的是一个句柄,该句柄对应一个数据结构,结构一般包括:文件的起始位置、长度、当前读指针位置等。记录起始位置和长度是为了防止越界读取。
6. fread
根据句柄的当前读指针进行读取,读后要修改当前读指针。
7. fseek
根据模式来直接修改读指针。
需要清楚的是:SD区是一个逻辑区,其只是固件的一部分。一个固件会包括引导区、SD区、VM区、特定功能区(如VM),之后才是数据区,这个数据区就会部署fat32或者exfat等标准文件系统。