Linux VFS(虚拟文件系统)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

ConfidentialLinuxVFSActionsMicroelectronicsCo.,Ltd.柯锦玲2009-11-19ConfidentialAgendaLinux读写文件的5种模式通用文件模型对象组成313234Open一个设备节点文件33VFSopen文件的步骤35一些关于vfs的问题ConfidentialConfidentialVFS框图dentrycachesSuperblockInodecachesConfidentialVFS类Unix操作系统总共有5种标准文件类型:1).普通文件2).目录文件3).符合链接文件4).设备文件5).管道文件VFS的其中一个重要作用是将对设备驱动的访问,转换为对文件的访问(设备节点文件)Confidential通用文件模型对象-超级块对象超级块对象(superblockobject):存放已安装文件系统的有关信息.通常对应于放在磁盘上的文件系统控制块(filesystemcontrolblock),每挂载一个文件系统对应一个超级块对象structsuper_block{…unsignedlongs_blocksize;//块设备的最写读取单位,如512字节conststructsuper_operations*s_op;structdentry*s_root;structlist_heads_inodes;/*allinodes*/structlist_heads_dirty;/*dirtyinodes*/structblock_device*s_bdev;void*s_fs_info;/*Filesystemprivateinfo*/};structsuper_operations{structinode*(*alloc_inode)(structsuper_block*sb);//分配inode索引节点void(*dirty_inode)(structinode*);//标志索引节点为脏int(*write_inode)(structinode*,int);//写索引节点,对于fat文件系统是写目录项void(*write_super)(structsuper_block*);//写超级块,对于fat文件系统是fat的簇表信息}Confidential通用文件模型对象-索引节点对象(inode)索引节点对象(inodeobject):存放关于具体文件的一般信息.通常对应于存放在磁盘上的文件控制块(filecontrolblock).每个索引节点对象都有一个索引节点号,这个节点号唯一地标识文件系统中的文件索引节点对文件(或者目录)是唯一的,并且随文件的存在而存在.structinode{dev_ti_rdev;//若为设备文件的索引节点,记录主次设备号loff_ti_size;//文件大小structtimespeci_atime;//文件访问时间structtimespeci_mtime;structtimespeci_ctime;unsignedinti_blkbits;blkcnt_ti_blocks;umode_ti_mode;//访问模式,如读,写conststructinode_operations*i_op;//索引节点文件操作conststructfile_operations*i_fop;//文件对象(fileobject)操作structaddress_space*i_mapping;//高速缓存的核心数据结构体,对块设备的读写操作都放在该结构体里面}Confidential索引节点对象(inode)如对于fat格式,inode节点会有目录或者文件的首簇号位置.structinode_operations{int(*create)(structinode*,structdentry*,int,structnameidata*);//创建文件int(*mkdir)(structinode*,structdentry*,int);//创建目录int(*rmdir)(structinode*,structdentry*);//删除目录int(*mknod)(structinode*,structdentry*,int,dev_t);//创建节点文件int(*rename)(structinode*,structdentry*,//重命名文件structdentry*(*lookup)(structinode*,structdentry*,structnameidata*);//查找目录}//高速缓存的核心数据结构体,对块设备的读写操作都放在该结构体里面structaddress_space{conststructaddress_space_operations*a_ops;/*methods*/}//高速缓存的核心操作方法放在索引节点里面structaddress_space_operations{int(*writepage)(structpage*page,structwriteback_control*wbc);int(*readpage)(structfile*,structpage*);ssize_t(*direct_IO)(int,structkiocb*,conststructiovec*iov,loff_toffset,unsignedlongnr_segs);}Confidential通用文件模型对象-文件对象(fileobject)文件对象(fileobject)存放打开文件与进程之间进行交互的有关信息.这类信息仅当进程访问文件期间存在于内核内存中.如文件的读取或者写位置,以及读写同步等操作.structfile{conststructfile_operations*f_op;mode_tf_mode;//打开文件的模式loff_tf_pos;//文件的读写位置structaddress_space*f_mapping;//指向inode节点的页高速缓存操作}structfile_operations{loff_t(*llseek)(structfile*,loff_t,int);ssize_t(*read)(structfile*,char__user*,size_t,loff_t*);ssize_t(*write)(structfile*,constchar__user*,size_t,loff_t*);int(*mmap)(structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*readdir)(structfile*,void*,filldir_t);//readdir扫描目录中的文件或者子目录};Confidential通用文件模型对象-目录项对象(dentry)目录项对象(dentryobject)存放目录项(也就是文件的名称)与对应文件进行链接的有关信息.每个磁盘文件系统都以自己特有的方式将该类信息存在磁盘上.structdentry{structinode*d_inode;structqstrd_name;//文件名比较长时候,需要动态分配空间,放在这里unsignedchard_iname[DNAME_INLINE_LEN_MIN];//文件名长度小于36放在这里};ConfidentialConfidentialVFSOpen函数流程图sys_open获得当前任务根目录或者当前目录的目录项对象分离出第一个目录名字查找所需要的dentry是否在caches里面?新分配一个dentry,填充其名字成员调用dentry-d_inode-i_op-lookup,进行查找(具体文件系统的查找目录方法)读取磁盘扇区,查找目录项,需要superblock查找所需的inode是否在caches中新分配一个inode是否有下一个目录?调用具体文件系统是否是否填充inode中的i_op,i_fop,i_mapping-a_op,并且设置dentry-d_inode=inode;lookup返回建立fd号与structfile*f的关系sys_open,返回fd号填充填充structfile*f结构体open(“/home/fatfile.txt”,O_RDWR|O_CREAT,0660);ConfidentialVFSOpen文件的步骤1)fd=open(“/home/fatfile.txt”,O_RDWR|O_CREAT,0660);c库函数open会执行系统调用2)进入内核空间sys_open得到空的fd号(sys_open会返回fd号,当返回值小于0时候出错,等于0是一个合法的fd号.)得到一个空的structfile结构体structfile*filp=get_empty_filp();通过当前任务的task_struct(current)获取根目录(‘/’的structdentry结构体通过dentry获取索引节点d_inode,d_inode-i_op-lookup操作Confidential3)查找dentryobject首先使用hash查找方法搜索要查找的目录项对象是否在内存中__d_lookup(nd-path.dentry,name);若存在则返回.不用查找调用具体的文件系统(读取磁盘扇区)去查找若不存在分配新的目录项对象(dentryobject)将文件名保存在目录项对象(dentryobject)d_iname成员中(如保存目录名home)调用d_inode-i_op-lookup进行具体文件系统的操作Confidential4)具体文件系统的搜索目录staticstructdentry*ext2_lookup(structinode*dir,structdentry*dentry,structnameidata*nd)搜索具体的文件系统,当搜索到具体的文件或者目录(需要通过超级块对象找到目录等在磁盘的具体位置)时候,分配新的索引节点结构体(inode)inode=new_inode(sb);填充inode结构体操作if(S_ISREG(inode-i_mode)){//是文件inode-i_op=&ext2_file_inode_operations;conststructaddress_space_operationsext2_aops大部分文件系统的具体读写操作都在这里面,它负责激活从物理磁盘到页高速缓存的I/O数据传输inode-i_mapping-a_ops=&ext2_aops;inode-i_fop=&ext2_file_operations;}Confidentialelseif(S_ISDIR(inode-i_mode)){//是目录inode-i_op=&ext2_dir_inode_operations;inode-i_fop=&ext2_dir_operations;inode-i_mapping-a_ops=&ext2_aops;}elseif(S_ISLNK(inode-i_mode)){//是链接文件if(ext2_inode_is_fast_symlink(inode))inode-i_op=&ext2_fast_symlink_inode_operations;else{inode-i_op=&ext2_symlink_inode_operations;if(test_opt(inode-i_sb,NOBH))inode-i_mapping-a_ops=&ext2_nobh_aops;elseinode-i_mappin

1 / 44
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功