微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 对ROMFS文件系统的分析和改进

对ROMFS文件系统的分析和改进

时间:03-26 来源:互联网 点击:

read_super()用来读取ROMFS文件系统的首部,并利用该首部初始化一个超级块对象作为相应ROMFS的超级块,具体流程如下

1 初始化超级块。

A 设置一次读取的块大小并初始化超级块对象某些域。

B 从指定ROMFS中读取第0块到一个缓冲区。bh=sb_bread(s, 0),其中s是文件系统的超级块对象。ROMFS的文件系统结构被保存到缓冲区bh中。

C 取出ROMFS的文件系统结构,rsb = (struct romfs_super_block *)bh->b_data,rsb是一个romfs_super_block结构,用以保存该ROMFS的文件系统结构的数据。然后对该数据进行检验,确定其文件系统类型,检验和,文件系统大小。

D 继续初始化超级块对象某些域,比较重要的是s_magic = ROMFS_MAGIC和s_flags |= MS_RDONLY,分别表明了该超级块的magic签名和s_flags参数,此处它们分别表示该文件系统类型为romfs,并且是只读文件系统。

2 给超级块对象的操作表赋值(s->s_op = romfs_ops)

3 为根目录分配目录项 s->s_root = d_alloc_root(iget(s,sz), sz为文件系统开始偏移。

超级块操作表中romfs文件系统实现了两个函数

static struct super_operations romfs_ops = {

read_inode: romfs_read_inode,

statfs: romfs_statfs,};

函数romfs_read_inode是从ROMFS中读取一个inode索引节点对象并进行一些初始化工作,具体流程如下:

1 根据inode参数寻找对应的索引节点。

2 初始化索引节点某些域

3 根据该inode对应的文件的访问权限和类别来设置索引节点的相应操作表

A 如果是目录文件则将索引节点操作表设为i_>i_op=romfs_dir_inode_operations;文件操作表设置为i->i_fop=romfs_dir_operations。

B 如果是常规文件,则将文件操作表设置为i->i_fop=generic_ro_fops;将页高诉缓存表设置为i-> i_data.a_ops=romfs_aops;由于romfs是只读文件系统,它在对常规文件操作时不需要索引节点操作,如 mknod,link等,因此不用设置索引节点操作表。

对常规文件的操作也只需要使用内核提供的通用函数表generic_ro_fops ,它包含基本的三种常规文件操作:

llseek: generic_file_llseek,

read: generic_file_read,

mmap: generic_file_mmap,

这几种函数是块设备读取的通用函数,它们可以实现对ROMFS中常规文件的读取,寻址等操作。

C 如果是符号链接文件,则将索引节点操作表设置为
 i->i_op = page_symlink_inode_operation;
page_symlink_inode_operations是通用的符号链接操作表。同时还需要实现页高速缓
存操作,因此将页高诉缓存表设置为i->i_data.a_ops=romfs_aops。

D 如果是套接字或管道则进行特殊文件初始化操作init_special_inode(I,ino,nextfh);

函数romfs_statfs用于提取一些ROMFS的基本信息,包括文件系统大小,卷名等。相对而言非常简单。

5.对ROMFS的改进

5.1 改进思路

ROMFS有紧凑,小巧等优点,但是也存在一些明显的不足。作为一个只读的文件系统,ROMFS的中文件最大只能达到256M。因此难以在 ROMFS中保存较大的文件。在实际工作中我们常常会碰到超过256M的大文件,因此本人对ROMFS做了一些改进,使它能够容纳超过256M的文件。

ROMFS中限制文件大小的原因在于ROMFS的文件结构。ROMFS采用连续存放数据的策略,每个文件都必须放在连续空间内,故文件寻址只能是一级寻址,不能通过增减数据块来改变文件大小。虽然ROMFS使用32位地址进行文件的寻址操作,但该32位地址的后4位留做它用,因此ROMFS实际用于文件寻址的地址只有28位,这就造成ROMFS的任意两个文件头之间地址相差不能超过256M,这就是ROMFS中文件大小不能超过256M的原因。

针对这点我们可以做一些适当的改进工作,ROMFS的基本结构十分紧凑,能够改动的范围比较有限。为了尽可能保留原有代码的结构,我们没有在 ROMFS的文件结构中添加新字段,只是利用了文件名的填充字段作为对文件寻址的补充。在构造文件系统时在实际文件名后加上1个字节作为文件名的附加段,实际文件名加上附加段后写入文件系统作为该文件的文件名。附加段的前4位用来作为文件首地址的低4位。这样如果文件名不是16个字节整数倍则可以利用对文件名的填充字节,不会额外占用空间;如果文件名长度刚好为16字节的整数倍,那么加上一个字节的附加段后必须再填充15个字节以符合文件名保持16字节对齐的要求。这会浪费15个字节的空间,但文件名本身恰好满足16字节对齐的机会并不大,从概率角度讲只有1/16,因此是可以接受的。修改后ROMFS的文件结构如下:

在对文件寻址时,将next filehdr 字段的前28位和additional 字段的前4位合并起

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top