Linux0.11内核--文件系统理论知识

1.文件系统介绍

一个简单的文件系统大致需要这么几个要素:

● 要有地方存放Metadata;

● 要有地方记录扇区的使用情况;

● 要有地方来记录任一文件的信息,比如占用了哪些扇区等;

● 要有地方存放文件的索引。

根据这些要素,同时参照Minix的文件系统,我们就把我们的文件系统设计成如下图所示的样子:

可以看到,总体上来看,它几乎是把前述的各要素一字排开:

● 要有地方存放Metadata——占用整整一个扇区的superblock;

● 要有地方记录扇区的使用情况——sector map;

● 要有地方来记录任一文件的信息,比如占用了哪些扇区等——inode map以及被称作inode_array的 i-node真正存放地;

● 要有地方存放文件的索引——root数据区。

superblock通常也叫超级块,关于文件系统的Metadata我们统统记在这里。sector map是一个位图,它用来映射扇区的使用情况,用 1 表示扇区已被使用,0表示未使用。i-node是UNIX世界各种文件系统的核心数据结构之一,我们把它借用过来。每个 i-node对应一个文件,用于存放文件名、文件属性等内容,inode_array就是把所有 i-node都放在这里,形成一个较大的数组。而inode map就是用来映射inode_array这个数组使用情况的一个位图,用法跟sector map类似。root数据区类似于FAT12的根目录区,但本质上它也是个普通文件,由于它是所有文件的索引,所以我们把它单独看待。为简单起见,暂不支持文件夹。

下面就该将文件系统放到硬盘的一个分区上。

2.硬盘分区表介绍

为了不用掉整块硬盘造成浪费,所以这里就来研究一下怎么来针对分区进行操作。

1、硬盘的读写是以扇区为最小单位的,在VHD规范里,每个扇区是512字节。扇区的编号是从1开始的。分区表一般位于硬盘某柱面的0磁头1扇区。而第1个分区表(也即主分区表)总是位于(0柱面,0磁头,1扇区),剩余的分区表位置可以由主分区表依次推导出来。分区表有64个字节,占据其所在扇区的[447-510]字节。要判定是不是分区表,就看其后紧邻的两个字节(也即[511-512])是不是 "55AA"(55和AA两个字节,其实是两个16进制:55H和AAH,用四位二进制表示一位16进制),若是,则为分区表。

2、分区表上有四项,每一项表示一个分区,所以一个分区表最多只能表示4个分区。主分区表上的4项用来表示主分区和扩展分区的信息。因为扩展分区最多只能有一个,所以硬盘最多可以有四个主分区或者三个主分区,一个扩展分区。余下的分区表是表示逻辑分区的。这里有必要阐述一点:逻辑区都是位于扩展分区里面的,并且逻辑分区的个数没有限制。
3、分区表所在扇区通常在(0磁头,1扇区),而该分区的开始扇区通常位于(1磁头,1扇区),中间隔了63 个隐藏扇区。

硬盘分区表其实是一个结构体数组,数组的每个成员是一个16字节的结构体,它的构成如下表:

这个数组位于引导扇区的1BEh处(也就是446字节处),共有四个成员——因为IBM当时觉得一台PC最多会装四个操作系统。现在我们的计算机中每块硬盘经常划分成不止四个分区,这是因为每个主分区可以进一步分成多个逻辑分区。

现在我们就来实际看一下分区表是什么样子的,用二进制查看器来看一下引导扇区:

可以看到,我们的新硬盘前1BEh个字节(446个字节)都是0.第1BEh到第1FDh字节便是分区表的内容了。按照表9.3的说明,可知它们的意义如下表9.4所示:

从表中可知,第一个分区始于第3Fh扇区,共有4E81h个扇区,第二个分区始于第4EC0h扇区,共有22F20h个扇区。然后显然这些信息是不够的,我们还有若干逻辑分区的信息没得到呢。我们现在就来看一下第二个分区——也就是扩展分区的第一个扇区是什么样子。扩展分区的开始字节为9D8000h(4EC0hx512),它的内容如下:

其主要项的意义如下表所示:

前一个分区的起始扇区LBA是3Fh,这是个相对于扩展分区基地址的LBA,也就是说,它真正的LBA是4EC0h+3Fh=4EFFh。后一个分区,根据其分区类型05可知,它又是个扩展分区,起始扇区LBA为4EC0h+9D80h=EC40h,字节偏移为EC40hx512=1D88000h,我们继续看看其引导扇区:

其意义如下表所示:

从分区类型值(System ID)可以看出,在这个分区中,又包含了一个“普通的”分区和一个扩展分区,现在一下子明白了,多个逻辑分区是由嵌套来实现的。一个扩展分区里包含一个普通分区的同时,又可以嵌套一个扩展分区,一层一层的。到目前为止,我们已经剥开了两层,如下图所示:

 3.VFS文件系统介绍

在Linux文件系统中,为了提高文件访问的效率,都使用了Cache机制来提高速度。所谓Cache机制就是指文件系统在读写磁盘上的数据之前,都要经过Cache系统的缓冲。如果数据在Cache里有的话,就直接读取,如果没有,才实际从驱动器读写。

第一个块是引导块(Boot block),系统引导的时候使用。第二个块是超级块(Super block),记录了文件系统重要的信息,接下来的磁盘块存放inode和文件数据。

在VFS里,每一个文件系统是由其超级块来表示的,这是因为超级块存放了一个文件系统的最重要的信息,通过超级块可以了解这个文件系统的基本构成。从一个文件系统的超级块出发,就可以访问文件系统中任何一个文件。因此,在Linux中文件系统的管理以超级块为单位,从超级块可以取得这个文件系统中任何一个文件的inode,从文件的inode则可以对这个文件进行读写访问。

4.块设备

块设备(blockdevice)
--- 是一种具有一定结构的随机存取设备,对这种设备的读写是按块进行的,他使用缓冲区来存放暂时的数据,待条件成熟后,从缓存一次性写入设备或者从设备一次性读到缓冲区。
字符设备(Character device)
---是一个顺序的数据流设备,对这种设备的读写是按字符进行的,而且这些字符是连续地形成一个数据流。他不具备缓冲区,所以对这种设备的读写是实时的。

扇区(Sectors):任何块设备硬件对数据处理的基本单位。通常,1个扇区的大小为512byte。(对设备而言)
块 (Blocks):由Linux制定对内核或文件系统等数据处理的基本单位。通常,1个块由1个或多个扇区组成。(对Linux操作系统而言)
段(Segments):由若干个相邻的块组成。是Linux内存管理机制中一个内存页或者内存页的一部分。
页、段、块、扇区之间的关系图如下:

posted @ 2016-06-29 15:34  是非猫  阅读(1666)  评论(1编辑  收藏  举报