Chinaunix首页 | 论坛 | 博客
  • 博客访问: 966135
  • 博文数量: 113
  • 博客积分: 7235
  • 博客等级: 少将
  • 技术积分: 2101
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-14 11:24
文章分类

全部博文(113)

文章存档

2013年(7)

2012年(5)

2011年(6)

2010年(8)

2009年(15)

2008年(72)

分类: LINUX

2009-04-18 22:18:05

上一节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结构不同的是,这个域只是文件头和文件名的校验和。
阅读(2427) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~