[转]romfs

1.1 什么是romfs
    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格式的映像了,挂载方法为:


[email protected]:~/kernel/romfs$ ls
hello.img
[email protected]:~/kernel/romfs$ file hello.img 
hello.img: romfs filesystem, version 1 208 bytes, named rom 49e05ac0.
[email protected]:~/kernel/romfs$ sudo mount -o loop hello.img /mnt
[email protected]:~/kernel/romfs$ cd /mnt/
[email protected]:/mnt$ ls
hello.c
[email protected]:/mnt$

可以看到使用mount命令将hello.img挂载到了/mnt目录下,其内只有一个文件。
  卸载一个已经被挂载的romfs格式映像使用umount命令。
1.5如何制作romfs 文件系统
一般我们可以使用一些工具来制作ROMFS的文件系统。制作好之后其实也就是一个二进制的文件。制作工具一般使用”genromfs“,这个工具在网上就可下载到,其源代码并不是很多,只有不到900行。
以下是genromfs工具所支持的参数:

[email protected]:~/fs-sys$ genromfs -h

genromfs 0.5.2 Usage: genromfs [OPTIONS]    -fIMAGE

Create a romfs filesystem image from a directory

-f IMAGE               Output the image into this file

-d DIRECTORY           Use this directory as source

-v                     (Too) verbose operation

-V VOLUME              Use the specified volume name

-a ALIGN               Align regular file data to ALIGN bytes

-A ALIGN,PATTERN       Align all objects matching pattern to at least ALIGN bytes

-x PATTERN             Exclude all objects matching pattern

-h                     Show this help  Report bugs to [email protected]

[email protected]:~/fs-sys$

-f IMAGE     指定输出romfs映像的名字
-d DIRECTORY 指定源目录(将该目录制作成romfs文件系统)
-v           显示详细的创建过程
-V VOLUME    指定卷标
-a ALIGN     指定普通文件的对齐边界(默认为16字节)
-A ALIGN,PATTERN 匹配参数PATTERN的对象对齐在ALIGN边界上
-x PATTERN 不包括匹配PATTERN的对象。
-h 显示帮助文档。
以下是如何制作生成一个romfs的文件系统:


[email protected]:~/fs-sys$ ls

test

[email protected]:~/fs-sys$ ls test/

test  xux  zhwen

[email protected]:~/fs-sys$ genromfs -V "xromfs" -f romfs.img -d test

[email protected]:~/fs-sys$ ls  romfs.img   test

[email protected]:~/fs-sys$ file romfs.img

romfs.img: romfs filesystem, version 1 592 bytes, named xromfs.

[email protected]:~/fs-sys$ sudo mount romfs.img /mnt -o loop

[email protected]:~/fs-sys$ ls /mnt/ test  xux  zhwen

[email protected]:~/fs-sys$ 。

2.romfs映像结构

使用genromfs生成的romfs格式映像中,文件或者目录是顺序存放,每个文件头对齐在16字节边界上,基本结构如图:

romfs映像开始16字节对应struct romfs_super_block结构体,接下来为romfs映像的卷标。上图所示情况为卷标小于16字节,如果卷标大于16字节,则顺序存放在 romfs_super_block之后,并且对齐在16字节边界上。紧随卷标之后的就是第一个文件的文件头romfs_inode结构,共16字节,之 后就是文件名,也是16字节对齐,然后才是文件内容。其中在每个文件的文件头中的前4字节(不包括低4位)为下一个文件头在romfs映像中的偏移。 romfs正是这样将整个文件组织在一起的。下面分别看romfs_super_block和romfs_inode结构。

2.1 romfs超级块结构

在linux内核中,romfs超级块结构定义在include/linux/romfs_fs.h中,源代码为:


/* On-disk "super block" */

struct romfs_super_block {
        __be32 word0;
        __be32 word1;
        __be32 size;
        __be32 checksum;
        char name[0]; /* volume name */
};

(1)word0word1

word0和word1的值是固定的,分别为"-rom"和"1fs-",是用来识别romfs文件系统的。这两个值被定义在内核中:


#define ROMSB_WORD0 __mk4(‘-‘,‘r‘,‘o‘,‘m‘)
#define ROMSB_WORD1 __mk4(‘1‘,‘f‘,‘s‘,‘-‘)

(2)size

size域表示romfs映像可访问的大小。也就是最后一个文件的结束位置(以16字节对齐),比如:


[email protected]:~/romfs$ ls -l romtest
total 4
-rw-r--r-- 1 niutao niutao 44 2009-04-08 20:15 len.c
[email protected]:~/romfs$ genromfs -f rom.img -d romtest/ -v -V niutao
0 niutao [0xffffffff, 0xffffffff] 37777777777, sz 0, at 0x0 
1 . [0x80e , 0x18aada ] 0040755, sz 0, at 0x20 
1 .. [0x80e , 0x18aac6 ] 0040755, sz 0, at 0x40 [link to 0x20 ]
1 len.c [0x80e , 0x18aadb ] 0100644, sz 44, at 0x60 
[email protected]:~/romfs$

对于上面生成的rom.img映像,在rom.img内最后一个文件为len.c,其文件头偏移为0x60,文件名为len.c(小于16字节),文件大小为44字节,由此我们可以计算出该rom.img可访问的大小为:
size = (0x60 + 16 + 16 + 44 ) / 0x10  * 0x10 + 0x10 = 0xb0
第一个16表示文件头(struct romfs_inode结构)的大小,第二个16表示文件名占用的长度。下面我们使用file命令验证计算是否正确:


