您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 第5章 嵌入式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.1.1虚拟文件系统(VFS)5.1.2通用文件模型5.1.3Linux下的设备文件虚拟文件系统(VFS)Linux的文件系统由两层结构组成。第一层是虚拟文件系统(VFS),第二层是各种不同的具体的文件系统。VFS就是把各种具体的文件系统的公共部分抽取出来,形成一个抽象层,是系统内核的一部分。它位于用户程序和具体的文件系统之间,对用户程序提供了标准的文件系统调用接口。对具体的文件系统,它通过一系列对不同文件系统公用的函数指针来调用具体的文件系统函数,完成实际的操作。任何使用文件系统的程序必须经过这层接口来使用它。通过这样的方式,VFS就对用户屏蔽了底层文件系统实现上的细节和差异。虚拟文件系统(VFS)VFS不仅可以对具体文件系统的数据结构进行抽象,以统一的方式进行管理,还可以接受用户层的系统调用,例如:write、open、stat、link等。此外,它还支持不同文件系统之间的相互访问,接受内核其他子系统的操作请求。vfs在Linux内核中的位置如图所示。进程管理子系统内存管理子系统vfs网络子系统进程通信子系统minixExt2msdos设备缓冲设备驱动程序通用文件模型VFS的主要目的在于引入了一个通用的文件模型(commonfilemodel),这个模型的核心是4个对象类型,即超级块对象(superblockobject)索引节点对象(inodeobject)文件对象(fileobject)目录项对象(dentryobject)它们都是内核空间中的数据结构,是VFS的核心,不管各种文件系统的具体格式是什么样的,都要和VFS的通用文件模型相交互。通用文件模型1.超级块对象超级块对象是用来描述整个文件系统的信息。VFS超级块是由各种具体的文件系统在安装时建立的,只存在于内存中。(1)超级块对象结构体超级对象块由super_block结构体表示,定义在文件linux/fs.h中超级块对象通过alloc_super()函数创建并初始化。在文件系统安装时,内核会调用该函数以便从磁盘读取文件系统超级块,并且将其信息填充到内存的超级块对象中{/*描述具体文件系统整体信息的域*/kde_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;/*联合域*/}通用文件模型1.超级块对象(2)超级块对象操作超级块对象中有一个重要的域就是s_op,它指向超级块的操作函数表。超级块操作函数由super_operations结构体表示,定义在文件linux/fs.h中。{/*创建和初始化一个新的索引节点对象*/structinode*(*alloc_inode)(structsuper_block*sb);/*释放给定的索引节点*/void(*destroy_inode)(structinode*);/*从磁盘上读取索引节点*/void(*read_inode)(structinode*);/*VFS在索引节点上被修改时会调用此函数,日志文件系统执行此函数进行日志更新*/void(*dirty_inode)(structinode*);/*将给定的索引节点写入磁盘*/int(*write_inode)(structinode*,int);/*释放索引节点*/void(*put_inode)(structinode*);/*在最后一个索引节点的引用被释放时,VFS会调用此函数*/void(*drop_inode)(structinode*);/*从磁盘上删除索引节点*/void(*delete_inode)(structinode*);/*该函数在卸载文件系统时由VFS调用,用来释放超级块*/void(*put_super)(structsuper_block*);/*用给定的超级块更新磁盘上的超级块*/void(*write_super)(structsuper_block*);/*使文件系统的数据元与磁盘上的文件系统同步,wait参数指定操作是否同步*/int(*sync_fs)(structsuper_block*sb,intwait);……};通用文件模型2.索引节点对象(1)索引节点对象结构体磁盘文件设备文件特殊节点索引节点对象由inode结构体表示,定义在文件linux/fs.h中。每一个inode有一个索引节点号i_ino。在同一个文件系统中,每一个索引节点号是惟一的。Inode中还有两个设备号i_dev和i_rdev,分别代表主设备号和从设备号通用文件模型2.索引节点对象(2)索引节点对象操作与超级块对象类似,所以节点对象中也有成员“i_op”用于指向索引节点的操作函数。索引节点操作是由inode_operations定义的,这里的函数指针由文件系统实现。这里包括读者常见的mkdir、rmdir、mknod等,如下所示:{int(*create)(structinode*,structdentry*,int,structnameidata*);structdentry*(*lookup)(structinode*,structdentry*,structnamei_data*);int(*link)(structdentry*,structinode*,structdentry*);int(*unlink)(structinode*,structdentry*);int(*symlink)(structinode*,structdentry*,constchar*);int(*mkdir)(structinode*,structdentry*,int);int(*rmdir)(structinode*,structdentry*);int(*mknod)(structinode*,structdentry*,int,dev_t);int(*rename)(structinode*,structdentry*,structinode*,structdentry*);int(*readlink)(structdentry*,char__user*,int);void*(*follow_link)(structdentry*,structnameidata*);void(*put_link)(structdentry*,structnameidata*,void*);void(*truncate)(structinode*);int(*permission)(structinode*,int,structnameidata*);int(*setattr)(structdentry*,structiattr*);int(*getattr)(structvfsmount*mnt,structdentry*,structkstat*);int(*setxattr)(structdentry*,constchar*,constvoid*,size_t,int);ssize_t(*getxattr)(structdentry*,constchar*,void*,size_t);ssize_t(*listxattr)(structdentry*,char*,size_t);int(*removexattr)(structdentry*,constchar*);};通用文件模型3.目录项对象在VFS中,目录也属于文件。路径中的每个组成部分都由一个索引节点对象表示。VFS经常需要执行和目录相关的操作,VFS引入了目录项的概念。每一个文件除了有一个索引节点对象外,还有一个目录项dentry结构。dentry结构描述的是逻辑意义上的文件,描述其逻辑意义上的属性,因此目录项对象在磁盘上并没有对应的映像。目录项对象由dentry结构体表示,定义在文件linux/dcache.h中。{atomic_td_count;/*目录项引用计数*/unsignedintd_flags;/*目录项标志*/structinode*d_inode;/*与文件名相关联的索引节点*/structdentry*d_parent;/*父目录的目录项*/structlist_headd_hash;/*HASH链表*/structlist_headd_lru;/*没使用的lru链表*/structlist_headd_child;/*父目录项的子目录项形成的链表*/strcutlist_headd_suddirs;/*子目录项形成的链表*/structlist_headd_alias;/*索引节点的别名链表*/intd_mounted;/*目录项的安装点*/structqstrd_name;/*目录项名,快速查找*/unsig
本文标题:第5章 嵌入式Linux文件操作
链接地址:https://www.777doc.com/doc-3220704 .html