您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 论文-linux 文件系统分析及其系统调用发言报告
linux文件系统分析及其系统调用发言报告第5组第1页linux文件系统分析及其系统调用发言报告作者:黄苟第一部分一、文件系统上层结构整体介绍图一linux文件系统分层示意图Linux文件系统的最优秀的地方是对多种文件系统的支持。(这里的上层结构是指VFS系统和具体的文件系统,即除buffer管理系统以外的部分)为了实现这种特色,就必须有一个抽象的层次来统一描述各种文件系统,Linux中就用VFS来实现了这个抽象层;同时,各种具体的文件系统又必须有一个和VFS交互的手段,在Linux系统中,这种交互的手段是通过n个数据结构中的union结构和函数指针来实现的,这些数据结构如下:一)、VFS和具体的文件系统的连接途径zFile_system_type中:structsuper_block*(*read_super)(structsuper_block*,void*,int)在mount一个文件卷时,VFS的do_mount函数会调用read_super函数,EXT2VFSBuffersCacheInodeCacheDirectoryCache抽象层具体文件系统层缓冲管理层linux文件系统分析及其系统调用发言报告第5组第2页而read_super将找到一个未被使用的read_blocks数组项,并调用相应file_system_type的read_super函数(以上均在fs\super.c文件中)。就ext2文件系统的read_super(函数名为:ext2_read_super,在fs\ext2\super.c文件中)而言,它做了如下一些工作:首先它读入该文件卷的第一个逻辑块,该块含有相应文件卷的superblock结构,在相应VFSsuperblock项的u.ext2_sb结构中的s_sbh和s_es分别指向该缓冲区的头部和数据区。接下来,该函数将该缓冲区中的一些数据复制或经计算复制到VFSsuperblock的u.ext2_sb结构中;在做完一些检验工作以后,该函数读入文件卷组描述符所在的块并将这些缓冲区头部的指针赋值给VFSsuperblock的u.ext2_sb.s_group_desc结构,并在最后读入该文件卷的根结点。zSuper_block中Union{…}u:该结构定义了对应各文件卷的结构,如上所述,它的很多数据均在具体类型文件系统的read_super函数中被赋值,同时,do_mount函数在read_super函数返回后,会记录该文件卷安装到的结点,即对VFS中superblock的s_covered赋值。Super_operations结构:该结构中定义了对inode和superblock的各种相应操作函数的指针,ext2中其实例为ext2_sops(ext2\super.c中定义);并在其ext2_read_super函数中对其赋值(sb→s_op=&ext2_sops);zinode中1)union{…}u:定义了对应具体文件卷上inode结点的信息。2)inode_operations:该结构定义了相应文件系统中各目录和文件进行各类操作的函数指针,其第一次对应具体file_operations。3)dquot_operations:该结构定义了对相应文件系统中配额管理的各类操作的函数指针,不作分析。1)和2)将在各面作具体分析。zfile中file_operations:对相应文件系统中文件进行读、写及权限等管理的各种函数指针;在ext2中有两个实例,ext2_file_operations和ext2_dir_operations(ext2\file.c和dir.c中定义);并分别在ext2_creat,ext2_mknod和ext2_mkdir中被赋值给相应inode的i_op。linux文件系统分析及其系统调用发言报告第5组第3页二)、文件系统上层数据结构及其相关处理1、文件系统上层数据结构Linux中文件系统的数据结构均大致可以分为三个部分;第一部分是VFS中的数据结构;第二部分是具体文件系统中的数据结构;第三部分是buffer的数据结构。在李老师的讲义中已对它们作了比较透彻的阐述,所以这里不准备重述它们,只就我们对它们的代码分析作一些总结和补充。图2VFS的数据结构示意图zdirectorycache对于directorycache的操作函数在fs\dcache.c中定义,directorycache的数据结构分为三部分,即用于hash操作的directoryhash_table[],以及level1_cache[]和level2_cache[]现将directorycache的操作函数总结如下:申请释放hashlistremove_hashadd_hashlevel1_cachedcache_adddcache_add(释放旧的)level2_cachemove_to_level2move_to_level2(释放旧的)表1这里作如下简要解释:在dcache_add发现相应inode已在hash表中或move_to_level2发现相应inode已在level2_cache中,它们就会调用mnt_devmnt_devnamemnt_flagsmnt_dirnamemnt_sb...nextvfsmountvfsmntlists_devs_blocksizes_flagss_types_covered...s_mountedsuper_blockread_supernamenext...nextvfsmnttail...nextfile_system_typeInodeInodemru_vfsmnt...nextlinux文件系统分析及其系统调用发言报告第5组第4页update_lru把相应项移至链尾,否则将链头向前移动一格,并将后来链头指向的项来存放新的内容。zVFSinode及其相关数据结构对VFSinode和VFSinodehashtable的相关操作均在fs\inode.c文件中定义;对VFSmount,VFS的upserblock和file_system_type的操作均在fs\super.c文件中定义。下面把这些操作部结如下:申请释放增加VFSinodehashinsert_inode_hashremove_inodehashVFSinodeget_empty_inodeiputgrow_inodefile_system_typeregister_filesystemunregister_filesystemVFSmountadd_vfsmntremove_vfsmntVFSsuperblockread_superput_super表2这里作如下简要解释:在__iget函数中若得到一个新的freeinode会做put_last_free操作,该操作将使用相应inode放在inode链的结尾,故inode链中非空闲inode总是尽量排在后面。在get_empty_inode操作中对freeinode的搜寻也是从表头开始只搜寻链表一半的长度,若没有找到则说明freeinode过少,可能做grow_inode操作。VFS中iget和iput是两个非常重要的函数,将在后面作分析。read_super函数由do_mount调用,它试图找到相应的superblock项,如果没有找到,则返回一个未用的superblock项,VFS中的put_super函数并未真正地释放superblock项,但它会调用具体文件系统的put_super操作;就ext2系统而言,其ext2_put_super函数将释放组描述符缓冲区及其头部指针占用资源,块位图和inode位图的缓冲区以及外存超级块对应的缓冲区,并释放VFS的superblock(sb→s_dev=0);2、ext2中的数据结构及其相关处理ext2文件卷中的数据结构主要包括:superblock块、组描述符、inode等。其中文件卷的第1逻辑块放superblock信息(第0块放启动信息);接下来几块用于放组描述符;后面的将分组存放,每组包括块位图、inode位图、inodetable和文件(包括目录文件)等。ext2文件系统中可利用的资源包括块资源、inode资源,它们以组划linux文件系统分析及其系统调用发言报告第5组第5页分,并且利用块位图和inode位图来表示;同时创建一个目录或文件需要在其父目录的目录文件中增加一项,这又有一个目录文件项资源的管理。下面总结一下对这些资源的操作申请释放ext2inodeext2_new_inodeext2_free_inodeext2blockext2_new_blocksext2_free_blocksinodefileentryext2_add_entryext2_delete_entry表3其中,对于inode的资源管理在ext2\inode.c文件中定义;对于block资源的管理在ext2\balloc.c文件中定义;inodefileentry资源的管理在文件ext2\namei.c中定义。这些资源对于ext2文件系统是至关重要的,通过分析它们将对ext2资源的组织结构有一个比较清楚的认识。如果时间允许,我将在后面对这些资源的申请函数作一个比较详细的分析,否则请参见我们组发言的书面报告。在这里我还想解释一下ext2系统一个至关重要的数据结构――组描述符,它记录了每个组内资源的分布情况,组描述符所在的块在ext2文件系统中紧接着superblock的n块,在ext2_read_super函数中(fo_mount会调用,见前)将把它们读入缓冲区中并用联合结构u.ext2_sb.s_group_desc来索引。那么,给出一个inode的编号i_ino,系统将按如下方式查找其所在的位置:①所在的组:(i_ino-1)/每组inode数:group_ino组内偏移i_ino-1%每组inode数:group_shf②该组对应的组描述符所在的块:group_ino每块组数的bits表示blk_no该组对应的组描述符在块内的偏移:group_ino&(每块组数-1):blk_shf③故s_group_desc[blk_no]→b_data[blk_shf]即为组描述符记为g_desc④g_desc.bg_inode_table存放该组inode表的起始块号,故g_desc.bg_inode_table+group_shf每块inode数的bits表示即为该inode所在的块号,将该块读入,记相应缓冲区为bh.⑤bh→bdata+group_shf&(每块inode数-1)即为该inode结构项。3、文件系统上层结构的操作函数分析前一部分已经对文件系统的主要面貌作了一个介绍,这一部分将对文件系统的上层结构中几个重要的函数作一个较为细致的分析,linux文件系统分析及其系统调用发言报告第5组第6页1.__iget(fs\inode.c)功能:查找文件卷上inode对应VFS中的inode;若未找到,则为其分配一个VFS的inode。参数:sb:文件卷的VFS中的superblock结构nr:文件卷上inode的编号crossmntp:找根目录标志调用的主要函数:get_empty_indoeput_last_freeinsert_inode_hashread_inode(调用具体文件系统的read_inode)iput过程:1)在inodehash表中查找对应dev上的inode,若找到,则转到5),2)该inode在VFS中还未分配,则调用get_empty_inode函数为其在VFS中分配一个inode项,3)初始化该VFSinode,将其放到inode的链尾(put_last_free);插入inodehash表(insert_inode_hash),4)调用read_inode例程读入文件卷上inode的信息,返回该VFSinode,5)VFS中找到对应inode,判断是否为f
本文标题:论文-linux 文件系统分析及其系统调用发言报告
链接地址:https://www.777doc.com/doc-3175765 .html