对ROMFS文件系统的分析和改进
引言:ROMFS是在嵌入式设备上常用的一种文件系统,具备体积小,可靠性好,读取速度快等优点。同时支持目录,符号链接,硬链接,设备文件。但也有其局限性。ROMFS是一种只读文件系统,同时由于ROMFS本身设计上的原因,使得ROMFS支持的最大文件不超过256M。本文讨论了 ROMFS的原理,并针对其代码做了详细的分析,指出了ROMFS的优缺点并做了相应的改进。Linux, uclinux都支持ROMFS文件系统。除ROMFS外,其它常用的嵌入式设备的文件系统还有CRAMFS,JFFS2等,它们各有特色。
1.ROMFS文件系统的特点
ROMFS是一种只读的文件系统,它使用顺序存储方式,所有数据,包括目录,链接等都按目录树的顺序存放。相对于EXT2等较大型的文件系统而言,ROMFS非常节省空间。通常ROMFS用在嵌入式设备中作为根文件系统,或者用于保存boot loader以便引导系统启动。
2.ROMFS文件系统的数据存储方式
设计一个文件系统首先要确定它的数据存储方式。不同的数据存储方式对文件系统占用空间,读写效率,查找速度等主要性能有极大影响。ROMFS是一种只读的文件系统,它使用顺序存储方式,所有数据都是顺序存放的。因此ROMFS中的数据一旦确定就无法修改,这是ROMFS只能是一种只读文件系统的原因,它的数据存储方式决定了无法对ROMFS进行写操作。由于采用了顺序存放策略,ROMFS中每个文件的数据都能连续存放,读取过程中只需要一次寻址操作,进而就可以读入整块数据,因此ROMFS中读取数据效率很高。
整个ROMFS文件系统的布局如下:
ROMFS的首部
前八个字节是文件系统的名字,在这里是”-rom1fs-“, 8-11字节存放该文件系统大小,12-15字节为前512字节的校验和,从16字节开始是文件系统的卷名,卷名的长度必须的16字节的整数倍,不足的部分可以用‘0’填充。
ROMFS的首部是ROMFS的超级块信息,操作系统通过超级块来识别文件系统的类型。首部之后就是实际的数据,包括目录,普通文件,设备文件,硬链接等。ROMFS支持所有这些类型的文件。
ROMFS文件系统中文件存储方式:
3.ROMFS的主要数据结构
ROMFS的数据结构比较简单,主要有文件系统结构和文件结构两种数据结构。
ROMFS的文件系统结构如下:
struct romfs_super_block {
__u32 word0;
__u32 word1;
__u32 size;
__u32 checksum;
char name[0]; /* volume name */
};
该结构用于识别整个ROMFS文件系统,大小为512字节,word0初始值为'-','r','o','m',word1初始值为 '-','1','f','s',通过这两个字操作系统确定这是一个ROMFS文件系统。size字段用于记录整个文件系统的大小,理论上ROMFS大小最多可以达到4G。checksum是前512字节的校验和,用于确认整个文件系统结构数据的正确性。前面4个字段占用了16字节,剩下的都可以用作文件系统的卷名,如果整个首部不足512字节便用0填充,以保证首部符合16字节对齐的规则。
ROMFS的文件结构如下:
struct romfs_inode {
__u32 next; /* low 4 bits see ROMFH_ */
__u32 spec;
__u32 size;
__u32 checksum;
char name[0];
};
next 字段是下一个文件的偏移地址,该地址的后4位是保留的,用于记录文件模式信息,其中前两位为文件类型,后两位则标识该文件是否为可执行文件。因此 ROMFS用于文件寻址的字段实际上只有28bit,所以ROMFS中文件大小不能超过256M。spec字段用于标识该文件类型。目前ROMFS支持的文件类型包括普通文件,目录文件,符号链接,块设备和字符设备文件。size是文件大小,checksum是校验和,校验内容包括文件名,填充字段。 name是文件名首地址,文件名长度必须保证16字节对齐,不足的部分用可以0填充。
4.ROMFS的实现
在Linux系统中定义一个文件系统首先要定义相应的file_system_type以及读取超级块的函数。具体到ROMFS本身,这两个对象分别是romfs_fs_type和romfs_read_super,通过宏DECLARE_FSTYPE_DEV来实现对romfs_fs_type的定义以及初始化工作。此外还需要实现对目录,文件的读写操作。
在Linux对ROMFS的实现中,比较重要的数据结构如下:
//超级块操作表
static struct super_operations romfs_ops = {
read_inode: romfs_read_inode,
statfs: romfs_statfs,};
//页操作表
static struct address_space_operations romfs_aops = {
readpage: romfs_readpage};
//常规文件操作表
static struct file_operations romfs_dir_operations = {
read: generic_read_dir,
readdir: romfs_readdir,};
//索引节点操作表
static struct inode_operations romfs_dir_inode_operations = {
lookup: romfs_lookup,};
romfs_
- linux文件系统基础(02-09)
- Linux下Ext2与Ext3文件系统的区别(04-10)
- 基于VxWorks的文件系统的研究与实现(09-18)
- 设备文件系统devfs详解(05-01)
- Linux的日志文件系统简要剖析(05-01)
- Flash文件系统剖析(05-07)