您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 第5.0章 嵌入式Linux文件操作
嵌入式Linux文件操作课程目标Linux中的文件系统Linux中顺序文件操作的方法Linux中随机文件操作的方法Linux中文件共享、索引节点及文件层次结构的概念Linux中标准输入输出的操作Linux中非格式化输入输出的操作Linux下文件相关的不带缓存I/O函数的使用Linux下设备文件读写方法Linux中对串口的操作本章内容5.1Linux文件系统概述5.2Linux下的I/O操作5.3Linux下对文件和目录的操作5.4嵌入式Linux串口应用开发本章小结5.1Linux文件系统概述5.1.1虚拟文件系统(VFS)5.1.2通用文件模型5.1.3Linux下的设备文件5.1.1虚拟文件系统(VFS)Linux的文件系统由两层结构组成。第一层是虚拟文件系统(VFS),第二层是各种不同的具体的文件系统。VFS就是把各种具体的文件系统的公共部分抽取出来,形成一个抽象层,是系统内核的一部分。它位于用户程序和具体的文件系统之间,对用户程序提供了标准的文件系统调用接口。对具体的文件系统,它通过一系列对不同文件系统公用的函数指针来调用具体的文件系统函数,完成实际的操作。任何使用文件系统的程序必须经过这层接口来使用它。通过这样的方式,VFS就对用户屏蔽了底层文件系统实现上的细节和差异。虚拟文件系统的作用虚拟文件系统(VFS)是linux内核和存储设备之间的抽象层,主要有以下好处。-简化了应用程序的开发:应用通过统一的系统调用访问各种存储介质。-简化了新文件系统加入内核的过程:新文件系统只要实现VFS的各个接口即可,不需要修改内核部分。65.1.1虚拟文件系统(VFS,VirtualFileSystem)VFS不仅可以对具体文件系统的数据结构进行抽象,以统一的方式进行管理,还可以接受用户层的系统调用,例如:write、open、stat、link等。此外,它还支持不同文件系统之间的相互访问,接受内核其他子系统的操作请求。vfs在Linux内核中的位置如图所示。进程管理子系统内存管理子系统vfs网络子系统进程通信子系统minixExt2msdos设备缓冲设备驱动程序5.1.2通用文件模型VFS的主要目的在于引入了一个通用的文件模型(commonfilemodel),这个模型的核心是4个对象类型,即超级块对象(superblockobject)索引节点对象(inodeobject)文件对象(fileobject)目录项对象(dentryobject)它们都是内核空间中的数据结构,是VFS的核心,不管各种文件系统的具体格式是什么样的,都要和VFS的通用文件模型相交互。5.1.2通用文件模型磁盘文件超级块对象索引节点对象目录项对象目录项对象进程1文件对象进程2文件对象进程3文件对象5.1.2通用文件模型1.超级块对象超级块对象是用来描述整个文件系统的信息。VFS超级块是由各种具体的文件系统在安装时建立的,只存在于内存中。(1)超级块对象结构体超级对象块由super_block结构体表示,定义在文件linux/fs.h中超级块对象通过alloc_super()函数创建并初始化。在文件系统安装时,内核会调用该函数以便从磁盘读取文件系统超级块,并且将其信息填充到内存的超级块对象中超级块对象结构体structsuper_block{/*描述具体文件系统整体信息的域*/kdev_ts_dev;/*包含该具体文件系统的块设备标识符对于/dev/hda1,其设备标识符为0x301*/unsignedlongs_blocksize;/*该具体文件系统中的数据块大小*/unsignedchars_blocksize_bite;/*块大小的值占用的位数*/unsignedlonglongs_maxbytes;/*文件的最大长度*/unsignedlongs_flags;/*安装标志unsignedlonga_magic;/*魔数,具体文件系统的标识*//*用于管理超级块的域*/structlist_headlist;/*指向超级块链表的指针*/structsemaphores_lock;/*锁标志位*/structrw_semaphores_umount;/*对超级块的读写是否同步*/structdentry*s_root;/*该具体文件系统的安装目录项*/unsignedchars_dirt;/*脏位,超级块是否被修改*/ints_count;/*使用计数*/atomic_ts_active;/*structlist_heads_dirty;/*已经修改的索引节点*/structlist_heads_locked_inodes;/*需要同步的索引节点的集合*/structlist_heads_files;/*被分配的文件链表*//*和具体文件系统相关联的域*/structfile_system_type;/*指向文件系统file_system_type数据结构的指针*/structsuper_operation*s_op;/*超级块操作函数的集合*/u;/*联合域*/}dev_t12Thevariousfieldsinthesuper_blockstructureare:s_list:adoubly-linkedlistofallactivesuperblocks;noteIdon‘tsay“ofallmountedfilesystems”becauseunderLinuxonecanhavemultipleinstancesofamountedfilesystemcorrespondingtoasinglesuperblock.s_dev:forfilesystemswhichrequireablocktobemountedon,i.e.forFS_REQUIRES_DEVfilesystems,thisisthei_devoftheblockdevice.Forothers(calledanonymousfilesystems)thisisanintegerMKDEV(UNNAMED_MAJOR,i)whereiisthefirstunsetbitinunnamed_dev_in_usearray,between1and255inclusive.Seefs/super.c:get_unnamed_dev()/put_unnamed_dev().Ithasbeensuggestedmanytimesthatanonymousfilesystemsshouldnotuses_devfield.s_blocksize,s_blocksize_bits:blocksizeandlog2(blocksize).s_lock:indicateswhethersuperblockiscurrentlylockedbylock_super()/unlock_super().s_dirt:setwhensuperblockischanged,andclearedwheneveritiswrittenbacktodisk.s_type:pointertostructfile_system_typeofthecorrespondingfilesystem.Filesystem’sread_super()methoddoesn‘tneedtosetitasVFSfs/super.c:read_super()setsitforyouiffs-specificread_super()succeedsandresetstoNULLifitfails.s_op:pointertosuper_operationsstructurewhichcontainsfs-specificmethodstoread/writeinodesetc.Itisthejoboffilesystem’sread_super()methodtoinitialises_opcorrectly.dq_op:diskquotaoperations.s_flags:superblockflags.s_magic:filesystem‘smagicnumber.Usedbyminixfilesystemtodifferentiatebetweenmultipleflavoursofitself.s_root:dentryofthefilesystem’sroot.Itisthejobofread_super()toreadtherootinodefromthediskandpassittod_alloc_root()toallocatethedentryandinstantiateit.Somefilesystemsspell“root”otherthan“/”andsousemoregenericd_alloc()functiontobindthedentrytoaname,e.g.pipefsmountsitselfon“pipe:”asitsownrootinsteadof“/”.s_wait:waitqueueofprocesseswaitingforsuperblocktobeunlocked.s_dirty:alistofalldirtyinodes.Recallthatifinodeisdirty(inode-i_state&I_DIRTY)thenitisonsuperblock-specificdirtylistlinkedviainode-i_list.s_files:alistofallopenfilesonthissuperblock.Usefulfordecidingwhetherfilesystemcanberemountedread-only,seefs/file_table.c:fs_may_remount_ro()whichgoesthroughsb-s_fileslistanddeniesremountingiftherearefilesopenedforwrite(file-f_mode&FMODE_WRITE)orfileswithpendingunlink(inode-i_nlink==0).s_bdev:forFS_REQUIRES_DEV,thispointstotheblock_devicestructuredescribingthedevicethefilesystemismountedon.s_mounts:alistofallvfsmountstructures,oneforeachmountedinstanceofthissuperblock.s_dquot:morediskquotastuff.Thesuperblockoperationsaredescribedinthesuper_operationsstructuredeclaredininclude/linux/fs.h:5.1.2通用文件模型1.超级块对象(2)超级块对象操作超级块对象中有一个重要的域就是s_op,它指向超级块的操作函数表。超级块操作函数由super_operations结构体表示,定义在文件linux/fs.h中。超级块对象操作structsuper_operations{/*创建和初始化一个新的索引节点对象*/structinode*(*alloc_inode)(structsuper_block*sb);/*释放给定的索引节点*/void(*destroy_inode)(structinode*);/*从磁盘上读取索引节点*/void(*read_inode)(structinode*);/*VFS在索引节点上被修改时会调用此函数,日志文件系统执行此函数进行日志更新*/void(*dirty_inode)(structinode*);/*将给定的索引节点写入磁盘*/int
本文标题:第5.0章 嵌入式Linux文件操作
链接地址:https://www.777doc.com/doc-4074100 .html