原文网址:http://hi.baidu.com/waybq/item/a4490f026f9859d21ef046a4ios
硬盘是如今计算机上最经常使用的存储器之一。咱们都知道,计算机之因此神奇,是由于它具备高速分析处理数据的能力。而这些数据都以文件的形式存储在硬盘里。不过,计算机可不像人那么聪明。在读取相应的文件时,你必需要给出相应的规则。这就是分区概念。数据结构
分区从实质上说就是对硬盘的一种格式化。当咱们建立分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即Master Boot Record,通常简称为MBR)和引导记录备份的存放位置。而对于文件系统以及其余操做系统管理硬盘所须要的信息则是经过之后的高级格式化,即Format命令来实现。面、磁道和扇区硬盘分区后,将会被划分为面(Side)、磁道(Track)和扇区(Sector)。须要注意的是,这些只是个虚拟的概念,并非真正在硬盘上划轨道。ide
先从面提及,硬盘通常是由一片或几片圆形薄膜叠加而成。咱们所说,每一个圆形薄膜都有两个“面”,这两个面都是用来存储数据的。按照面的多少,依次称为0面、1面、2面……因为每一个面都专有一个读写磁头,也经常使用0头(head)、1头……称之。按照硬盘容量和规格的不一样,硬盘面数(或头数)也不必定相同,少的只有2面,多的可达数十面。各面上磁道号相同的磁道合起来,称为一个柱面(Cylinder)。spa
上面咱们提到了磁道的概念。那么究竟何为磁道呢?因为磁盘是旋转的,则连续写入的数据是排列在一个圆周上的。咱们称这样的圆周为一个磁道。若是读写磁头沿着圆形薄膜的半径方向移动一段距离,之后写入的数据又排列在另一个磁道上。根据硬盘规格的不一样,磁道数能够从几百到数千不等;一个磁道上能够容纳数KB的数据,而主机读写时每每并不须要一次读写那么多,因而,磁道又被划分红若干段,每段称为一个扇区。一个扇区通常存放512字节的数据。扇区也须要编号,同一磁道中的扇区,分别称为1扇区,2扇区……操作系统
计算机对硬盘的读写,处于效率的考虑,是以扇区为基本单位的。即便计算机只须要硬盘上存储的某个字节,也必须一次把这个字节所在的扇区中的512字节所有读入内存,再使用所需的那个字节。不过,在上文中咱们也提到,硬盘上面、磁道、扇区的划分表面上是看不到任何痕迹的,虽然磁头能够根据某个磁道的应有半径来对准这个磁道,但怎样才能在首尾相连的一圈扇区中找出所须要的某一扇区呢?原来,每一个扇区并不只仅由512个字节组成的,在这些由计算机存取的数据的前、后两端,都另有一些特定的数据,这些数据构成了扇区的界限标志,标志中含有扇区的编号和其余信息。计算机就凭借着这些标志来识别扇区。硬盘的数据结构 在上文中,咱们谈了数据在硬盘中的存储的通常原理。为了能更深刻地了解硬盘,咱们还必须对硬盘的数据结构有个简单的了解。硬盘上的数据按照其不一样的特色和做用大体可分为5部分:MBR区、DBR区、FAT区、DIR区和DATA区。设计
咱们来分别介绍一下:orm
一、MBR区内存
MBR(Main Boot Record 主引导记录区)位于整个硬盘的0磁道0柱面1扇区。不过,在总共512字节的主引导扇区中,MBR只占用了其中的446个字节,另外的64个字节交给了DPT(Disk Partition Table硬盘分区表),最后两个字节“55,AA”是分区的结束标志。这个总体构成了硬盘的主引导扇区。it
主引导记录中包含了硬盘的一系列参数和一段引导程序。其中的硬盘引导程序的主要做用是检查分区表是否正确而且在系统硬件完成自检之后引导具备激活标志的分区上的操做系统,并将控制权交给启动程序。MBR是由分区程序(如Fdisk.exe)所产生的,它不依赖任何操做系统,并且硬盘引导程序也是能够改变的,从而实现多系统共存。io
下面,咱们以一个实例让你们更直观地来了解主引导记录:
例:80 01 01 00 0B FE BF FC 3F 00 00 00 7E 86 BB 00 在这里咱们能够看到,最前面的“80”是一个分区的激活标志,表示系统可引导;“01 01 00”表示分区开始的磁头号为01,开始的扇区号为01,开始的柱面号为00;“0B”表示分区的系统类型是FAT32,其余比较经常使用的有04(FAT16)、07(NTFS);“FE BF FC”表示分区结束的磁头号为254,分区结束的扇区号为6三、分区结束的柱面号为764;“3F 00 00 00”表示首扇区的相对扇区号为63;“7E 86 BB 00”表示总扇区数为12289622。
二、DBR区
DBR(Dos Boot Record)是操做系统引导记录区的意思。它一般位于硬盘的0磁道1柱面1扇区,是操做系统能够直接访问的第一个扇区,它包括一个引导程序和一个被称为BPB(Bios Parameter Block)的本分区参数记录表。引导程序的主要任务是当MBR将系统控制权交给它时,判断本分区跟目录前两个文件是否是操做系统的引导文件(以DOS为例,便是Io.sys和Msdos.sys)。若是肯定存在,就把它读入内存,并把控制权 交给该文件。BPB参数块记录着本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、FAT个数,分配单元的大小等重要参数。DBR是由高级格式化程序(即Format.com等程序)所产生的。
三、FAT区
在DBR以后的是咱们比较熟悉的FAT(File Allocation Table文件分配表)区。在解释文件分配表的概念以前,咱们先来谈谈簇(Cluster)的概念。文件占用磁盘空间时,基本单位不是字节而是簇。通常状况下,软盘每簇是1个扇区,硬盘每簇的扇区数与硬盘的总容量大小有关,多是四、八、1六、3二、64…… 同一个文件的数据并不必定完整地存放在磁盘的一个连续的区域内,而每每会分红若干段,像一条链子同样存放。这种存储方式称为文件的链式存储。因为硬盘上保存着段与段之间的链接信息(即FAT),操做系统在读取文件时,老是可以准确地找到各段的位置并正确读出。 为了实现文件的链式存储,硬盘上必须准确地记录哪些簇已经被文件占用,还必须为每一个已经占用的簇指明存储后继内容的下一个簇的簇号。对一个文件的最后一簇,则要指明本簇无后继簇。这些都是由FAT表来保存的,表中有不少表项,每项记录一个簇的信息。因为FAT对于文件管理的重要性,因此FAT有一个备份,即在原FAT的后面再建一个一样的FAT。初造成的FAT中全部项都标明为“未占用”,但若是磁盘有局部损坏,那么格式化程序会检测出损坏的簇,在相应的项中标为“坏簇”,之后存文件时就不会再使用这个簇了。FAT的项数与硬盘上的总簇数至关,每一项占用的字节数也要与总簇数相适应,由于其中须要存放簇号。FAT的格式有多种,最为常见的是FAT16和FAT32。
四、DIR区
DIR(Directory)是根目录区,紧接着第二FAT表(即备份的FAT表)以后,记录着根目录下每一个文件(目录)的起始单元,文件的属性等。定位文件位置时,操做系统根据DIR中的起始单元,结合FAT表就能够知道文件在硬盘中的具体位置和大小了。
五、数据(DATA)区
数据区是真正意义上的数据存储的地方,位于DIR区以后,占据硬盘上的大部分数据空间。
1、硬盘的物理结构:
硬盘存储数据是根据电、磁转换原理实现的。硬盘由一个或几个表面镀有磁性物质的金属或玻璃等物质盘片以及盘片两面所安装的磁头和相应的控制电路组成(图1),其中盘片和磁头密封在无尘的金属壳中。
硬盘工做时,盘片以设计转速高速旋转,设置在盘片表面的磁头则在电路控制下径向移动到指定位置而后将数据存储或读取出来。当系统向硬盘写入数据时,磁头中“写数据”电流产生磁场使盘片表面磁性物质状态发生改变,并在写电流磁场消失后仍能保持,这样数据就存储下来了;当系统从硬盘中读数据时,磁头通过盘片指定区域,盘片表面磁场使磁头产生感应电流或线圈阻抗产生变化,经相关电路处理后还原成数据。所以只要能将盘片表面处理得更平滑、磁头设计得更精密以及尽可能提升盘片旋转速度,就能造出容量更大、读写数据速度更快的硬盘。这是由于盘片表面处理越平、转速越快就能越使磁头离盘片表面越近,提升读、写灵敏度和速度;磁头设计越小越精密就能使磁头在盘片上占用空间越小,使磁头在一张盘片上创建更多的磁道以存储更多的数据。
2、硬盘的逻辑结构:
硬盘由不少盘片(platter)组成,每一个盘片的每一个面都有一个读写磁头。若是有N个盘片。就有2N个面,对应2N个磁头(Heads),从0、一、2开始编号。每一个盘片被划分红若干个同心圆磁道(逻辑上的,是不可见的。)每一个盘片的划分规则一般是同样的。这样每一个盘片的半径均为固定值R的同心圆再逻辑上造成了一个以电机主轴为轴的柱面(Cylinders),从外至里编号为0、一、2……每一个盘片上的每一个磁道又被划分为几十个扇区(Sector),一般的容量是512byte,并按照必定规则编号为一、二、3……造成Cylinders×Heads×Sector个扇区。这三个参数便是硬盘的物理参数。咱们下面的不少实践须要深入理解这三个参数的意义。
硬盘存储数据是根据电、磁转换原理实现的。硬盘由一个或几个表面镀有磁性物质的金属或玻璃等物质盘片以及盘片两面所安装的磁头和相应的控制电路组成(图1),其中盘片和磁头密封在无尘的金属壳中。
3、磁盘引导原理:
3.1 MBR(master boot record)扇区:
计算机在按下power键之后,开始执行主板bios程序。进行完一系列检测和配置之后。开始按bios中设定的系统引导顺序引导系统。假定如今是硬盘。Bios执行完本身的程序后如何把执行权交给硬盘呢。交给硬盘后又执行存储在哪里的程序呢。其实,称为mbr的一段代码起着举足轻重的做用。MBR(master boot record),即主引导记录,有时也称主引导扇区。位于整个硬盘的0柱面0磁头1扇区(能够看做是硬盘的第一个扇区),bios在执行本身固有的程序之后就会jump到mbr中的第一条指令。将系统的控制权交由mbr来执行。在总共512byte的主引导记录中,MBR的引导程序占了其中的前446个字节(偏移0H~偏移1BDH),随后的64个字节(偏移1BEH~偏移1FDH)为DPT(Disk PartitionTable,硬盘分区表),最后的两个字节“55 AA”(偏移1FEH~偏移1FFH)是分区有效结束标志。
MBR不随操做系统的不一样而不一样,意即不一样的操做系统可能会存在相同的MBR,即便不一样,MBR也不会夹带操做系统的性质。具备公共引导的特性。
咱们来分析一段mbr。下面是用winhex查看的一块希捷120GB硬盘的mbr。
MBR扇区代码
你的硬盘的MBR引导代码可能并不是这样。不过即便不一样,所执行的功能大致是同样的。这里找wowocock关于磁盘mbr的反编译,已加了详细的注释,感兴趣能够细细研究一下。
咱们看DPT部分。操做系统为了便于用户对磁盘的管理。加入了磁盘分区的概念。即将一块磁盘逻辑划分为几块。磁盘分区数目的多少只受限于C~Z的英文字母的数目,在上图DPT共64个字节中如何表示多个分区的属性呢?microsoft经过连接的方法解决了这个问题。在DPT共64个字节中,以16个字节为分区表项单位描述一个分区的属性。也就是说,第一个分区表项描述一个分区的属性,通常为基本分区。第二个分区表项描述除基本分区外的其他空间,通常而言,就是咱们所说的扩展分区。这部分的大致说明见表1。
DPT代码分析
注:上表中的超过1字节的数据都以实际数据显示,就是按高位到地位的方式显示。存储时是按低位到高位存储的。二者表现不一样,请仔细看清楚。之后出现的表,图均同。
也能够在winhex中看到这些参数的意义:
说明: 每一个分区表项占用16个字节,假定偏移地址从0开始。如图3的分区表项3。分区表项4同分区表项3。
一、0H偏移为活动分区是否标志,只能选00H和80H。80H为活动,00H为非活动。其他值对microsoft而言为非法值。
二、从新说明一下(这个很是重要):大于1个字节的数被以低字节在前的存储格式格式(little endian format)或称反字节顺序保存下来。低字节在前的格式是一种保存数的方法,这样,最低位的字节最早出如今十六进制数符号中。例如,相对扇区数字段的值0x3F000000的低字节在前表示为0x0000003F。这个低字节在前的格式数的十进制数为63。
三、系统在分区时,各分区都不容许跨柱面,即均以柱面为单位,这就是一般所说的分区粒度。有时候咱们分区是输入分区的大小为7000M,分出来倒是6997M,就是这个缘由。 偏移2H和偏移6H的扇区和柱面参数中,扇区占6位(bit),柱面占10位(bit),以偏移6H为例,其低6位用做扇区数的二进制表示。其高两位作柱面数10位中的高两位,偏移7H组成的8位作柱面数10位中的低8位。由此可知,实际上用这种方式表示的分区容量是有限的,柱面和磁头从0开始编号,扇区从1开始编号,因此最多只能表示1024个柱面×63个扇区×256个磁头×512byte=8455716864byte。即一般的8.4GB(实际上应该是7.8GB左右)限制。实际上磁头数一般只用到255个(由汇编语言的寻址寄存器决定),即便把这3个字节按线性寻址,依然力不从心。 在后来的操做系统中,超过8.4GB的分区其实已经不经过C/H/S的方式寻址了。而是经过偏移CH~偏移FH共4个字节32位线性扇区地址来表示分区所占用的扇区总数。可知经过4个字节能够表示2^32个扇区,即2TB=2048GB,目前对于大多数计算机而言,这已是个天文数字了。在未超过8.4GB的分区上,C/H/S的表示方法和线性扇区的表示方法所表示的分区大小是一致的。也就是说,两种表示方法是协调的。即便不协调,也以线性寻址为准。(可能在某些系统中会提示出错)。超过8.4GB的分区结束C/H/S通常填充为FEH FFH FFH。即C/H/S所能表示的最大值。有时候也会用柱面对1024的模来填充。不过这几个字节是什么其实都可有可无了。
虽然如今的系统均采用线性寻址的方式来处理分区的大小。但不可跨柱面的原则依然没变。本分区的扇区总数加上与前一分区之间的保留扇区数目依然必须是柱面容量的整数倍。(保留扇区中的第一个扇区就是存放分区表的MBR或虚拟MBR的扇区,分区的扇区总数在线性表示方式上是不计入保留扇区的。若是是第一个分区,保留扇区是本分区前的全部扇区。
附:分区表类型标志如图4
3.2 扩展分区
扩展分区中的每一个逻辑驱动器都存在一个相似于MBR的扩展引导记录( Extended Boot Record, EBR),也有人称之为虚拟mbr或扩展mbr,意思是同样的。扩展引导记录包括一个扩展分区表和该扇区的标签。扩展引导记录将记录只包含扩展分区中每一个逻辑驱动器的第一个柱面的第一面的信息。一个逻辑驱动器中的引导扇区通常位于相对扇区32或63。可是,若是磁盘上没有扩展分区,那么就不会有扩展引导记录和逻辑驱动器。第一个逻辑驱动器的扩展分区表中的第一项指向它自身的引导扇区。第二项指向下一个逻辑驱动器的EBR。若是不存在进一步的逻辑驱动器,第二项就不会使用,并且被记录成一系列零。若是有附加的逻辑驱动器,那么第二个逻辑驱动器的扩展分区表的第一项会指向它自己的引导扇区。第二个逻辑驱动器的扩展分区表的第二项指向下一个逻辑驱动器的EBR。扩展分区表的第三项和第四项永远都不会被使用。
经过一幅4分区的磁盘结构图能够看到磁盘的大体组织形式。如图5
关于扩展分区,如图6所示,扩展分区中逻辑驱动器的扩展引导记录是一个链接表。该图显示了一个扩展分区上的三个逻辑驱动器,说明了前面的逻辑驱动器和最后一个逻辑驱动器之间在扩展分区表中的差别。
除了扩展分区上最后一个逻辑驱动器外,表2中所描述的扩展分区表的格式在每一个逻辑驱动器中都是重复的:第一个项标识了逻辑驱动器自己的引导扇区,第二个项标识了下一个逻辑驱动器的EBR。最后一个逻辑驱动器的扩展分区表只会列出它自己的分区项。最后一个扩展分区表的第二个项到第四个项被使用。
扩展分区表项中的相对扇区数字段所显示的是从扩展分区开始到逻辑驱动器中第一个扇区的位移的字节数。总扇区数字段中的数是指组成该逻辑驱动器的扇区数目。总扇区数字段的值等于从扩展分区表项所定义的引导扇区到逻辑驱动器末尾的扇区数。
有时候在磁盘的末尾会有剩余空间,剩余空间是什么呢?咱们前面说到,分区是以1柱面的容量为分区粒度的,那么若是磁盘总空间不是整数个柱面的话,不够一个柱面的剩下的空间就是剩余空间了,这部分空间并不参与分区,因此通常没法利用。照道理说,磁盘的物理模式决定了磁盘的总容量就应该是整数个柱面的容量,为何会有不够一个柱面的空间呢。在个人理解看来,原本如今的磁盘为了更大的利用空间,通常在物理上并非按照外围的扇区大于里圈的扇区这种管理方式,只是为了与操做系统兼容而抽象出来CHS。可能其实际空间容量不必定正好为整数个柱面的容量。