磁盘文件系统(Linux使用的文件系统、UNIX家族文件系统、MS文件系统、CD-ROM等DVD文件系统、其他有专利权的文件系统等等。)
网络文件系统(NFS、CIFS等等。)
特殊文件系统
3、通用文件模型 common file model
!内核负责把一组合适的指针分配给与每个打开文件相关的file变量,然后负责调用针对每个具体文件系统的函数。
超级块对象(superblock object):存放已安装文件系统的有关信息。对基于磁盘的文件系统,这类对象通常对应于存放在磁盘上的文件系统控制块(filesystem control block)。
索引节点对象(inode object):存放关于具体文件的一般信息。对基于磁盘的文件系统,这类对象通常对应于存放在磁盘上的文件控制块(file control block)。每个索引节点对象都有一个索引节点号,这个节点号唯一的标识文件系统中的文件。
文件对象(file object):存放打开文件与进程之间进行交互的有关信息。这类信息仅当进程访问文件期间存在于内核内存中。
目录项对象(dentry object):存放目录项与对应文件进行链接的有关信息。每个磁盘文件系统都以自己特有的方式将这类信息存在磁盘中。
4、VFS所处理的系统调用(三类)
普通文件、目录文件、符号链接文件的系统调用
设备文件、管道文件的系统调用
套接字系统调用
二、VFS的数据结构
1、超级块对象、索引节点对象、文件对象、目录项对象
2、目录项高速缓存
a.一个处于正在使用、未使用或负状态的目录项对象的集合
所有“未使用”目录项对象都存放在一个“最近最少使用LRU”双向链表中。
b.一个散列表,从中能够快速获取与给定的文件名和目录名对应的目录项对象。同样,如果访问的对象不在目录项高速缓存中,则散列函数返回一个空值。
三、文件系统类型
四、文件系统处理
1、system`s root filesystem: 由内核在引导阶段直接安装,并拥有系统初始化脚本以及最基本的系统程序。
2、进程的根目录是与“/”路径相对应的目录。缺省情况下,进程的根目录与系统根文件系统的根目录一致(更准确的说,与进程的命名空间中的根文件系统的根目录一致)。
a.进程的命名空间:每个进程可拥有自己的已安装文件系统树。
b.文件系统安装(vfsmount数据结构)
c.安装普通文件系统
d.安装根文件系统
安装根文件系统分为两个阶段:
1、内核安装特殊rootfs文件系统,该文件系统仅提供一个作为初始安装点的空目录;
2、内核在空目录上安装实际根文件系统。
e.卸载文件系统(sys_umount())
五、路径名查找
path_lookup()->link_path_walk()
特别注意的是,父路径名查找及符号链接查找。
六、VFS系统调用的实现
七、文件加锁
劝告锁:只有在访问文件之前其他进程合作检查锁的存在时,锁才起作用。(POSIX标准规定的fcntl()系统调用)
共享读锁与独占写锁。
Linux文件加锁:劝告锁、强制锁、共享模式强制锁、租借锁;
linux文件系统调用:fcntl()、flock()、lockf();
Linux文件锁数据结构:file_lock
FL_FLOCK锁:与一个文件对象相关联
FL_POSIX锁:与一个进程和一个索引节点相关联