在STM32上实现NTFS之2:磁盘知识基础与NTFS结构
本节的图片,部分原创,部分摘自百度图片,如果有引用他处的图片或原话,在文章末尾会特别注明!
磁盘基础知识。
我们先来看一个传统机械硬盘的拆解图,如图1.
图1 机械硬盘拆解图
看上面的图……不要有拆硬盘的冲动哈!从图上可以看出,磁盘整体上,分为碟片、磁头、控制器、电机和外壳。信息存储于碟片上,通过碟片高速旋转,磁头从碟片上读出一个个的磁极数据,传递到控制器,还原成标准的01数据,传递给电脑,很神奇吧!
那么我们所需要了解的,主要就在这几片碟片上。现代的存储技术,碟片上的每个小磁粒有可能达到微米级,亚微米级,深亚微米级等等,可以想象一个硬盘中的磁粒数量有多么庞大!这么庞大的数量,对应着海量的bit数据,我们想通过告诉硬盘第XXXXXXXXXX个磁粒的数据写入0,读取第YYYYYYYYYYY个磁粒,那是不现实的,所以我们需要把磁盘分成若干个部分,每个部分再分成若干个部分,再分,再分……直到我们认为我们可以很轻易的标记每一个磁粒的位置为止。这有点像是军队点名,点到一个人通常说法是“XX团XX营XX连XX排XX班XXX出列”,而不是说“XXX团的XXXXX号出列”。我们规定下列称呼:
- 磁头
磁头是硬盘中最昂贵的部件,也是硬盘技术中最重要和最关键的一环。传统的磁头是读写合一的电磁感应式磁头,但是,硬盘的读、写却是两种截然不同的操作,为此,这种二合一磁头在设计时必须要同时兼顾到读/写两种特性,从而造成了硬盘设计上的局限。而MR磁头(Magnetoresistive heads),即磁阻磁头,采用的是分离式的磁头结构:写入磁头仍采用传统的磁感应磁头(MR磁头不能进行写操作),读取磁头则采用新型的MR磁头,即所谓的感应写、磁阻读。这样,在设计时就可以针对两者的不同特性分别进行优化,以得到最好的读/写性能。另外,MR磁头是通过阻值变化而不是电流变化去感应信号幅度,因而对信号变化相当敏感,读取数据的准确性也相应提高。而且由于读取的信号幅度与磁道宽度无关,故磁道可以做得很窄,从而提高了盘片密度,达到200MB/英寸2,而使用传统的磁头只能达到20MB/英寸2,这也是MR磁头被广泛应用的最主要原因。目前,MR磁头已得到广泛应用,而采用多层结构和磁阻效应更好的材料制作的GMR磁头(Giant Magnetoresistive heads)也逐渐普及。
- 磁道
当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。这些磁道用肉眼是根本看不到的,因为它们仅是盘面上以特殊方式磁化了的一些磁化区,磁盘上的信息便是沿着这样的轨道存放的。相邻磁道之间并不是紧挨着的,这是因为磁化单元相隔太近时磁性会相互产生影响,同时也为磁头的读写带来困难。一张1.44MB的3.5英寸软盘,一面有80个磁道,而硬盘上的磁道密度则远远大于此值,通常一面有成千上万个磁道。
- 扇区
磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区,每个扇区可以存放512个字节的信息,磁盘驱动器在向磁盘读取和写入数据时,要以扇区为单位。1.44MB3.5英寸的软盘,每个磁道分为18个扇区。
- 柱面
硬盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。磁盘的柱面数与一个盘面上的磁道数是相等的。由于每个盘面都有自己的磁头,因此,盘面数等于总的磁头数。
所谓硬盘的CHS,即Cylinder(柱面)、Head(磁头)、Sector(扇区),只要知道了硬盘的CHS的数目,即可确定硬盘的容量,硬盘的容量=柱面数×磁头数×扇区数×512 Bytes。于是现在,通过磁头 柱面 扇区,我们可以很容易的确定一个Byte在哪里了。
在若干年前,固态硬盘SSD开始出现,从开始的无人问津到大行其道,到了现在几乎与传统机械硬盘HDD分庭抗礼的地步,于是我们又不得不说说SSD中上述名词了。
SSD中没有这些机械部分的,所以也就没有物理意义上的磁头、柱面、柱面,但是为了和HDD直接兼容,我们必须让SSD中有这些东西,于是逻辑上的定义就出现了,我们规定,SSD的磁头数恒定为255,也就是0xFF,再规定每63个扇区是一个磁道,这样CHS中就只有一个柱面数是可变的,这对传统方式寻址的系统来讲就可以使用SSD了。
不只是SSD,所有采用Flash芯片的存储设备,比如SD卡,TF卡,U盘等等都遵循这一标准,以我那个8GB的SD卡为例,如图2是WinHEX读取的SD卡信息。
图2 WinHEX得到的8GB SD卡信息
从图2可以看到,柱面数945,结合之前所说的固定255个磁头,每个磁头63个扇区,每个扇区512字节,我们来计算一下总的字节数:945*255*63*512=7772889600,与总计容量相差无几。但我们不放过任何一个问题:为什么不是精确相等的?因为一个Flash在制造的时候,并不能保证所有的扇区都是良好的,所以需要多生产出一些扇区,然后屏蔽掉坏的不好用的扇区,然而总要留下足够的扇区来做备胎(替代品),所以我们可以看到,嗯……多出来14735个备胎,哦不,14735个扇区,这个数量最终总会是小于一个柱面的扇区数16065。哈,Flash生产厂商够大方的是吧。
磁盘的基础问题讲完了,该讲讲NTFS的核心框架了。NTFS中一个分区的大致结构如下图3.
图3 NTFS分区的大致结构
之所以说是大致结构,是因为其中的MFT区可以出现在除引导区和DBR备份之外的任何一个位置。
引导区包含DBR和引导代码,一般被分配为16字节,但不一定都被使用;
MFT区是一段连续空间,Windows系统将一大块空间保留给MFT,但不会在已使用空间中注明,如果其它部分被占满了,才会向这部分区间写入文件,但当其它部分一旦有空间时,这部分的文件会被即刻移走;
MFT备份区是MFT前几个MFT项的备份,同样的位置不固定,可能出现在一个NTFS分区的任意处;
DBR备份区是引导扇区DBR的备份,在DBR里存在着一个分区的总扇区数,这个扇区数不包括DBR备份扇区,出于这个扇区的重要意义,这是可以理解的:使基于文件系统的任何操作都无法修改这个扇区,因为它甚至不存在于NTFS之内。
有关存储设备的基本知识和NTFS的基本结构到这就讲完了,下一节开始真正的NTFS实现之旅——DPT和MBR的结构与C语言实现
部分原文参考自:http://blog.csdn.net/fyfcauc/article/details/39576065