《2022年Linux文件系统总结 .pdf》由会员分享,可在线阅读,更多相关《2022年Linux文件系统总结 .pdf(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1第三章 Linux文件管理 z每种操作系统都有自己独特的文件系统,如MS-DOS 文件系统、UNIX 文件系统等。z文件系统包括了文件的组织结构、处理文件的 数据结构、操作文件 的方法等。zLinux 自行设计开发的的文件系统称为EXT2。zLinux 还支持多种其它操作系统的文件系统,例如 minix、ext2、hpfs、msdos、umsdos、iso、nfs、sysv、affs、ufs、efs 等达二十几种。zLinux 的虚拟文件系统VFS 屏蔽了各种文件系统的差别,为处理各种不同文件系统提供了统一的接口。3.1 Linux文件系统概论 一 Linux 文件系统的树型结构zLinux
2、 文件系统采用了多级目录的树型层次结构 管理文件。z树型结构的最上层是根目录,用 表示。在根目录之下是各层目录和文件。z在每层目录中可以包含多个文件或下一级目录。z每个目录和文件都有由多个字符组成的目录名 或文件名。z系统在运行中通过使用命令或系统调用进入任何一层目录,这时系统所处的目录称为当前目录。zLinux 使用两种方法来表示文件或目录的位置,绝对路径 和相对路径。z绝对路径 是从根目录开始依次指出各层目录的名字,它们之间用”分隔,如/usr/include。z相对路径 是从当前目录开始,指定其下层各个文件及目录的方法,如系统当前目录为/usr,bin/cc。zLinux 的一个 目录是
3、一个驻留在磁盘上的文件,称为目录文件。系统对目录文件的处理方法与一般文件相同。z目录由若干 目录项 组成,每个目录项对应目录中的一个文件。名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 28 页 -2z在一般操作系统的文件系统中,目录项由文件名 和属性、存放位置、大小、建立或修改时间、访问权限等文件控制信息 组成。zLinux 继承了 UINX,把文件名 和文件控制信息 分开管理。z文件控制信息 单独组成一个称为i 节点(inode)的结构体。inode 实质上是一个由系统管理的“目录项”。z每个文件对应一个inode,它们有唯一的编号,称为inode 号。zLinux 的目录项
4、只由两部分组成:文件名和 inode 号。二文件的类型1 普通文件计算机用户和操作系统用于存放数据、程序等信息的文件。一般都 长期地存放在外存储器(磁盘、磁带等)中。普通文件一般又分为文本文件 和二进制文件。2 目录文件是文件系统中一个目录所包含的目录项组成的文件。目录文件只允许系统进行修改。用户进程 可以读取目录文件,但 不能 对它们进行 修改。两个特殊的目录项”?”代表目录本身,”?”表示父目录。3.设备文件用于 与 I/O 设备提供连接 的一种文件,分为 字符设备文件 和块设备文件,对应于字符设备和块设备。Linux把对设备的 I/O 做为普通文件的读取/写入操作,内核提供了对设备处理和
5、对文件处理的统一接口。每一种 I/O设备对应一个设备文件,存放在/dev 目录中,如行式打印机对应/dev/lp,第一个软盘驱动器:/dev/fd0。4.管道文件主要用于 在进程间传递数据。管道是进程间传递数据的“媒介”。某进程数据写入管道的一端,另一个进程从管道另一端读取数据。Linux 对管道的操作与文件操作相同,它把管道做为文件进行处理。管道文件又称先进先出(FIFO)文件。5.链接文件又称 符号链接文件,它提供了 共享文件 的一种方法。在链接文件中不是通过文件名实现文件共享,是通过链接文件中包含的指向文件的指针来实现对文件的访问。普通用户可以建立链接文件,并通过其指针所指向的文件。使用
6、链接文件可以访问普通文件,还可以访问目录文件 和不具有普通文件实态的其它文件。它可以在不同的文件系统之间建立链接关系,名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 28 页 -3z从对文件内容处理的角度,无论是哪种类型的文件,Linux 都把它们看做是 无结构的流式文件,即把文件的内容看做是一系列有序的字符流,三文件的访问权限z为了保证文件信息的安全,Linux 设置了 文件保护机制,其中之一就是给文件都设定了一定的访问权限。z当文件被访问时,系统首先检验访问者的权限,只有与文件的访问权限相符时才允许对文件进行访问。zLinux 中的每一个文件都归某一个特定的用户 所有,而且一
7、个用户一般总是与某个用户组 相关。zLinux 对文件的访问设定了三级权限:文件所有者,与文件所有者同组的用户,其他用户。z对文件的访问主要是三种处理操作:读取、写入 和执行。z三级访问权限和三种处理操作形成了9 种情况:3.2 EXT2文件系统 zLinux 最初引进了Minix 文件系统。Minix 文件系统有较大的局限性。z1992 年 4月推出 EXT(EXTended File system)z1993 年推出了 EXT2文件系统。zEXT2已经成为 Linux 的标准文件系统。一、EXT2 文件系统的构造z文件是存储在 块设备 上的。z在块设备中文件的组织和管理是以物理块 为单位
8、的。物理块是块设备上划分的大小相同的存储区域,如磁盘的扇区。z当文件存储在块设备上时也被划分成与物理块大小相等的逻辑块。文件在存储设备中是由一系列的逻辑块序列组成的。z一个文件系统一般使用块设备上的一个独立的逻辑分区。z在文件的逻辑分区中除了表示文件内容的逻辑块(称为数据块)外,还设置了若干包含管理和控制信息的逻辑块。zEXT2文件系统 也是由 逻辑块序列 组成的。zEXT2文件系统把所使用的逻辑分区划分成块组(Block Group),并从 0 开始依次编号。z每个块组中包含若干数据块,数据块中就是目录或文件内容。z块组中包含着几个用于管理和控制的信息块:名师资料总结-精品资料欢迎下载-名师
9、精心整理-第 3 页,共 28 页 -4z超级块、组描述符表、块位图、inode 位图 和 inode 表。二 EXT2 超级块(super block)z超级块 是用来描述 EXT2文件系统整体信息 的数据结构主要描述文件系统的目录和文件的静态分布 情况,以及描述文件系统的各种组成结构的尺寸、数量等。z超级块对于文件系统的维护是至关重要的。z超级块位于 每个块组的最前面,每个块组中包含的超级块内容是相同的。z在系统运行期间,需要把超级块复制到内存的系统缓冲区内。只需把块组0 的超级块读入内存,其它块组的超级块做为备份。z在 Linux 中,EXT2超级块定义为ext2_super_block
10、结构。成员项意 义s_inodes_count inode的总数量s_blocks_count 块的总数量s_r_blocks_count 保留块的数量s_free_blocks_count 空闲块的数量s_free_inodes_count 空闲 inode 数量s_first_data_block 第一个数据块的块号s_log_block_size 逻辑块长度s_log_frag_size 片(fragment)长度s_blocks_per_group 每个块组包含的块数s_frags_per_group 每个块组包含的片(fragment)数s_inodes_per_group 每个块组
11、包含的inode 数s_mtime 安装时间s_wtime 最后一次写入时间名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 28 页 -5s_mnt_count 安装计数,每安装一次其值增1 s_max_mnt_count 安装最大数,达到此数将显示警告信息s_magic 文件系统署名,EXT2为 0 xEF53 s_state 文件系统状态s_errors 出错时文件系统的动作s_minor_rev_level 改版标志s_lastcheck 最后一次文件系统检测时间s_checkinterval 两次检测相隔的最大时间间隔s_creator_os 可以使用该文件系统的操作系统
12、的ID s_rev_level 版本标志,系统以此识别是否支持某些属性s_def_resuid 可以使用保留块的默认用户uid s_def_resgid 可以使用保留块的默认用户组gid 三内存中超级块的映像zext2_super_block结构是超级块 在磁盘中的形态。z在系统运行期间磁盘上的超级块要读入到内存,在内存建立一个 超级块的映像。z内存中的超级块映像定义为ext2_sb_info结构,名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 28 页 -6在/include/linix/ext2_fs_sb.h中定义如下:struct ext2_sb_info unsigne
13、d long s_frag_size;/*fragment片的长度,以字节为单位*/unsigned long s_frags_per_block;/*每块中 fragment 片数 */unsigned long s_inodes_per_block;/*每块中 inode 数*/unsigned long s_frags_per_group;/*每一块组中fragment 数*/unsigned long s_blocks_per_group;/*每一块组中块数 */unsigned long s_inodes_per_group;/*每一块组中 inode 数*/unsigned lon
14、g s_itb_per_group;/*每一块组中inod 表占用的块数 */unsigned long s_db_per_group;/*每一块组中描述符占用的块数*/unsigned long s_desc_per_block;/*一块中组描述符数*/unsigned long s_groups_count;/*整个文件系统中的块组数*/struct buffer_ head*s_sbh;/*指向内存中包含超级块的缓冲区的指针*/struct ext2_super_block*s_es;/*指向缓冲区中超级块的指针*/struct buffer_head*s_group_desc;/*指向
15、缓冲区组描述符数组的指针*/struct buffer_head*s_group_desc;/*指向缓冲区组描述符数组的指针*/unsigned short s_loaded_inode_bitmaps;/*装入缓冲区的inode 位图块数 */unsigned short s_loaded_block_bitmaps;/*装入缓冲区的块位图块数*/unsigned long s_inode_bitmap_numberEXT2_MAX_GROUP_LOADED;/*inode位图数组 */struct buffer_head*s_inode_bitmapEXT2_MAX_GROUP_LOADE
16、D;/*inode位图指针数组 */unsigned long s_block_bitmap_numberEXT2_MAX_GROUP_LOADED;/*块位图数组 */struct buffer_head*s_block_bitmapEXT2_MAX_GROUP_LOADED;/*块位图指针数组 */int s_rename_lock;/*重命名时的锁信号量*/struct wait_queue*s_rename_wait;/*重命名时的等待队列指针*/unsigned long s_mount_opt;/*安装选项 */unsigned short s_resuid;/*可以使用保留块的用
17、户uid*/unsigned short s_resgid;/*可以使用保留块的用户组gid*/unsigned short s_mount_state;/*超级用户使用的安装选项*/unsigned short s_pad;/*填充*/名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 28 页 -7 int s_addr_per_block_bits;/*块地址(编号)的位(bit)数*/int s_desc_per_block_bits;/*块描述符的位(bit)数*/int s_inode_size;/*inode长度*/int s_first_ino;/*第一个 inode
18、 号*/;四组描述符组描述符 表的每个表项是一个组描述符。组描述符是一个ext2_group_desc结构,用来 描述一个 块组的有关信息,定义在/include/linix/ext2_fs.h 中:struct ext2_group_desc _u32 bg_block_bitmap;/*本组中块位图的位置*/_u32 bg_inode_bitmap;/*本组中 inode 位图的位置 */_u32 bg_inode_table;/*本组中 inode 表的位 */_u16 bg_free_blocks_count;/*本组中空闲块数 */_u16 bg_free_inodes_count;
19、/*本组中空闲inode 数*/_u16 bg_used_dirs_count;/*本组中所含目录数*/_u16 bg_pad;/*填充*/_u32 bg_reserved3;/*保留*/;zLinux 的组描述符 为 32 字节,z每一个 块组 有一个 组描述符。z所有的 组描述符集中在一起依次存放,形成 组描述符表。z描述符表中的组描述符的顺序与块组在磁盘上的顺序对应。z组描述符可能占用多个物理块。z具有相同内容的 组描述符表 放在 每个块组 中做为备份,名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 28 页 -8五块位图zEXT2文件系统中 数据块的使用状况 由块位图 来
20、描述。z每个块组 都有 一个块位图,位于组描述符表之后,用来描述本块组中 数据块的使用状况。z块位图的每 一位(bit)表示 一个数据块 的使用情况,为 1 表示对应的数据块已占用,为 0 表示数据块 空闲。z各位(bit)的顺序与块组中数据块的顺序一致。z块位图一般占用 一个逻辑块。zEXT2块位图 装入一个 高速缓存 中。z高速缓存容纳EXT2_MAX_GROUP_LOAD个块位图,该值目前定义为8。z系统并采用类似LRU的算法管理高速缓存。z在超级块的内存映像ext2_sb_info结构中,s_loaded_block_bitmaps表示装入高速缓存的块位图的数目。s_block_bit
21、map_number存放装入高速缓存的块位图的块组号,s_block_bitmap 数组中是相应块位图在高速缓存的地址。3.3 EXT2 的 inode和目录结构 一 EXT2 文件系统 inode 结构z在 EXT2文件系统中 inode 是基本的构件,它表示文件系统树型结构的节点。每一个节点是一个文件或目录。zEXT2文件系统中的 每个文件 由一个 inode 描述,且 只能由一个 inode 描述。z在 Linux 中 EXT2文件系统的 inode 定义为 struct ext2_inode。该定义在/include/linux/ext2_fs.h中。名师资料总结-精品资料欢迎下载-名
22、师精心整理-第 8 页,共 28 页 -9成员项意义i_mode 文件类型和访问权限i_uid 文件所有者用户uid i_size 文件大小,以字节为单位i_atime 文件最后一次访问时间i_ctime 该 inode 最后修改时间i_mtime 文件内容最后修改时间i_dtime 文件删除时间i_gid 文件的用户组标识gid i_links_count 文件的链接数i_blocks 文件所占块数(每块512 字节)i_flags 文件标志(属性)i_block 数据块指针数组i_version 文件版本 (用于 NFS)i_file_acl 文件访问控制链表(Linux2.0以后版本不再
23、使用)i_dir_acl 目录访问控制链表(Linux2.0以后版本不再使用)i_faddr Fragment 地址i_frag 每块中的片数i_fsize 片大小i_pad1 填充 i_reserved2 保留 i_mode 指定了 inode 文件的 类型和访问权限:S_IFREG普通文件S_IFBLK块设备文件S_IFDIR目录文件S_IFCHR字符设备文件FIFO文件S_IFLNK符号链接文件S_ISUID访问权限设定为用户idS_ISGID访问权限设定为用户组id i_block指针数组,指向文件内容所在的数据块。i_block数组共有 15 个指针,前12 个指针直接指向数据块称为
24、直接块指针。第 13 个元素是 一次间接块指针。第 14 个元素是 二次间接块指针。第 15 个元素是 三次间接块指针。名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 28 页 -10 i_flags是文件属性 的标志:EXT2_SECRM_FL完全删除 标志。EXT2_UNRM_FL 可恢复删除 标志。EXT2_COMPR_FL文件压缩 标志。EXT2_SYNC_FL 同步更新 标志。EXT2_IMMUTABLE_FL不允许修改 标志。EXT2_APPEND_FL 追加写 标志。EXT2_NODUMP_FL 非转储标志。EXT2_NOATIME_FL不变更文件访问时间atime
25、 二 EXT2 inode 在内存中的映像zEXT2文件系统的 inode 与文件 一起存放 在外存,z在系统运行时,把EXT2的 inode 写入内存建立映像,z该内存映像定义为ext2_inode_info 结构,在 include/linux/ext2_fs_i.h中,如下所示:struct ext2_inode_info _u32 i_data15;/*数据块指针数组 */_u32i_flags;/*文件标志(属性)*/_u32i_faddr;/*Fragment(片)地址 */_u8 i _frag_no;/*Fragment(片)号 */名师资料总结-精品资料欢迎下载-名师精心整理
26、-第 10 页,共 28 页 -11 _u8 i _frag_size;/*Fragment(片)大小 */_u16i_osync;/*同步标志*/_u32 i_file_acl;/*文件访问控制链表*/_u32i_dir_acl;/*目录访问控制链表*/_u32i_dtime;/*文件删除时间 */_u32i_version;/*文件版本*/_u32 i_block_group;/*inode 所在块组号*/_u32 i_next_alloc_block;/*下一个要分配的块 */_u32 i_next_alloc_goal;/*下一个要分配的对象*_u32 i_prealloc_block
27、;*预留块首地址 */_u32 i_prealloc_count;/*预留计数 */int i_new_inode:1;/*标志,是否为新分配的inode */;三 inode 表和 inode 位图z一个块组中 所有文件的 inode 形成了 inode 表。z表项的序号就是inode 号。zinode 表存放 在块组中所有数据块之前。zinode 表在块组中要占用几个逻辑块由超级块中s_inodes_per_group给出。zinode 位图 反映了 inode 表中各个表项的使用情况,它的一位(bit)表示 inode 表的一个表项,若某位为1 表示对应的表项已占用,为0 表示表项空闲。
28、zinode 位图也装入一个高速缓存中。z在 ext2_sb_info结构中,s_loaded_inode_bitmaps:装入高速缓存的inode 位图的 数目。s_block_inode_number:装入高速缓存的inode 位图的 块组号,s_inode_bitmap:相应 inode 位图 在高速缓存中的 地址。z两个数组大小EXT2_MAX_GROUP_LOAD(当前值为8)。四 EXT2 的目录结构z在 EXT2中,目录是一个特殊的文件,称为目录文件。z在目录文件中,目录项是ext2_dir_entry结构体,它们前后连接成一个类似链表的形式。struct ext2_dir_en
29、try _u32 inode;/*inode 号*/_u16 rec_len;/*目录项长度 */_u16 name_len;/*文件名长度 */名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 28 页 -12 char nameEXT2_NAME_LEN;/*文件名 */;其中:#define EXT2_NAME_LEN 255 3.4 虚拟文件系统VFS zLinux 除了自己的文件系统EXT2,还支 持多种其它操作系统的文件系统。zLinux 的虚拟文件系统VFS 屏蔽了各种文件系统的差别,为处理各种不同文件系统提供了统一的接口。z在 VFS 管理下,Linux 不但能够
30、读写各种不同的文件系统,而且还实现了这些文件系统相互之间的访问。一、VFS 的工作原理zLinux 支持的各种实际文件系统,如 EXT2、minix、msdos、sysv 等称为 物理文件系统。z不同物理文件系统具有不同的组织结构和不同的处理方式。z操作系统必须把各种不同的物理文件系统的所有特性进行抽象,建立起一个面向各种物理文件系统的转换机制,通过这个转换机制,把各种不同物理文件系统转换为一个具有统一共性的虚拟文件系统。这种转换机制称为虚拟文件系统转换VFS(Virtual Filesystem Switch)zVFS 实际上向 Linux 内核和进程提供了一个处理各种物理文件系统的公共接口
31、,通过这个接口使得不同的物理文件系统看来都是相同的。名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 28 页 -13zVFS 并不是一种实际的文件系统zEXT2 等物理文件系统 是存在于 外存空间的,而 VFS 仅存在于 内存zVFS 是在系统启动时建立,在系统关闭时消失的,物理文件系统 是长期存在于外存。z在 VFS 中包含着向物理文件系统转换的一系列数据结构,如VFS 超级块、VFS 的 inode 等,各种操作函数的转换入口。二文件系统的注册zLinux 支持的文件系统必须注册 后才能使用,文件系统不再使用时则予以注销。z向系统内核注册有两种方式,一种是在系统引导 时在
32、VFS 中注册,在系统关闭时注销。另一种是把文件系统做为可装卸模块,在安装时 在 VFS 中注册,并在模块卸载时注销。z文件系统的注册由VFS 中的 注册链表 进行管理。z每个注册的文件系统登记在file_system_type结构体 中,zfile_system_type结构体组成一个链表,称为注册链表,z链表的表头由全局变量file_system给出。struct file_system_type struct super_block*(*read_super)(struct super_block*,void*,int);const char*name;int requires_dev;
33、struct file_system_type*next;对于 EXT2文件系统:static struct file_system_type ext2_fs_type=ext2_read_super,ext2,1,NULL;z文件系统的注册是通过内核提供的文件系统初始化函数实现的:init_ext2_fs()ext2 文件系统初始化函数;名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 28 页 -14init_minix_fs()minix 文件系统初始化函数;init_msdos_fs()msdos文件系统初始化函数;init_proc_fs()proc 文件系统初始化函数
34、;init_sysv_fs()sysv 文件系统初始化函数;z在文件系统初始化函数中,把注册结构体 做为参数,调用由内核提供的 注册函数 register_filesystem()z例如,EXT2文件系统的初始化函数:int init_ext2_fs(void)return register_filesystem(&ext2_fs_type);int register_filesystem(struct file_system_type*fs)/*参数 fs 是注册结构体首址*/struct file_system_type*tmp;if(!fs)return-EINVAL;/*不支持该文件系
35、统,出错返回*/if(fs-next)return-EBUSY;/*文件系统已注册,返回 */tmp=&file_systems;/*得到注册链表首址 */while(*tmp)/*从注册链表首开始遍历*/if(strcmp(*tmp)-name,fs-name)=0)return-EBUSY;/*文件系统已注册,返回*/tmp=&(*tmp)-next;/*查看下一个注册结构体*/*tmp=fs;/*把要注册的文件系统的注册结构体加到链表*/return 0;/*注册成功,返回0*/三、文件系统的安装z文件系统除在VFS中注册,还必须 安装 到系统中。z要安装的文件系统必须已经存在于外存磁盘
36、空间上,每个文件系统占用一个独立的磁盘分区,并且具有各自的树型层次结构。z由于 EXT2是 Linux 的标准文件系统,所以系统把EXT2文件系统 的磁盘分区做为系统的根文件系统名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 28 页 -15zEXT2以外的文件系统则安装在根文件系统下的某个目录下,成为系统树型结构中的一个分枝。zLinux 文件系统的树型层次结构中用于安装其它文件系统的目录称为 安装点 或安装目录。z已安装的文件系统用一个vfsmount 结构进行描述:struct vfsmount kdev_t mnt_dev;/*文件系统所在设备的设备号*/char*mn
37、t_devname;/*设备名,如/dev/dsk/hda1*/char*mnt_dirname;/*安装点的目录名 */unsigned int mnt_flags;/*设备标志*/struct semaphore mnt_sem;/*对设备 I/O 操作时的信号量 */struct super_block*mnt_sb;/*指向超级块的指针*/struct file*mnt_quotasMAXQUOTAS;/*指向配额文件的指针数组*/time_t mnt_iexpMAXQUOTAS;/*inode 分配允许延迟时间*/time_t mnt_bexpMAXQUOTAS;/*数据块分配允许延
38、迟时间 */struct vfsmount*mnt_next;/*指向链表中下一结构*/;名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 28 页 -16 3.5 VFS 的超级块 VFS是由在内存中建立的一系列数据结构 组成的,主要有VFS超级块、VFSinode 和文件操作函数指针 等组成。通过VFS可以转换到各种不同的物理文件系统,所以VFS的数据结构必须兼容于各种文件系统的相应数据结构。一、VFS 超级块z超级块 是文件系统中描述整体组织和结构的信息体。zVFS 把不同文件系统中的整体组织和结构信息,进行抽象后形成了兼顾不同文件系统的统一的 超级块结构。z把 VFS中建
39、立的超级块称为VFS超级块。zVFS超级块是在文件系统安装时由系统在内存 中建立的。zLinux 中对于 每种 已安装的文件系统,在内存中都有与其对应的 VFS超级块。zVFS超级块中的数据主要来自该文件系统的超级块。zVFS超级块是一个定义为super_block结构。struct super_block kdev_t s_dev;/*物理文件系统所在设备的设备号*/unsigned long s_blocksize;/*文件系统物理组织的块大小,字节为单位*/unsigned char s_blocksize_bits;/*块长度值的位(bit)数*/unsigned char s_loc
40、k;/*锁定标志,若置位则拒绝其它进程对该超级块的访问*/unsigned char s_rd_only;/*只读标志,若置位,则该超级块禁写*/名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 28 页 -17 unsigned char s_dirt;/*修改标志,若置位表示该超级块已修改过*/struct file_system_type*s_type;/*指向文件系统file_system_type结构体*/struct super_operations*s_op;/*指向该文件系统的超级块操作函数的集合*/struct dquot_operations*dq_op;/*
41、指向该文件系统的限额操作函数的集合*/unsigned long s_flags;/*超级块标志 */unsigned long s_magic;/*署名,该文件系统特有的标志数*/unsigned long s_time;/*时间信息 */struct inode*s_covered;/*指向该文件系统安装目录inode 的指针 */struct inode*s_mounted;/*指向该文件系统第一个inode 的指针 */struct wait_queue*s_wait;/*指向该超级块等待队列的指针*/union /*联合体,其成员项是各种文件系统超级块的内存映像*/struct mi
42、nix_sb_info minix_sb;struct ext_sb_info ext_sb;struct ext2_sb_info ext2_sb;struct hpfs_sb_info hpfs_sb;struct msdos_sb_info msdos_sb;struct isofs_sb_info isofs_sb;struct nfs_sb_info nfs_sb;struct xiafs_sb_info xiafs_sb;struct sysv_sb_info sysv_sb;struct affs_sb_info affs_sb;struct ufs_sb_info ufs_sb
43、;void*generic_sbp;u;(1)文件系统的 组织信息如设备号 s_dev、块大小 s_blocksize、块位数 s_blocksize_bits、文件系统署名s_magic 等。(2)文件系统的 注册和安装信息,s_type 指向注册链表中该文件系统的file_system_type结构体。s_covered 是指向文件系统树型结构中安装目录 inode 的指针,s_mounted 是安装到 Linux 中的文件系统的 根目录 inode 的指针。(3)超级块的 属性信息,名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 28 页 -18超级块的各种标志,如超级块
44、标志s_flags、锁定标志 s_lock、禁写标志 s_rd_only、修改标志s_dirt等。(4)文件系统 特有的信息由联合体u 的各个成员项 表示。它们是各种文件系统的超级块在内存中的映像,如EXT2 文件系统的ext2_sb_info结构。u 表示的是各种文件系统的个性信息。二、VFS 超级块的操作z在系统运行中,VFS 要建立、撤消 一些 VFSinode,还要 对 VFS超级块 进行一些必要的 操作。这些操作由一系列 操作函数 实现。z不同文件系统 的组织和结构不同,完成同样功能的操作函数的代码不同,每种文件系统都有自己的操作函数。z如何在对某文件系统进行操作时就能调用该文件系统
45、的操作函数呢?这是由VFS接口通过转换实现的。z在 VFS超级块中 s_op 是一个指向 super_operations结构 的指针,super_operations中包含着 一系列的操作函数指针,即这些 操作函数的入口地址。z每种文件系统VFS超级块指向的super_operations中记载的是该文件系统的操作函数的入口地址。只需使用它们各自的超级块成员项s_op,以统一的函数调用形式:s_op-read_inode()就可以分别调用它们各自的读 inode 操作函数。struct super_operations void(*read_inode)(struct inode*);int
46、(*notify_change)(struct inode*,struct iattr*);void(*write_inode)(struct inode*);void(*put_inode)(struct inode*);void(*put_super)(struct super_block*);void(*write_super)(struct super_block*);void(*statfs)(struct super_block*,struct statfs*,int);int(*remount_fs)(struct super_block*,int*,char*);1 read_
47、inode(inode)当 VFS在系统中 建立一个新的VFSinode 时,则调用该函数从外存中读取一个文件或目录的inode 的相关值来填充它。2 notify_change(inode,iattr)该函数主要是对NFS(网络文件系统)执行的操作。当inode 的属性改变 时,调用该函数 通知外部的计算机系统。iattr指向 iattr结构体,其中 记载着变更的数据。3write_inode(inode)名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 28 页 -19当 VFSinode 的内容发生变动 时,调用此函数把它写回到外存中对应的inode 中。4put_inod
48、e(inode)调用该函数 撤消某个 VFSinode。5put_super(sb)当某个 文件系统卸载 时,调用该函数 撤消其超级块,同时释放与超级块有关的高速缓存空间。然后,把该超级块的成员项s_dev 置 0,表明该超级块已撤消。以后建立新超级块时可以再次使用它。6write_super(sb)当 VFS超级块的内容发生变化时,调用该函数 把 VFS超级块的内容写回外存中保存。7statfs(sb,statsbuf,bufsize)调用该函数可以 得到文件系统的某些统计信息时。参数 statsbuf指向一个statfs结构体,函数执行中把文件系统的统计信息填入该结构体中。当函数返回时,从
49、statfs结构体中可以有关统计信息。statfs结构与硬件有关.8.remount_fs(sb,flags,data)在重新安装文件系统时需要调用该函数。3.6 VFS 的 inode 一、VFS inode 结构zLinux 以 EXT2做为基本的文件系统,所以它的虚拟文件系统VFS中也设置了 inode 结构z为了区别物理文件系统的inode,把 VFS中的 inode 称为 VFSinode。z文件系统的inode 在外存中 并且是 长期存在 的,VFSinode 在内存中,它仅在需要时才 建立,不再需要时撤消。z文件系统的inode 是静态 的,而 VFS的 inode 是一种 动态
50、 结构。struct inode kdev_t i_dev;/*主设备号*/unsigned long i_ino;/*外存的 inode 号*/umode_t i_mode;/*文件类型和访问权限*/nlink_t i_nlink;/*该文件的链接数 */uid_t i_uid;/*文件所有者的用户标识*/gid_t i_gid;/*文件的用户组标识*/kdev_t i_rdev;/*次设备号 */off_t i_size;/*文件长度,以字节为单位*/time_t i_atime;/*文件最后一次访问时间*/time_t i_mtime;/*文件最后一次修改时间*/名师资料总结-精品资料欢