志杨 發表於 2012-12-3 11:16:09

UNIX文件系统的分析和比较深入认识

小生想从源码的角度解释一下Unix的文件系统。(前天因为不能发在首页所以重发,为什么有3天的限制呢,真是的哦) <br />首先一个文件在没有被打开的情况下,需要什么贮存在磁盘呢? <br />一般而言,需要的是: <br />1,一个目录项 <br />2,一个磁盘Inode项 <br />3,磁盘上的n块(n可为0) <br />目录项是一个结构,最重要的元素一个为名字,一个为指向inode结构的指针。另外目录的执行权是为了把文件名转换为Inode而存在的,具体的操作函数为namei。(大家可参阅具体的源码) <br />Inode项也是一个结构,v7实现如下 <br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode6"> <br />struct dinode <br />{ <br />unsigned short di_mode; /* mode and type of file */ <br />short di_nlink; /* number of links to file */ <br />short di_uid; /* owner's user id */ <br />short di_gid; /* owner's group id */ <br />off_t di_size; /* number of bytes in file */ <br />char di_addr; /* disk block addresses */ <br />time_t di_atime; /* time last accessed */ <br />time_t di_mtime; /* time last modified */ <br />time_t di_ctime; /* time created */ <br />}; <br /></div><br />元素所表示的内容相关的注释都已经说明了,不过小生还是介绍一下具体的内容 <br />di_mode说明文件的权限和类型 <br />di_nlink说明文件的链接数 <br />di_uid文件的用户,di_gid文件的组 <br />di_size逻辑上文件的大小(以字节计数) <br />di_addr文件所占用的磁盘块的地址 <br />3个时间表示访问,修改和创建时间 <br />磁盘块没什么好说的,具体实现可能512字节一块 <br />当引用一个文件时(并非打开一个文件)可能需要的如下: <br />1,一个内存Inode项 <br />内存inode项的v7实现可能如下: <br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode7"> <br />struct inode <br />{ <br />Char i_flag; <br />char i_count; /* reference count */ <br />dev_t i_dev; /* device where inode resides */ <br />ino_t i_number; /* i number, 1-to-1 with device address */ <br />unsigned short i_mode; <br />short i_nlink; /* directory entries */ <br />short i_uid; /* owner */ <br />short i_gid; /* group of owner */ <br />off_t i_size; /* size of file */ <br />union { <br />struct { <br />daddr_t i_addr; /* if normal file/directory */ <br />daddr_t i_lastr; /* last logical block read (for read-ahead) */ <br />}; <br />struct { <br />daddr_t i_rdev; /* i_addr */ <br />struct group i_group; /* multiplexor group file */ <br />}; <br />} i_un; <br />}; <br /></div><br />基本的内容和磁盘的一样,多出了一些内容,最重要的是多出了i_count用以记录引用次数 <br />当一个文件被打开时需要的内容如下: <br />1, 用户u区中的u_ofile数组中的一项 <br />2, 文件表中的一项 <br />u_ofile存放的是指向具体的file结构中的一项的指针,所谓的文件描述符就是u_ofile数组的下标 <br />文件表v7的实现如下: <br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode8"> <br />struct file <br />{ <br />char f_flag; <br />char f_count; /* reference count */ <br />struct inode *f_inode; /* pointer to inode structure */ <br />union { <br />off_t f_offset; /* read/write character pointer */ <br />struct chan *f_chan; /* mpx channel pointer */ <br />} f_un; <br />}; <br /></div><br />文件表最初似乎是为了共享偏移量(f_offset)而设计的,因为有注释就不多赘叙了,正如大家所知道的,用dup复制一个文件描述符和再次打开一个文件是不一样,具体的差别就是f_count的值。实际上大家可以自己思考一下所有的文件打开关闭,link和unlink等等文件操作(我想这是非常有益,不过大家不必真的去参阅源码,只要自己想想是怎么回事就行,unix源码水平极高,如果真的全部看懂需要很多时间)。 <br />另外鉴于要不发布要不烂掉的原则,我将本人昨天晚上写的源码发布。 <br />源码是find命令的简单实现,直接的参数是-name, -user, -group,具体用法如下 <br />Find 目录(文件)列表 可选的参数 <br />源码的水平并不高,而且实现也不是很好,不过我想初学c的读者还是能得到一定的帮助的, <br />如果有高手觉得哪里需要修改的,请注明 <br /><br />小生想从源码的角度解释一下Unix的文件系统。(前天因为不能发在首页所以重发,为什么有3天的限制呢,真是的哦) <br />首先一个文件在没有被打开的情况下,需要什么贮存在磁盘呢? <br />一般而言,需要的是: <br />1,一个目录项 <br />2,一个磁盘Inode项 <br />3,磁盘上的n块(n可为0) <br />目录项是一个结构,最重要的元素一个为名字,一个为指向inode结构的指针。另外目录的执行权是为了把文件名转换为Inode而存在的,具体的操作函数为namei。(大家可参阅具体的源码) <br />Inode项也是一个结构,v7实现如下 <br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode9"> <br />struct dinode <br />{ <br />unsigned short di_mode; /* mode and type of file */ <br />short di_nlink; /* number of links to file */ <br />short di_uid; /* owner's user id */ <br />short di_gid; /* owner's group id */ <br />off_t di_size; /* number of bytes in file */ <br />char di_addr; /* disk block addresses */ <br />time_t di_atime; /* time last accessed */ <br />time_t di_mtime; /* time last modified */ <br />time_t di_ctime; /* time created */ <br />}; <br /></div><br />元素所表示的内容相关的注释都已经说明了,不过小生还是介绍一下具体的内容 <br />di_mode说明文件的权限和类型 <br />di_nlink说明文件的链接数 <br />di_uid文件的用户,di_gid文件的组 <br />di_size逻辑上文件的大小(以字节计数) <br />di_addr文件所占用的磁盘块的地址 <br />3个时间表示访问,修改和创建时间 <br />磁盘块没什么好说的,具体实现可能512字节一块 <br />当引用一个文件时(并非打开一个文件)可能需要的如下: <br />1, 一个内存Inode项 <br />内存inode项的v7实现可能如下: <br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode10"> <br />struct inode <br />{ <br />Char i_flag; <br />char i_count; /* reference count */ <br />dev_t i_dev; /* device where inode resides */ <br />ino_t i_number; /* i number, 1-to-1 with device address */ <br />unsigned short i_mode; <br />short i_nlink; /* directory entries */ <br />short i_uid; /* owner */ <br />short i_gid; /* group of owner */ <br />off_t i_size; /* size of file */ <br />union { <br />struct { <br />daddr_t i_addr; /* if normal file/directory */ <br />daddr_t i_lastr; /* last logical block read (for read-ahead) */ <br />}; <br />struct { <br />daddr_t i_rdev; /* i_addr */ <br />struct group i_group; /* multiplexor group file */ <br />}; <br />} i_un; <br />}; <br /></div><br />基本的内容和磁盘的一样,多出了一些内容,最重要的是多出了i_count用以记录引用次数 <br />当一个文件被打开时需要的内容如下: <br />1,用户u区中的u_ofile数组中的一项 <br />2,文件表中的一项 <br />u_ofile存放的是指向具体的file结构中的一项的指针,所谓的文件描述符就是u_ofile数组的下标 <br />文件表v7的实现如下: <br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode11"> <br />struct file <br />{ <br />char f_flag; <br />char f_count; /* reference count */ <br />struct inode *f_inode; /* pointer to inode structure */ <br />union { <br />off_t f_offset; /* read/write character pointer */ <br />struct chan *f_chan; /* mpx channel pointer */ <br />} f_un; <br />}; <br /></div><br />文件表最初似乎是为了共享偏移量(f_offset)而设计的,因为有注释就不多赘叙了,正如大家所知道的,用dup复制一个文件描述符和再次打开一个文件是不一样,具体的差别就是f_count的值。实际上大家可以自己思考一下所有的文件打开关闭,link和unlink等等文件操作(我想这是非常有益,不过大家不必真的去参阅源码,只要自己想想是怎么回事就行,unix源码水平极高,如果真的全部看懂需要很多时间)。 <br />另外鉴于要不发布要不烂掉的原则,我将本人昨天晚上写的源码发布。 <br />源码是find命令的简单实现,直接的参数是-name, -user, -group,具体用法如下 <br />Find 目录(文件)列表 可选的参数 <br />源码的水平并不高,而且实现也不是很好,不过我想初学c的读者还是能得到一定的帮助的, <br />如果有高手觉得哪里需要修改的,请注明 <br />
頁: [1]
查看完整版本: UNIX文件系统的分析和比较深入认识