以Linux 0.11为实例,个人总结,不保证正确性。。。
[文件系统]
磁盘上的数据以块为单位进行读写,每一个块称为一个逻辑块。在理解磁盘的逻辑视图时,以逻辑块为单位来理解。
磁盘上数据按照使用情况分,可以分成以下几个部分:引导块、超级块、i节点位图区、逻辑块节点位图区、i节点区、数据区
引导块中是整个系统的启动代码,只有用于启动的文件系统才有数据,其它的文件系统这个块没有数据(可以这样理解)
超级块中存放的是关于整个文件系统的布局描述的数据
i节点位图区中存放的是i节点区中i节点的使用情况
逻辑块节点位图区中存放的是磁盘中逻辑块的使用情况
i节点区中存放的是对应文件的i节点数据
数据区存放文件数据的部分
示意图如下
[超级块]
超级块中含有描述整个文件系统分布的数据。相应的数据结构如下(fs.h)
struct d_super_block {
unsigned short s_ninodes; //i节点个数
unsigned short s_nzones; //磁盘上全部的逻辑块的个数
unsigned short s_imap_blocks; //i节点位图区所使用的逻辑块的个数
unsigned short s_zmap_blocks; //逻辑块位图区所使用的逻辑块的个数
unsigned short s_firstdatazone; //第一个数据块的逻辑块号
unsigned short s_log_zone_size;
unsigned long s_max_size; // 最大文件长度
unsigned short s_magic; //文件系统魔数
};
struct d_super_block是对磁盘上的超级块的数据描述。
在内存中的超级块的数据结构,除了要存放磁盘中相应的数据外,还要存放一些额外的信息。如读写标志、加锁标志、该文件系统安装的根节点、i节点位图区的高速缓存、设备号等。内存中超级块的数据结构描述如下
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]; //i节点位图区的高速缓存数组,8个逻辑块的大小
struct buffer_head * s_zmap[8]; //逻辑块位图区的高速缓存数组,8个逻辑块的大小
unsigned short s_dev; //设备号
struct m_inode * s_isup; //被安装文件系统根目录i节点
struct m_inode * s_imount; //该文件系统被安装的i节点
unsigned long s_time; //修改时间
struct task_struct * s_wait; //等待在该超级块上的进程
unsigned char s_lock; //加锁标志
unsigned char s_rd_only; //只读标志
unsigned char s_dirt; //内容是否已修改标志
};