struct list_heads s_list;
kdev_t s_dev;
unsigned long s_blocksize;
unsigned char s_blocksize_bits;
unsigned char s_rd_only;
unsigned char s_dirt;
struct file_system_type *s_type;
unsigned long s_flags;
unsigned long s_magic;
unsigned long s_time;
struct dentry *s_root;
以上这些字段是我认为super_block结构里属于基本资料的部分,在这里,我没有依照原始程序的写法依序将字段列出来,而是将相关的整理在一起。s_list这个字段是用来将super block串在一起的。在Linux里,同一时间Kernel可能会拥有好几个档案系统的super block,因此,它有它自己一套的super block管理方式,平常也许我们会另外写一个linked list,里面用一个字段存放super block,用这种方式把super block串在一起,但是,Kernel不是这样做,它也是用一个串行来把super block放在一起。但是,它把它写到super block结构里,s_list就是用来将super block串起来的。用法跟一般人写法不同,在super block的管理我将为各位介绍。
s_dev是此super block所属档案系统所在的device代码。档案系统内部的管理不是用档案做单位,而是以block为存取的单位,而s_blocksize就是用来记录一个block是几个byte。因此,如果一个block是1024 byte的话,那s_blocksize为1024,而s_blocksize_bits就是10,这个字段是指一个block需要几个bit来表示。而s_rd_only从字面上来看应该是记录档案系统或super block是否只读,目前这个字段是被设为0,还没有被使用。至于s_dirt则是记录此super block的内容是否被改过,用来判断是否最后要将super block写回disk里,当super block被更动之后,s_dirt会被设为1。s_type的型别是file_system_type,这是一种来描述档案系统的结构,在这里,是用来记录这个super block是属于那一个档案系统。有关这种型别,我们将会在super block的管理中探讨。当我们使用档案系统时,第一步就是要做mount的动作,在mount的时候,还需要给它参数,像是mount成只读或可擦写等,这些参数就是记录在s_flags里。在Linux或UNIX里,magic number通常是用来做识别用的,而档案系统的magic number就是设在s_magic字段里,像目前Ext2的magic number就是0xEF53。从档案系统的super block我们可以读取到这个档案系统任一个档案,但是,前提是我们必须要先知道这个档案系统的根目录在那里才可以。就像给我们一个绝对路径我们可以找到那个档案,但是,找的方式是先从根目录,再往下层去找。因此,super block必须记录它所代表的档案系统根目录在那里,这就记录在s_root里。