上一节
/* 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结构不同的是,这个域只是文件头和文件名的校验和。