[email protected]:~/romfs$ file rom.img
rom: romfs filesystem, version 1 176 bytes, named niutao.
[email protected]:~/romfs$

可以看到文件可访问大小正是b0字节(176 bytes)。当然最好还是直接查看romf.img超级结构中size的值(位于rom.img偏移0x8处):

时间: 2024-08-03 23:26:29

[转]romfs的相关文章

pixhawk编译过程

好久没有编译过PIXHAWK了,由于项目需要,又买了一个pixhawk2,由于每次编译都会出现新的问题,这次写帖子将过程记录下来. 环境:WIN10+Ubuntu16.04 64位(VMware Workstation 12 Pro虚拟机). 基本按照pixhawk的Devguide里面给的步骤,将遇到的问题和解决方法给出,希望能帮助到遇到这些问题的同学. 使用下列命令将用户加入dialout用户组: sudo usermod -a -G dialout $USER 然后,下载并运行工具链安装脚

[CentOS 7系列]磁盘格式化与挂载

在windows操作系统中,硬盘有fat32和ntfs等多种格式.在linux中同样如此.CentOS 6之前,主要是ext4.ext3和ext2等格式.在CentOS 7这个版本开始,默认的磁盘格式变成了xfs格式. [[email protected] ~]# cat /etc/filesystems xfs ext4 ext3 ext2 nodev proc nodev devpts iso9660 vfat hfs hfsplus * [[email protected] ~]# mou

与一线Linux嵌入式开发project师的对话

转:与一线Linux嵌入式开发project师的对话 陈project师一直做Linux的嵌入式开发.作为在开发一线的project师.他对非常多问题的看法可能更切合实际需求,于是,通过邮件.就嵌入式开发方面的问题,请他谈了一下自己的看法: 问:关于嵌入式开发.我们准备给同学们解说一些入门知识.从你一线开发经验来说,给我们一些建议: 陈工回答: 对于嵌入式Linux入门,假设有一定基础,可以从驱动開始:假设没有基础.我个人建议还是从应用程序開始.由于从应用程序開始是最easy的,也是 最直观的.

【转】朱兆祺带你一步一步学习嵌入式(连载)

原文网址:http://bbs.elecfans.com/jishu_357014_2_1.html#comment_top  从最初涉及嵌入式Linux开始到现在,深深的知道嵌入式的每一步学习都是举步维艰.从去年11月份开始,我就着手整理各种学习资料,希望推动嵌入式学习的前进贡献自己微不足道的一份力量.从去年到现在,将C语言的学习经验整理成<攻破C语言笔试与机试陷阱及难点>(现在仍在更新),这份资料已经在电子发烧友论坛的单片机论坛连载(http://bbs.elecfans.com/jish

SylixOS块设备驱动模型

1. 块设备简介 块设备是I/O设备中的一类,是将信息存储在固定大小的块中,每个块有自己的地址,数据块大小通常在512字节到32768字节之间.块设备的基本特征是每个块都能独立于其他块而读写.磁盘是最常见的块设备. 2. 技术实现 SylixOS实现了兼容POSIX标准的输入输出系统,SylixOS的I/O概念继承了UNIX操作系统的概念,认为一切皆为文件.本章介绍SylixOS在I/O层之下提供的块设备模型,用户驱动可以使用此标准化的设备模型来编写,这样可以对上层提供统一的.标准的设备API,

第一次生成uImage出现的问题解决

内核移植(1)首次生成uImage映象文件 1.先修改顶层Makefile,如下: ARCH                     ?= $ (SUBARCH) CROSS_COMPILE      ?= 改为: ARCH                     ?= arm CROSS_COMPILE      ?=  arm-linux- 2.执行make s3c2410_defconfig 3.make uImage,首次编译完内核用了4分钟,尾部出现如下信息: LD      arch

Linux下的编程实战【转】

一篇比较不错的文章, 降到了 makefile make , gcc编译器,GDB调试器, Linux文件系统,Linux文件API,.C语言库函数(C库函数的文件操作实际上是独立于具体的操作系统平台的),进程控制与进程通信编程 1.Linux进程 Linux进程在内存中包含三部分数据:代码段.堆栈段和数据段.代码段存放了程序的代码.代码段可以为机器中运行同一程序的数个 进程共享.堆栈段存放的是子程序(函数)的返回地址.子程序的参数及程序的局部变量.而数据段则存放程序的全局变量.常数以及动态数

linux 源代码目录结构

Linux源代码目录树结构 (2008-04-21 09:14) 分类: Linux/Unix Linux用来支持各种体系结构的源代码包含大约4500个C语言程序,存放在270个左右的子目录下,总共大约包含200万行代码,大概占用58MB磁盘空间. 源代码所有在目录:/usr/src/linux (大部分linux发行版本中) init 内核初始化代码 kernel 内核核心部分:进程.定时.程序执行.信号.模块... mm 内存处理 arch 平台相关代码 i386 IBM的PC体系结构 ke

debian下为stm32f429i-discovery编译uboot、linux内核和根文件系统

交叉编译器:arm-uclinuxeabi-2010q1 交叉编译器下载下来后解压,然后将其中bin文件夹路径加入到PATH变量中. 根据<debian下烧写stm32f429I discovery裸机程序>安装openocd. 安装genromfs,使用下面命令: sudo apt-get install genromfs 已经有人提供好脚本,只要执行几条命令即可.使用git下载文件并进行编译: git clone https://github.com/jserv/stm32f429-lin