文件系统的分类:
基于磁盘的文件系统(ext2,ext3),虚拟文件系统(如proc文件系统,cat /proc/version 可以看到系统版本信息,但是ls -l /proc/version 发现这个文件的大小为0),网络文件系统(如NFS)
通用文件模型
VFS提供了一种结构模型,包含了一个强大的文件系统缩影具备的所有组件。VFS与ext2很类似,它们之间转化很容易,几乎不费时。
inode节点中包括(1) 描述元数据的文件(2)保存时间文件内容的数据段(或者指向数据的指针)
但是inode中并不包括文件的名字,这是为什么呢?(继续学习)
文件系统中的重要结构体分析
File数据结构(strcut file)
Struct file
{
struct dentry *f_dentry; /*指向相关目录项的指针*/
struct vfsmount *f_vfsmnt; /*指向VFS安装点的指针*/
struct file_operations *f_op; /*指向文件操作表的指针*/
..............
};
Denty 目录项数据结构(与目录的区别,目录是特殊的文件,位于存储介质中)
Struct dentry
{
atomic_t d_count; /*目录项引用计数器 */
unsigned int d_flags; /*目录项标志 */
struct inode * d_inode; /*与文件名关联的索引节点 */
struct dentry * d_parent; /*父目录的目录项 */
...............
}
struct file_operations(文件操作统一接口)
Inode对象
Struct inode(vfs层次,位于内存中,最后读取存储介质的索引结点填充)
{
unsigned long i_ino; /*索引节点号*/
struct inode_operations *i_op; /*索引节点的操作*/
struct super_block *i_sb; /*指向该文件系统超级块的指针 */
atomic_t i_count;//当前使用该节点的进程数。计数为0,表明该节点可丢弃或被重新使用
Union//联合体,与具体的文件系统相关
............
}
struct vfsmount
{
struct vfsmount *mnt_parent; /* fs we are mounted on */
struct dentry *mnt_mountpoint; /* dentry of mountpoint */
struct dentry *mnt_root; /* root of the mounted tree */
struct super_block *mnt_sb; /* pointer to superblock */
............
}
Super_block超级快结构(描述文件系统的信息):
Strcut super_block
{
kdev_t s_dev;//包含该具体文件系统的块设备标识符。例如,对于/dev/hda1,其设备标识符为 0x301
struct dentry *s_root; /*指向该具体文件系统安装目录的目录项。*/
struct super_operations *s_op; //指向某个特定的具体文件系统的用于超级块操作的函数集合
Union//联合体,与具体的某个文件系统相关
........
}
代表进程的数据结构task_struct:
Struct task_struct
{
Struct fs_struct fs//进程文件系统相关信息
Struct files_struct file//打开文件的信息
...........
}
Struct fs_struct
{
.............
};
全两个个dentry项分别是该文件系统根目录,当前目录的目录项
struct files_struct
{
struct file * fd_array[32];/* 文件对象指针的初始化数组*/
..............
};
打开文件的fid就是数组fd_array的索引
最后所有数据结构的关系