http://guliqun1983.blog.163.com/blog/static/501116852011730535314/
全部博文(120)
分类: LINUX
2013-04-24 10:29:25
原文地址:明明白白我的心--fs series(3) 作者:mtloveft
|
字段名称 | 説明 |
s_ninodes | i节点数 |
s_nzones | 数据块数 |
s_imap_blocks | i节点位图占有的块数 |
s_zmap_blocks | 数据块位图占有的块数 |
s_firstdatazone | 数据块中第一个数据块的块号 |
s_log_zone_size | disk块数/逻辑块 |
s_max_size | 最大文件长度 |
s_magic | 文件系统的幻数 |
所以super block 对于FS来说是最重要的数据结构了。
通过SB可以知道Block的安排了。当然就知道了FS的大小了。通过inode bitmaps 就可以知道那个inode还没有被使用,通过block bitmaps就知道数据块中还有哪块没有被使用。整个文件系统就可以被管理了。
i节点的定义如下
|
相关说明如下
字段名称 | 説明 |
i_mode | 文件类型和属性 |
i_uid | 用户 id |
i_size | 文件长度 |
i_mtime | 修改时间 |
i_gid | 组id |
i_nlinks | 链接数 |
i_zone[9] | 文件占用的逻辑快数组 zone[0]-zone[6]是直接块号 zone[7]是一次间接块号 zone[8]是二次间接块号 |
根据i_zone, 知道了i节点,就知道了对应的数据放到了什么位置。
还有关于目录项的定义
|
文件的定义如下
|
看到了什么,文件中有inode的指针。对文件的动作,最好都会根据inode来对实际数据进行操作。
再来看看minixFS是如何进行数据管理的
i3 即inode3如果他是个目录节点的话,它的i_zone[0]将是一个目录数据块号,数据内容将是dir_entry数据结构的数组。这样目录下的
文件名和目录名将全部能产看到。如果目录下文件或者子目录很多的话,可以通过i_zone[7]继续查找到,还有根多的子文件或者
子目录的话,就通过i_zone[8]进行2次间接查找。
D3 即dir_entry3 它的inode 指向i2, 而i2是个二进制文件,那么i_zone[0]将指向一个有实际数据的数据块。
如果知道根节点,那么顺着根节点,可以找到所有的文件和目录,所以根节点是必须设定的。
给定一个i节点,这个i节点下的文件和目录也将可以查找到。有了理论,程序就很容易实现了。
而文件的数据结构struct file根inode关联起来,这样文件的读,写就根据inode可以找到数据的位置了。
minix得结构还是比较简单的,如果了解了minix,其他再复杂的文件系统,也会很快理解的了。
data block 的号码是逻辑号码,读写数据就直接交给harddisk的驱动程序处理,驱动程序根据分区和data block 的号码算出实际的扇区号进行读写。
读出的数据先放到buffer cache,写入的数据也是先放到buffer cache.这样,文件系统就只要和buffer cache 交互就可以了,可以提高工作效率。
我认为minix的几个问题是文件放置的效率,还有,如果super block坏了的话文件系统就崩溃了,可以说无法修复的。因为无法知道根接点的数据
放到什么位置了。安区性问题很严重。当然minixFS 得容量也很小。不过对于教学研究,是很值得研究的文件系统。