1 ext2 文件系统索引节点(inode)结构:struct ext2_inode //include/linux/ext2_fs.h
该结构描述的是一个文件在物理磁盘中的相关信息,其中的i_block数组存储的就是该文件的数据。
2 ext2 的目录项结构:struct ext2_dir_entry_2//include/linux/ext2_fs.h
目录也是一个文件,也占用一个inode,通过该inode的i_block数组就能访问但该目录的数据。目录的数据是由一定的
格式的,该格式就是由struct ext2_dir_entry_2来描述。
3 ext2 超级块结构:超级块记录一个分区的整体信息。
ext2的超级块结构为struct ext2_super_block。//include/linux/ext2_fs.h
4 ext2 的内存结构:内核需要频繁访问以上的这些结构,因此当磁盘驱动程序把相关数据从磁盘读出后,
会建立相应的内存结构。
struct ext2_sb_info:ext2在内存中的超级块结构。//include/linux/ext2_fs_sb.h
该结构中的 s_sbh,s_group_desc分别指向包含磁盘超级块和组描述符的缓冲区头部。
s_es指向包含磁盘超级块结构的内存首地址。即s_es 指向ext2_super_block;
struct ext2_inode_info:ext2在内存中的Inode结构。//include/linux/ext2.h
5 VFS 的超级块 struct super_block//include/linux/fs.h
mount一个块设备的时候,根据分区表中的信息分析该该块设备的文件系统类型,然后从 file_systems链表中找到对应的文件系统驱动程
序的文件系统对象,调用它的get_sb函数获取具体文件系统的超级块的信息ext2_super_block,然后根据这些信息初始化内存中的
ext2_sb_info及VFS超级块super_block。struct super_block
中的s_sb_info就是指向具体文件系统超级块的内存对象ext2_sb_info。
当VFS访问一个Ext2磁盘索引节点时,它会创建一个ext2_inode_info类型的索引节点描述符
static struct inode *ext2_alloc_inode(struct super_block *sb)
{
struct ext2_inode_info *ei;
ei = (struct ext2_inode_info *)kmem_cache_alloc(ext2_inode_cachep, SLAB_KERNEL);
if (!ei)
return NULL;
#ifdef CONFIG_EXT2_FS_POSIX_ACL
ei->i_acl = EXT2_ACL_NOT_CACHED;
ei->i_default_acl = EXT2_ACL_NOT_CACHED;
#endif
ei->vfs_inode.i_version = 1;
return &ei->vfs_inode;
}
出处:http://blog.csdn.net/yunsongice/archive/2010/08/17/5819484.aspx
6 VFS inode结构 struct inode
该结构用于隐藏各种具体文件结构的inode的差别,向上层提供统一的inode接口。ext2_get_inode函数读取磁盘上的inode结构,并根据磁盘上的Inode结构,初始化 VFS inode结构和ext2内存inode结构。ext2_inode_info中包含一个VFS inode成员。
7 VFS 目录项对象struct dentry
目录/文件都有相应的目录项,目录项表示目录中的条目。该结构中的d_inode指向VFS的inode结构。文件结构是通过目录项的树状结构
来描述的。例如/bin/bash,首先/对应一个dentry结构,通过该结构的d_child链表即可遍历/下的所有目录项,于是能够找到bin的目录
项,再从bin的d_child链表中找到bash的dentry,于是就找到了bash的VFS inode结构。
8 VFS的文件对象 struct file
该结构向上层提供统一的文件对象。它里面有个struct dentry成员f_dentry。