分类:
2008-12-02 16:35:50
1.Romfs文件系统结构
Romfs文件系统结构很简单,由两部分组成,超级块、文件信息。超级块占文件系统的开始32字节;接着是32字节的文件头,接着是该文件的数据。每个文件头都是32字节,16字节边缘对齐。
a.超级块:
0~7前八个字节是romfs文件系统标示,如” -rom1fs-”;8~11共4字节是romfs文件系统的大小,由此理解romfs文件系统最大是4GB。接着4字节12~15是checksum.接着16个字节16~31是卷名,卷名是以空字符结束的字符串,可在生成romfs文件系统时指定。
b.文件信息
文件信息由32的字节文件头和文件数据组成。文件头组成如下:4字节下一文件头偏移量,4字节spec.info,4字节文件大小,4字节checkshum,16字节文件名。
每个文件头32个字节长,对齐于16字节边界。文件头前4字节是下一个文件头的偏移量和文件模式信息。把4字节的最低4位置为0既是下一个文件头偏移量。文件头偏移量是从文件系统开始偏移。低4位是文件模式信息,0~3位指示文件类型,第4位指示该文件是否可执行。文件类型如下:
值 |
文件类型 |
Spec.info意义 |
0 |
硬链接(hard link) |
link destination [file header] |
1 |
目录 |
该目录下第一个文件头偏移量 |
2 |
一般文件 |
无意义,全0 |
3 |
符号连接(symbolic link) |
无意义 |
4 |
块设备 |
16位主设备好和16位次设备号。 |
5 |
字符设备 |
16位主设备好和16位次设备号。 |
6 |
套接字文件 |
无意义 |
7 |
管道文件 |
无意义 |
c.简单例子
下面是一个romfs文件系统的开始部分内容。
前8字节‘2D 72 6F 6D 31 66 73 26’ 即是romfs文件系统标示”-romfs-”。‘00 00 52 40’是文件系统大小,即21056字节。‘A0 30 35 C9’是checksum。接下来16字节卷名‘52 4F 4D 64 69 73 6B 00 。。。’,即”ROMdisk”。接下来的32字节就是第一个文件头。‘00 00 00 49 00 00 00 20 00 00 00 00 D1 FF FF 97 2E 00 00 …’. ’00 00 00 49’是下一文件偏移量,即‘00 00 00 40’是下一个文件头的位置;低4位是9即表示本文件是目录,是可以执行的。接下来的4字节’00 00 00 20’,是目录的第一个文件头位置,即20h,指向了本身。接下来的4字节文件程度‘00 00 00 00’,表示该文件程度是0.接下来16字节文件名‘2E 00 00 00…’,文件名为”.”。下一文件头在40h,即’00 00 00 60 00 00 00 20 00 00 00 00 D1 D1 FF 80 2E 2E 00 00 …’。前4字节’00 00 00 60’表示该文件是一个硬件链接,下一个文件头在60h。硬件链接指向的文件头在‘00 00 00 20’,文件大小是0,文件名是“..”。60h偏移量的文件头信息‘00 00 4D 2A 00 00 00 00 00 00 4C 9C 36 99 F4 C5 64 65 71 75 65 00 00 …’。表示下一个文件头偏移量4D20h,当前文件是可执行文件,文件类型是一般文件;文件大小是19612字节;文件名是“deque”。
2.制作romfs文件系统映像
genromfs是制作romfs文件系统映像的工具。把需要制作映像的文件放在一个目录下,如romfs目录下。执行命令:genromfs –v –V “ROMdisk” –f romfs.img –d ./romfs。-f指定生成的镜像名,-d指定需要生成镜像的目录名。
3.Romfs文件系统测试
可以把romfs文件系统镜像链接到c代码中,然后在程序中直接操作romfs文件中的数据。把镜像文件链接成.o文件。ld –r –b binary romfs.img –o romfs.o. romf.o引出符号_binary_romfs_img_start和_binary_romfs_img_end,这两个符号是字符数组类型,_binary_romfs_img_start是romfs文件系统数据开始指针,_binary_romfs_img_end是结束指针。通过这个两个符号就可以对文件系统数据进行操作。例如以下代码
extern D_INT8 _binary_romfs_img_start[];
extern D_INT8 _binary_romfs_img_end[];
/**根据文件名返回该文件的文件头在文件系统中的偏移量**/
D_INT8 *srv_get_romfs_file_head(D_INT8* filename, D_UINT8* start_head, D_UINT16 len, D_UINT32 os)
{
D_UINT32 offset=0;
D_UINT32 tmp;
D_UINT16 i;
offset = os;
while( _binary_romfs_img_start+offset < _binary_romfs_img_end )
{
//printf("filename=%s, curr=%s\n", filename,start_head+offset+16);
if( len == strlen(start_head+offset+16) && memcmp(filename, start_head+offset+16, len) == 0 )
return start_head+offset;
tmp = 0;
for(i=0; i< 4; i++)
{
tmp <<= 8;
tmp += start_head[offset+i];
}
offset = tmp;
offset &= 0xfffffff0;
if( offset == 0 )
break;
}
return NULL;
}
把romfs.o文件和相应的代码编译,通过_binary_romfs_img_start就可以读取romfs映像中的文件数据。