免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1111 | 回复: 0
打印 上一主题 下一主题

ROMFS文件系统分析[三]ROMFS映像文件结构 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-18 22:18 |只看该作者 |倒序浏览

                上一节(
http://blog.chinaunix.net/u2/73528/showart.php?id=1903687
)说的是romfs的超级块结构(struct romfs_super_block),下面主要介绍romfs的inode结构(struct romfs_inode)。
   众所周知,在文件系统中,我们都会提到inode节点。那么对于romfs文件系统,是否也有inode节点?如果有,那是否也向EXT2等如此庞大复杂?
对于第一个问题,我们的回答是“是”,第二个回答是“否”。romfs设计的初衷就是构建一个最小内核。为了达到目的,我们是一切从简。越简单其自身就越小,越能提高空间的利用率;越简单处理起来效率就越高。所以romfs的inode也和其超级块结构一样,非常简单:
               
               
                /* On disk inode */
struct romfs_inode {
        __be32 next;            /* low 4 bits see ROMFH_ */
        __be32 spec;
        __be32 size;
        __be32 checksum;
        char name[0];
};
初看,似乎和其超级块结构一样,都有5个域。结构本身大小也一样(都为16字节)。实际上,在生成romfs映像的工具genromfs中,就是使用一个结构(struct romfsfh)来代表这两个结构的,之所以分开,是因为其代表的对象不同。romfs_super_block代表整个romfs文件系统,而romfs_inode只代表文件。虽然两个结构一样,但个个域的含义是不一样的。下面我们一一讲解。
1. next域  该域是非常重要的一个字段。因为整个romfs映像中的文件头最少都对齐在16字节边界上,也就是说其在romfs映像文件中的偏移的低四位一定为0。所以我们正还利用这4位来做些什么。
romfs文件系统使用其低4位来表示文件类型和文件的权限,具体分配为:[0:2]共3位和起来表示文件类型,可见在romfs文件系统中,支持的文件类型有8中,具体有:
               
                #define ROMFH_HRD 0     /* 硬链接文件 */
#define ROMFH_DIR 1     /* 目录文件 */
#define ROMFH_REG 2     /* 普通文件 */
#define ROMFH_LNK 3     /* 链接文件 */
#define ROMFH_BLK 4     /* 块设备文件 */
#define ROMFH_CHR 5     /* 字符设备文件 */
#define ROMFH_SCK 6     /* 套接字文件 */
   第4位表示文件是否有可执行权限。如果其他用户具有读写执行权限,并且文件是一个目录或者普通文件,则给文件加上可执行权限。硬链接文件不具有可执行权限。将next域的低4位置0就是下一个文件在romfs中的偏移。romfs正是通过这个域将所有文件组织起来的。
   这里还有一个小小的问题。在网上看到许多关于romfs的文章,说romfs文件系统使用next域的高28位来寻址下一个文件,所以romfs文件系统支持的最大的映像为256M。还有人经过理论,使用name域的一些空间和next域联合起来,使romfs文件系统支持大于256M的文件。这个说法是完全错误的。最好的证据就是你直接拖几个五六百兆的电影,然后使用genromfs工具看其是否能生成romfs映像;如果能生成,使用mount命令挂载,看其是否挂载上;如果能挂载上,你可以使用cp命令将大于256M的电影文件拷出来,使用diff命令和原来的电影文件对比一下,看是否一样。在我的机子上,这些假设都成立。这并非偶然,我们可以从最最本质的代码角度继续证实这一点.
2. spec域   初识romfs的时候,这个域我困惑了好久,不知道它和next域表示的文件类型到底有什么联系和区别,看内核文档(Documention/filesystem/romfs.txt)的时候也是没弄明白。经过这些天的分析,现在终于弄明白了。如果你也在学习romfs文件系统,希望对你有帮助。
这个域是文件类型相关的,也就是说对于不同的文件类型,这个域表示的含义是不一样的。
(1).对于硬链接文件(next & 0xf = 0),这个域的值为其指向的文件的偏移。
(2).对于目录文件(next & 0x1 = 1),这个域指向其内第一个文件的文件头
    在romfs映像中的偏移。
(3).对于普通文件(next & 0x2 = 2),链接文件(next & 0x3 = 3)
    ,SOCKET文件(next & 0x6 = 6)和管道文件(next & 0x7 = 7),这
    个域一定为0,这一点可以从genromfs工具代码的角度证明(具体见
    dumpnode函数,我们在后面还会详细分析)。
(4).对于块设备文件(next & 0x4 = 4)和字符设备文件(next & 0x5 = 5)
   ,这个域的高16位为设备文件代表的设备的主设备号,低16位为次设备号。
3. size域   该域表示文件的大小。文件内容是16字节对齐的。如果文件的末尾不够16字节,则使用0填充.
4. checksum域和romfs_super_block结构不同的是,这个域只是文件头和文件名的校验和。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/73528/showart_1903693.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP