收藏 分销(赏)

操作系统---文件系统.pptx

上传人:人****来 文档编号:4290106 上传时间:2024-09-03 格式:PPTX 页数:40 大小:262.79KB
下载 相关 举报
操作系统---文件系统.pptx_第1页
第1页 / 共40页
操作系统---文件系统.pptx_第2页
第2页 / 共40页
操作系统---文件系统.pptx_第3页
第3页 / 共40页
操作系统---文件系统.pptx_第4页
第4页 / 共40页
操作系统---文件系统.pptx_第5页
第5页 / 共40页
点击查看更多>>
资源描述

1、10.3.1 VFS10.3.1 VFS一、一、VFSVFS的作用的作用Linux支持许多种文件系统,如EXT2,VFAT等 VFS(Virtual File System)是内核软件层。VFS提供了统一编程接口同时隐藏了不同文件系统的差别。可扩展性、可维护性好 进程描述符中有下面两个与文件系统相关的成员:struct fs_struct*fs;struct files_struct*files;二、进程描述符中与文件系统相关的成员二、进程描述符中与文件系统相关的成员fs_struct结构描述进程进行文件访问时用到的当前目录、根目录等信息。struct fs_struct struct den

2、try*root,*pwd;.;files_struct结构描述被进进程程打打开开使使用用的的文文件件信信息息,fd成员指向一个struct file*数组,数组中的已使用项指向某个正被打开的文件对象,数组中的索引称之为文件号,用户程序就是使用文件号对打开的文件进行操作。struct files_struct struct file*fd;struct file*fd_arrayNR_OPEN_DEFAULT;/*NR_OPEN_DEFAULT为32*/.;内核中与进程使用文件有关数据结构:rootpwddentrydentrydentryFiles_operationsinodeInode_

3、operationsinodeinodefd_arrayfiles_structfiletask_structfs_structSuper_block三、三、VFSVFS的文件模型的文件模型 VFS的关键是根据不同的文件系统抽象出了一个通用的文件模型。通用的文件模型由四种数据对象组成:文文件件对对象象:存储一个打开的文件和一个进程的关联信息。只要文件一直打开,这个对象就一直存在。文件对象用struct file结构描述:struct file struct list_head f_list;struct dentry *f_dentry;/*指向与文件对象关 联的dentry对象*/struc

4、t vfsmount *f_vfsmnt;struct file_operations *f_op;/*文件对象的 操作集合*/unsigned int f_flags;/*使用open()时 设定的标志*/mode_t f_mode;loff_t f_pos;/*对文件读写操作的 当前位置*/struct fown_struct f_owner;.;inodeinode对对象象:存储某个文件的信息。通常对应磁盘文件系统的文件控制块。struct inode struct list_headi_hash;struct list_headi_dentry;unsigned longi_ino;/

5、*inode号*/kdev_t i_dev;/*所在设备的设备号*/umode_t i_mode;/*表示文件类型及权限*/uid_t i_uid;/*文件拥有者的用户ID*/gid_t i_gid;/*用户所在组的ID*/loff_t i_size;/*文件大小*/time_t i_atime;/*最近一次的访问时间*/time_t i_mtime;/*最近一次的修改时间*/time_t i_ctime;/*文件创建时间*/struct inode_operations*i_op;struct super_block *i_sb;/*所属的超级块*/struct address_space*

6、i_mapping;.;dentry对象:dentry对象主要是描述文件名及其相关联的inode信息。struct dentry struct inode*d_inode;/*该dentry对象所属的inode*/struct dentry*d_parent;/*父目录*/struct list_head d_hash;/*hash值相同的dentry链表*/struct list_head d_subdirs;/*子目录链表*/struct qstr d_name;/*文件名及附属信息*/struct dentry_operations *d_op;.;超级块对象:存储已安装文件系统的信息,

7、通常对应磁盘文件系统的文件系统控制块。struct super_block struct list_head s_list;/*将所有的超级块链接起来*/kdev_ts_dev;/*所在设备号*/unsigned long s_blocksize;/*该文件系统磁盘块的 大小(字节数)*/unsigned chars_blocksize_bits;struct file_system_type*s_type;/*文件系统类型*/struct super_operations*s_op;struct dentry*s_root;/*根目录dentry对象*/struct list_head s_

8、dirty;/*修改过的 inodes队列*/.;各对象之间的联系各对象之间的联系inode对象与文件 一对一dentry对象与inode对象 多对一(硬连接)文件对象与dentry对象 多对一VFS各种对象之间的联系四、文件系统的注册与安装四、文件系统的注册与安装 1.1.文件系统驱动的注册文件系统驱动的注册 每一种文件系统使用前必须先注册一个file_system_type对象。这可以看成是文件系统driver的加载。struct file_system_type const char*name;/*文件类型名*/struct super_block*(*read_super)(struc

9、t super_block*,void*,int);struct file_system_type*next;.;file_systems2.2.文件系统分区的安装文件系统分区的安装#mount#mount t ext2/dev/hda3/mnt t ext2/dev/hda3/mnt 内核与之对应的系统调用是sys_mount()。该函数根据文件系统类型得到相应的file_system_type 对象,再取得该分区的超级块对象。建立分区根目录与安装点目录的关系。五、五、各种对象的操作接口各种对象的操作接口1.面向对象的接口 每个对象都有一套函数操作集合,属于不同文件系统的对象的操作也就不同,

10、VFS只负责提供接口(操作集合)。以超级块对象为例。超级块对象有一个struct super_operations*s_op成员struct super_operations void(*read_inode)(struct inode*);void(*write_inode)(struct inode*,int);void(*put_inode)(struct inode*);void(*delete_inode)(struct inode*);void(*put_super)(struct super_block*);void(*write_super)(struct super_bloc

11、k*);.;当 第 一 次 mount一 个 ext2分 区 时 会 调 用ext2_read_super(),该函数有一条语句sb-s_op=&ext2_sops。将操作表地址置入超级块对象相应域。ext2_sops变量的成员值如下:static struct super_operations ext2_sops=read_inode:ext2_read_inode,write_inode:ext2_write_inode,put_inode:ext2_put_inode,delete_inode:ext2_delete_inode,put_super:ext2_put_super,writ

12、e_super:ext2_write_super,.;而 当 第 一 次 mount一 个 fat分 区 时 会 调 用fat_read_super(),该函数有一条语句sb-s_op=&fat_sops。fat_sops变量的成员值如下:static struct super_operations fat_sops=write_inode:fat_write_inode,delete_inode:fat_delete_inode,put_super:fat_put_super,.;super_operations就是一个抽象类抽象类,它只提供接口但并没有实现这些接口,而ext2_sops、f

13、at_sops则是具体类具体类,实现相应的接口。其它几个接口与此类似。2.struct super_operations2.struct super_operationsread_inode 该函数从已mount的文件系统读入一 个inode的信息。该inode对象的 inode号已事先被初始化。write_inode:把 inode信 息 写 入 磁 盘 put_inode:inode对象从inode cache移去 时调用该函数delete_inode:删除inode时调用put_super:umount时VFS释放超级块时调用write_super:希望把VFS超级块写入磁盘 时调用3.

14、struct inode_operations3.struct inode_operationsstruct inode_operations int(*create)(struct inode*,struct dentry*,int);struct dentry*(*lookup)(struct inode*,struct dentry*);int(*link)(struct dentry*,struct inode*,struct dentry*);int(*unlink)(struct inode*,struct dentry*);int(*symlink)(struct inode*,

15、struct dentry*,const char*);.;create:第一个参数必须是目录型文件对应的inode。create在该目录下创建一个文件.lookup:第一个参数是目录型文件对应的inode。lookup()在该目录下查找一个文件。4.struct file_operations4.struct file_operations struct file_operations loff_t(*llseek)(struct file*,loff_t,int);ssize_t(*read)(struct file*,char*,size_t,loff_t*);ssize_t(*writ

16、e)(struct file*,const char*,size_t,loff_t*);int(*mmap)(struct file*,struct vm_area_struct*);int(*open)(struct inode*,struct file*);.;这些操作与系统调用接口相对应5.struct address_space_operations5.struct address_space_operations struct address_space_operations int(*writepage)(struct page*);int(*readpage)(struct fi

17、le*,struct page*);.;6.struct dentry_operations6.struct dentry_operationsstruct dentry_operations int(*d_revalidate)(struct dentry*,int);int(*d_hash)(struct dentry*,struct qstr*);int(*d_compare)(struct dentry*,struct qstr*,struct qstr*);.;d_revalidate:检查dentry cache中的dentry是 否是最新的。d_hash:计算文件名的hash值。

18、第一个参数是父目 录,第二个参数包含了预设的文件名。d_compare:比较一个目录下的两个文件名是否相 等。如文件名是否区分大小写。10.3.2 EXT210.3.2 EXT2文件系统文件系统一、一、EXT2EXT2在磁盘上的物理布局在磁盘上的物理布局EXT2分区的第一个磁盘块用于引导,其余的部分被分成组。所有的组大小相同并且顺序存放,所以由组的序号可以确定组在磁盘上的位置。组的构成:组的构成:(1)文件系统的超级块(2)所有组的描述符(3)数据块的位图(4)inode位图(5)inode表(6)数据块 每个组都有一份文件系统的超级块和所有组的描述信息的拷贝正常情况下内核只使用第0组的信息。

19、当组0的拷贝遭到损坏时便可根据其它组的拷贝恢复数据块位图的大小为一个块,位图的每一位顺序对应组中的一个块,0表示可用,1表示已用。inode表用来存放文件及目录的inode数据。inode位图用来表示对应的inode表的空间是否已被占用。二、二、主要的数据结构及基本操作主要的数据结构及基本操作1 1 超级块超级块struct ext2_super_block _u32 s_inodes_count;/*inode的总数*/_u32 s_blocks_count;/*块的总数*/_u32 s_free_blocks_count;/*空闲块的总数*/_u32 s_free_inodes_count

20、;/*空闲inode的总数*/_u32 s_first_data_block;/*第一个数据块*/_u32 s_log_block_size;/*块的大小*/_u32 s_blocks_per_group;/*每组的块数*/_u32 s_inodes_per_group;/*每组的inode数*/_u32 s_mtime;/*安装的时间*/_u32 s_wtime;/*写的时间*/_u16 s_mnt_count;/*安装的次数*/.;2 2组描述符组描述符 每 个 组 都 有 自 己 的 描 述 符,内 核 用 结 构ext2_group_desc描述。struct ext2_group_d

21、esc _u32 bg_block_bitmap;/*本组数据块位图所在块号*/_u32 bg_inode_bitmap;/*本组inode位图所在块号*/_u32 bg_inode_table;/*本组inode表的起始块号*/_u16 bg_free_blocks_count;/*组中空闲块的数目*/_u16 bg_free_inodes_count;/*组中空闲inode数目*/_u16 bg_used_dirs_count;/*组中目录的数目*/;3 3inodeinode EXT2文件系统inode大小为128字节,inode在inode表中依次存放struct ext2_inode

22、 _u16 i_mode;_u16 i_uid;/*拥有者的用户ID*/_u32 i_size;/*文件大小*/_u32 i_atime;/*最近一次访问时间*/_u32 i_ctime;/*创建时间*/_u32 i_mtime;/*最近一次修改时间*/_u16 i_gid;/*文件的组ID*/_u32 i_blocks;/*分配给该文件的磁盘块的数目*/_u32 i_blockEXT2_N_BLOCKS;/*指向磁盘块的指针*/.;i_mode 包含了文件的类型信息和文件的访问权限。文件的类型有常规文件、目录、字符设备、块设备等。i_blockEXT2_N_BLOCKS 一般用于放置文件的数

23、据所在的磁盘块编号,EXT2_N_BLOCKS的缺省值为15。不同类型文件的不同类型文件的i_block 的含义不同的含义不同(a a)设备文件)设备文件 用ext2_inode就足以包含所有信息,不需要另外的数据块。(b b)目录)目录 数据块包含了所有属于这个目录的文件信息。数据块的数据项是个ext2_dir_entry_2结构,用来描述属于这个目录的文件。struct ext2_dir_entry_2 _u32inode;/*inode号*/_u16rec_len;/*本项所占的长度*/_u8name_len;/*文件名长度*/_u8file_type;/*文件类型*/charnameE

24、XT2_NAME_LEN;/*文件名*/;目录的各项在数据块中依次放置。(c)(c)常规文件常规文件 数据在磁盘上并不一定连续,需要保存各个磁盘块号。i_block的前12项可看成一级指针,直接存放文件数据所在的磁盘块号。第13项是个二级指针,第14、15项分别是三级指针和四级指针这种方法保证了大量的小文件访问效率高同时又支持大文件4 4 一些操作一些操作已知已知inodeinode号号,读,读inodeinode信息信息 因为每组的inode数目固定,所以很容易计算出该文件属于那个组并且得到在组中inode表的下标,继而可得到ext2_inode信息查找文件查找文件 以/home/temp.

25、c为例。根目录的inode号总为2,因此可以得到根目录的ext2_inode信息,再从i_block指向的数据块查找是否有ext2_dir_entry_2项的名字等于home,如果有,则同时得到了home的inode号。重复上述过程,则可以判定是否有/home/temp.c存在。读取文件某个位置的数据。读取文件某个位置的数据。给定的位置是相对于文件而不是相对于磁盘的,因此需要根据该位置计算出它在i_block中的下标,得到在磁盘上的位置。三、三、磁盘块的分配与释放磁盘块的分配与释放磁盘块的释放磁盘块的释放 主要工作是修改块位图和 涉及块的统计变量。磁盘块的分配磁盘块的分配先试图与上次分配给文件

