声明:本文为原创
#####请转贴时保留以下内容######
作者:GTT
请提出宝贵意见Mail:mtloveft@hotmail.com
Linux Version:2.6.33
提示:本文是关于file system 实现的介绍!
先来看看minix在早期linux版本中的实现,以下代码是linux0.11版本的。
超级块的定义如下
|
struct super_block { unsigned short s_ninodes; unsigned short s_nzones; unsigned short s_imap_blocks; unsigned short s_zmap_blocks; unsigned short s_firstdatazone; unsigned short s_log_zone_size; unsigned long s_max_size; unsigned short s_magic; /* These are only in memory */ struct buffer_head * s_imap[8]; struct buffer_head * s_zmap[8]; unsigned short s_dev; struct m_inode * s_isup; struct m_inode * s_imount; unsigned long s_time; struct task_struct * s_wait; unsigned char s_lock; unsigned char s_rd_only; unsigned char s_dirt; }
|
相关说明如下
| 字段名称 |
説明 |
| 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节点的定义如下
|
struct m_inode { unsigned short i_mode; unsigned short i_uid; unsigned long i_size; unsigned long i_mtime; unsigned char i_gid; unsigned char i_nlinks; unsigned short i_zone[9]; /* these are in memory also */ struct task_struct * i_wait; unsigned long i_atime; unsigned long i_ctime; unsigned short i_dev; unsigned short i_num; unsigned short i_count; unsigned char i_lock; unsigned char i_dirt; unsigned char i_pipe; unsigned char i_mount; unsigned char i_seek; unsigned char i_update; }
|
相关说明如下
| 字段名称 |
説明 |
| 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节点,就知道了对应的数据放到了什么位置。
还有关于目录项的定义
|
struct dir_entry { unsigned short inode; char name[NAME_LEN]; }
|
文件的定义如下
|
struct file { unsigned short f_mode; unsigned short f_flags; unsigned short f_count; struct m_inode * f_inode; off_t f_pos; }
|
看到了什么,文件中有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 得容量也很小。不过对于教学研究,是很值得研究的文件系统。