genromfs
romfs是一个只读文件系统,主要用在 mainly for initial RAM disks of installation disks.使用romfs文件系统可以构造出一个最小的内核,并且很节省内存。相比而言,早期的minix和xiafs(现在已经过时)文件系统如果编译为模块的形式则大小超过20000字节(在x86机器上大小为38502字节),而romfs却小于一页(在linux系统中,一页大小为PAGE_OFFSET,一般为4K),大约4000字节(在x86机器上大小为10479字节)。在相同的条件下,msdos文件系统模块大约30K(并且不支持设备节点和符号链接,在x86机器上大小为12K)。ntfs和nfsroot文件系统模块大约57K(在x86机器上大小为102K)。
注:上面叙述中的数值都是针对i586机器,括号中叙述的数值是在现在的x86机器上的大小,针对2.6.28内核。
1.2 romfs的用途
romfs本设计的主要目标是构造一个最小内核,在内核中只链接romfs文件系统,这样就可以使用romfs在稍后加载其他模块。romfs也可以用来运行一些程序,从而决定你是否需要SCSI设备,或者IDE设备,或者如果你使用的是"initrd"结构的内核,romfs也可以用来在之后加载软驱驱动。romfs的另一个用途是在你使用romfs文件系统的时候,你可以关闭ext2或者minix甚至affs文件系统直到你确信需要的时候再开启。
1.3 romfs的性能
romfs的操作是基于块设备的,它的底层结构非常简单。为了快速访问,每个单元被设计为起始于16字节边界。一个最小的文件为32字节(文件内容为空,并且文件名长度小于16字节)。对于一个非空文件的最大的开销是位于文件内容前面的文件头和其后的16字节的文件名(因为大多数的文件名长度大于3字节并且小于15字节,所以预置文件名长度为16字节)。
1.4 如何使用romfs映像
要使用一个制作好的romfs格式的映像,是将其挂载在其他文件系统的某个节点上。并且还有一个很重要的前提,就是内核要支持romfs文件系统。这一点可以通过配置内核实现,有两个方法:
1.将romfs配置成直接编译进内核,方法为使用make menuconfig命令进入内核配置界面,选择"File systems"并进入,选择“Miscellaneous filesystems”并进入,选择“ROM file system support(ROMFS)”,将其配置成"*"(直接编译进内核)。这样生成的内核就直接包含对romfs文件系统的支持。
2.将romfs配置成模块的形式,步骤和前面一样,只是在最后选择"ROM file system support(ROMFS)"的时候将其配置成"M"(编译为内核模块)。这样编译好的内核并不包含对romfs文件系统的支持,只是生成了romfs.ko模块(fs/romfs/romfs.ko),需要在启动系统后将其加载进内核才能使内核支持romfs文件系统。
有了内核对romfs文件系统的支持,就可以直接挂载romfs格式的映像了,挂载方法为:
niutao@niutao:~/kernel/romfs$ ls |
卸载一个已经被挂载的romfs格式映像使用umount命令。
1.5如何制作romfs映像
如果要创建一个romfs文件系统,需要使用genromfs工具。具体用法为:
-f IMAGE 指定输出romfs映像的名字
-d DIRECTORY 指定源目录(将该目录制作成romfs文件系统)
-v 显示详细的创建过程
-V VOLUME 指定卷标
-a ALIGN 指定普通文件的对齐边界(默认为16字节)
-A ALIGN,PATTERN 匹配参数PATTERN的对象对齐在ALIGN边界上
-x PATTERN 不包括匹配PATTERN的对象。
-h 显示帮助文档。
现在一一详细讲述genromfs的各个参数的含义及用法。
1. -f参数
该参数指定要生成的romfs映像的名字,是一个必须参数,如果缺少,则无法生成映像。例如:
niutao@niutao:~/kernel/romfs$ ls |
701 int main(int argc, char *argv[]) |
可以看到其中的dir就是指定的源目录,默认为当前目录。那么如何指定源目录?通过使用-d参数指定。
2. -d参数
该参数指定源目录,意思是要将那个目录及其下面的文件制作成romfs格式的映像。如果不使用-d参数指定,则默认为当前目录。例如:
niutao@niutao:~/kernel/romfs$ ls |
-v表示显示romfs映像创建的详细过程。例如:
niutao@niutao:~/kernel/romfs$ ls |
(2).第二列为文件或者目录名。
(3).第三列为前一个为文件或者目录所在设备的设备号,后一个为文件或者目录的节点号(这两个对应struct stat结构体的st_dev项和st_ino项)。
(4).第四列为文件或者目录的属性(对应struct stat结构体的st_mode项)。
(5).第五列为文件或者目录的大小,对于目录为0,文件则为文件以字节为单位的大小。
(6).第六列为文件或者目录在生成的romfs格式映像文件中的偏移。
(7).第七列表示该文件或者目录是一个硬链接,其指向的位置。这里需要注意一个细节:对于顶极目录下的目录,..目录是一个硬链接,除此之外,所有的目录都是目录(也就是说此第七列对于顶极目录下的目录就不存在)。而对于顶极目录下的子目录内的目录,则都是硬链接。这个在往后还会继续从代码的角度分析为什么会是这样(见对genromfs工具的分析)。
4. -V参数
指定当前要生成的romfs格式映像的卷标,如果没有指定,则默认为字符串"rom "加当前的时间(16进制格式)。例如:
niutao@niutao:~/kernel/romfs$ genromfs -f hello.img -d hello/ |
指定普通文件的对齐边界(默认为16字节),目的是为了快速访问文件内容。给出的对齐边界值必须大于16并且为16的倍数。这里所说的对齐指的是普通文件的文件内容的对齐,而并非文件头(见内核include/linux/romfs_fs.h中结构体struct romfs_inode )的对齐。假如指定普通文件x的对齐边界为align,其在生成的romfs格式映像中的偏移为start,文件名长度为len,则文件内容在romfs映像中的偏移offset为:
offset = start + 16 + (len / 16) * 16 + len % 16 ? 16 : 0
其计算过程为文件头偏移加上文件头大小(struct romfs_inode),其文件头大小为16字节,再加上文件名以16字节对齐的长度。
例如:
niutao@niutao:~/kernel/romfs$ genromfs -f hello.img -d hello/ -V niutao -a 64 -v |
offset = start + 16 + (len / 16) * 16 + len % 16 ? 16 : 0
= 0x60 + 16 + (7 / 16) * 16 + 7 % 16 ? 16 : 0
= 0x80
其正好对齐在64边界上。
注意:-a参数只对普通文件起作用,如果要对所有或者部分或者指定的文件起作用,则要使用-A或者-x参数。
6. -A参数
genromfs -A ALIGN,PATTERN |
指定目录"."对齐在64字节边界上:
niutao@niutao:~/kernel/romfs$ genromfs -f hello.img -d hello/ -v -A 64,. |
指定所有的.c文件对其在64字节边界上:
niutao@niutao:~/kernel/romfs$ genromfs -f hello.img -d hello/ -v -A 64,*.c |
不包括匹配PATTERN的对象。也就是说在生成romfs格式映像的时候,不包括指定的源目录下的匹配PATTERN的文件或者目录。例如:
niutao@niutao:~/kernel/romfs$ ls -al hello |
文章来源: blog.csdn.net,作者:悟空胆好小,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/xushx_bigbear/article/details/12017169
- 点赞
- 收藏
- 关注作者
评论(0)