26、的块连续。如果不行,则试图在附近32个块的范围内分配。还不行的话再本组内向前找八个连续空闲的块。若还不满足则任何空闲的块均可以。还不满足的话则到其它的组中去寻找。目的目的 文件尽可能地连续分配使文件访问时 间变短10.3.3 10.3.3 主要文件系统系统调用处理流程主要文件系统系统调用处理流程一一 、文件的文件的open()open()操作操作 open()函数最终会调用内核的sys_open()第一个参数是打开文件的路径名 第二个参数文件的访问标志(1)用get_unused_fd()在current-files-fd所指向的文件对象指针数组中查找一个未使用文件号,存储在局部变量fd中。(

27、2)调用filp_open()函数,工作主要分成两步:第一步:调用open_namei()函数,找到目标结点(可以是文件、目录)所对应的dentry对象,与dentry对象相对应的inode对象此时也应该在物理内存中第二步:调用dentry_open()函数,该函数申请一个file对象空间,然后初始化该对象,其中的一步使file对象的f_dentry指向已获得的dentry对象。(3)调用fd_install()函数将文件对象装入当前进程的打开文件表:current-files-fdfd=file;然后返回文件号fd最重要的步骤是open_namei()完成的。函数的执行过程如下:a.确定从哪

28、一个dentry对象出发进行路径解析。根据指定文件路径名是相对路径还是绝对路径从current中得到相应的dentry对象。b.调用path_walk()函数进行路径解析 该函数执行一个循环,每一循环都是得到一个dentry对象,该对象对应文件路径的一个子路径。每次循环的具体过程如下:b.1 如果子路径是“.”表示当前目录,则应该进行下一次循环。b.2 如果子路径是“.”表示父目录,则要看当前dentry对象的情况。若当前entry对象已经是本进程的根目录,这时应保持不变,直接进行下一次循环;若当前dentry对象与父目录在同一设备上,则dentry对象的d_parent成员即为所求若当前de

29、ntry对象为所在设备的根节点,它的上一层必然是另一个设备,此时应把dentry对象改成安装点的dentry对象再从头执行b.2。b.3 调用cache_lookup()函数查找子路径对应的dentry是否已经在dentry cache中,如果有,则返回。b.4 此时应该到磁盘上寻找,先申请dentry对象空间存放即将查找的信息,然后调用real_lookup()函数,该函数将调用父目录inode对象的i_op-lookup()方法。lookup()方法是特定于文件系统的,ext2的lookup方法是ext2_lookup()函数,它首先从磁盘读入dentry对象信息,包括dentry对象对应

30、的inode号。然后再查找相应的inode对象是否在inode cache中,如果不在,申请一个inode对象空间再从磁盘读入信息。最后,让dentry对象的d_inode成员指向该inode对象。b.5 已经找到子路径的dentry对象。但还有两种情况值得考虑,一是该dentry对象是一个安装点,这种情况下要推进到所安装设备的根节点。另一情况是该dentry对象是一个连接(link),这种情况下要推进到连接目标二、二、文件的文件的readread()操作()操作1 1 页缓冲(页缓冲(page cachepage cache)为了减少I/O操作的次数Linux在读写文件时采用了页缓冲的机制在

31、内核中文件被看成由页面组成,对文件的读写首先要经过页缓冲。每个文件的所有页面由一个struct address_space 结构管理,struct inode结构中的i_mapping成员即起这个作用。struct address_space struct list_head clean_pages;struct list_head dirty_pages;struct address_space_operations*a_ops;/*操作方法 .;struct address_space_operations int(*writepage)(struct page*);int(*readpa

32、ge)(struct file*,struct page*);.;页面被链入全局hash表page_hash_table中以加快页面的查找速度。2read()的实现 read()在内核中的对应函数为sys_read()。(1)根据文件号调用函数fget()找到相应的文件对象file。(2)检查file-f_mode是否允许读为了提高性能,读操作采用了预读机制(3)调用file-f_op-read()函数执行读的操作。对于大部分文件系统实际是generic_file_read()函数。该函数根据文件位置和要读出的长度确定 相应的页面,然后再检查该页面是否在page cache中存在,如果不存在,就要调用inode结 点的i_mapping-a_ops-readpage()方法将其从 磁盘读入.不同磁盘文件系统的readpage方法不 同,ext2文件系统相应的函数为ext2_readpage

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 通信科技 > 操作系统相关

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服