Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12245
  • 博文数量: 5
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-22 13:17
文章分类
文章存档

2009年(2)

2008年(3)

我的朋友
最近访客

分类:

2008-12-02 16:35:50


1.Romfs文件系统结构

    Romfs文件系统结构很简单,由两部分组成,超级块、文件信息。超级块占文件系统的开始32字节;接着是32字节的文件头,接着是该文件的数据。每个文件头都是32字节,16字节边缘对齐。

a.超级块:

   0~7前八个字节是romfs文件系统标示,如” -rom1fs-”;8~114字节是romfs文件系统的大小,由此理解romfs文件系统最大是4GB。接着4字节12~15checksum.接着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_startromfs文件系统数据开始指针,_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映像中的文件数据。

 

阅读(1128) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~