Linux文件系统概述

以Linux 0.11为实例,个人总结,不保证正确性。。。

[文件系统]
磁盘上的数据以块为单位进行读写,每一个块称为一个逻辑块。在理解磁盘的逻辑视图时,以逻辑块为单位来理解。
磁盘上数据按照使用情况分,可以分成以下几个部分:引导块、超级块、i节点位图区、逻辑块节点位图区、i节点区、数据区
引导块中是整个系统的启动代码,只有用于启动的文件系统才有数据,其它的文件系统这个块没有数据(可以这样理解)
超级块中存放的是关于整个文件系统的布局描述的数据
i节点位图区中存放的是i节点区中i节点的使用情况
逻辑块节点位图区中存放的是磁盘中逻辑块的使用情况
i节点区中存放的是对应文件的i节点数据
数据区存放文件数据的部分


示意图如下

Linux文件系统概述


[超级块]
超级块中含有描述整个文件系统分布的数据。相应的数据结构如下(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;  //内容是否已修改标志
};

相关推荐