2.3硬盘的分区
一块刚出厂的新硬盘是无法使用的,需要对它进行分区和格式化处理,然后再安装上操作系统才可以使用。一块完整硬盘的数据应该包括5个部分:主引导扇区(MBR)、操作系统引导扇区(DBR) 、FAT文件分配表、目录(DIR)区和数据(DATA)区。其中只有主引导扇区是唯一的,其他分区数可以任意设置。
2.3.1硬盘各分区的作用及原理
1.主引导扇区
接通电源后,计算机开始执行主板BIOS程序。进行完一系列检测和配置以后。开始按BIOS中设定的系统引导顺序引导系统。MBR (Master Boot Re-cord),即主引导记录,有时也称主引导扇区。位于整个硬盘的0柱面0磁头1扇区/可以看作是硬盘的一第一扇区),BIOS在执行自己固有的程序以后就会跳到MBR中的第一条指令。将系统的控制权交由主引导区来执行。在总共512B的主引导记录中,MBR的引导程序占了其中的前446B偏移OH偏移1BDH)、随后的64B(偏移IBEH偏移1 FDH)为硬盘分区表(Disk Partition Table、 DPT),最后的两个字节“55 AA”(偏移1 FEH移1FFH)是分区有效结束标志。
MBR不随操作系统的不同而不同,即不同的操作系统可能会存在相同的MBR,即使不同,MBR也不会夹带操作系性质,具有公共引导的特性。
对于DPT部分,操作系统为了便于用户对磁盘的管理,加入了磁盘分区的概念。即将一块磁盘逻辑划分为几块,磁盘分区数目的多少只受限于C~Z的英文字母的数目。在DPT中,共64个字节,如何表示多个分区的属性呢?微软通过链接的方法解决了这个问题。在DPT的64个字节中,以16个字节为分区表项单位描述一个分区的属性。第一个分区表项描述一个分区的属性,一般为基本分区;第二个分区表项描述除基本分区外的其余空间。一般而言,就是所说的扩展分区。这部分的大体说明见表2-1。
2.操作系统引导扇区
操作系统引导扇区(DOS BOOT RECORD, DBR)通常位于硬盘的0磁道1柱面1扇区。这是对于DOS来说的,对于那些以多重引导方式启动的系统则位于相应的主分区/扩展分区的第一个扇区。它是操作系统可直接访问的第一个扇区,也包括一个引导程序和一个被称为BPB的本分区参数记录表。其实每个逻辑分区都有一个DBR,其参数视分区的大小、操作系统的不同而有所不同。引导程序的主要任务是判断本分区根目录前两个文件是否为操作系统的引导文件,例如,MSDOS或者起源于MSDOS的Windows XP系统的10. SYS和MSDOW. SYS。引导程序就把第一个文件读入内存,并把控制权交予该文件。DBR参数块记录着本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、FAT个数、分配单元(Allocation Unit,簇)的大小等重要参数。DBR由高级格式化程序产生,下面以最常用的FAT32为例,说明分区DBR各字节的含义,如图2-24所示。
图2-24的对应解释见表2-3。
根据图2-24和图2-25,来讨论DBR中各字节的参数意义。
MBR将CPU发出的执行指令转移给引导扇区因此,引导扇区的前三个字节必须是合法的可执行的基于X86的CPU指令。这通常是一条跳转指令,该指令负责跳过接下来的几个不可执行的字节(BPB和扩展BPB),跳到操作系统引导代码部分。
跳转指令之后是8字节处理OEM ID,它是一个字符串,OEM ID标识了格式化该分区的操作系统的名称和版本号,为了保留与MS一DOS的兼容性,通常Windows 20由或Windows XP系统格式化该盘是在FAT32磁盘上的该字段中记录了“MSDOS 5. 0”,在NTFS磁盘上Windows 2000或Windows XP记录的是NT-FS格式的文件。
接下来的从偏移0X0B开始的是一段描述能够使可执行引导代码找到相关参数的信息,通常称为BPB (BIOS Parameter Block) , BPB一般开始于相同的位移量。因此,标准的参数都处于一个已知的位置。磁盘容量和几何结构变量都被封在BPB中。由于引导扇区的第一部分是一个x86跳线指令。因此,将来通过在BPB末端附加新的信息,可以对BPB进行扩展。只需要对该跳转指令做一个小的调整就可以适应BPB的变化。表2-4列出了FAT32分区的BPB字段名称和含义。表2-5列出了FAT32分区的扩展BPB字段名称和含义。
DBR的偏移0X5A开始的数据为操作系统引导代码。这是由偏移0X00开始的跳转指令所指向的,在图2-23所列出的移0X00 - 0X02的跳转指令“EB58 90”,清楚地指明了OS引导代码的偏移位置,Jump 58H加上跳转指令所需的位移量,即开始于0X5 A。此段指令在不同的操作系统上和不同的引导方式上,其内容也是不同的。Windows XP所使用的DBR只占用基本分区的0扇区。对于FAT32,一般的32个基本分区保留扇区只有第0扇区是有用的。以FAT32构建的操作系统为例,如果是Windows 2000或Windows XP,系统会使用基本分区的第0扇区和第0XC扇区(Windows 2000或Windows XP,其第0XC的位置由第0扇区的0XAB偏移指出)存储OS引导代码。所以,在FAT32分区格式上,如果DBR一扇区的内容正确而缺少第2扇区(Windows 98系统)或第0XC扇区(Windows 2000或者Windows XP系统),系统也是无法启动的。如果自己手动设置NTLDR双系统,必须知道这一点。
DBR扇区的最后两个字节是一般存储值为0X55AA的DBR有效标志,对于其他的取值,系统将不会执行DBR相关指令,上面提到的其他几个参与OS引导的扇区也需以0X55AA为合法结束标志。
FAT32中DBR的含义大致如此,对于FAT12和FAT16,其基本意义类似,只是相关偏移量和参数意义有小的差异,FAT16的扇区参数见表2-6~表2-8。
对于保留扇区在上述FAT文件系统DBR的偏移ME处,用两个字节存储保留扇区的数目。保留扇区(有时候称为系统扇区、隐藏扇区),是指从分区DBR扇区开始的仅为系统所有的扇区,包括DBR扇区。在FAT16文件系统中,保留扇区的数据通常设置为1,即仅仅DBR扇区。而在FAT32中,保留扇区的数据通常取为32,有时候用魔术师分区工具分过的FAT32分区会设置36个保留扇区,有的工具可能会设置63个保留扇区。
FAT32中的保留扇区除了磁盘总第0扇区用作于DBR,总第OXC扇区(Windows 2000, Windows XP)用作于OS引导代码扩展部分外,其余扇区都不参与操作系统管理与磁盘数据管理。操作系统之所以在FAT32中设置保留扇区,是为了DBR做备份或留待以后升级时用。FAT32中,DBR偏移0X34占2B的数据,指明了DBR备份扇区所在,一般为0X06,即第6扇区。当FAT32分区DBR扇区被破坏导致分区无法访问时,可以用第6扇区的原备份特换第0扇区来找回数据。
3.文件分配表
文件分配表(File Allocation Table, FAT)是DOS/Windows XP的文件寻址系统,为了数据安全起见,FAT一般做两个,第二个FAT为第一个FAT的备份,FAT区紧接在DBR之后,其大小由本分区的大小及文件分配单元的大小决定。关于FAT的格式历来有很多选择,微软的DOS及Windows采用FAT12, FAT16和FAT32格式,但除此以外并非没有其他格式的FAT,像Windows NT、OS/2、UNIX/Linux、 Novell等都有自己的文件管理方式。
FAT文件结构如图2-26所示。
FAT分区格式是微软最早支持的分区格式,依据FAT表中每个簇链的所占位数,它分为FAT 12、 FAT16、 FAT 32三种格式(变种),但其基本存储方式是相似的。
1) FAT和数据的存储原则
FAT是微软在FAT文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构。假如把磁盘比作一本书,FAT表可以认为相当于书中的目录,而文件就是各个章节的内容,但FAT表的表示方法却与目录有很大的不同。
在FAT丈件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录,也抽象为文件,以简化对数据的管理。
2)存储过程
FAT文件系统中数据的存储原则可用模拟的方法对一个分区存储数据的过程来说明。
假设有一个空的完全没有存放数据的磁盘,大小为100 KB,将其想象为线形的空间地址,为了存储管理上的便利,人为地将这10OKB的空间均分成100份,每份1KB。接下来依次存储这样几个文件:A. TXT(大小10KB);B. TXT大小53. 6KB);C. TXT(大小20. 5 KB)。
可以顺利地在这10OKB空间中存放这3个文件,同时还要记下它们的大小和开始的位置,这样下次要用时才能找的到,这就像目录。为了便于查找,假定用第1个空间来存储它们的特征(属性)。设计的存储单位是1 KB,所以,A.TXT需要10个存储单位(存储单位一般称为簇);B. TXT需要54个簇,C. TXT需要31个簇,可能有人会说B. TXT和C. TXT不是各自浪费了不到1簇的空间吗?但是,如果按照这样“紧挨着”的方式存储,目录中原本只需要记下簇号,现在还需要记下簇内的偏移,这样会增加目录的存储量,而且没有了规则,读取也不太方便,是得不偿失的。
综上所述,设计了如图2-27所示的存储方式。
对于每个文件而言,一定要记录的有文件名、开始簇、大小、创建日期与时间、修改日期与时间、文件的读写属性等。这里大小不能用结束簇来,因为文件的大小不一定就是整个簇的大小,否则像B. TXT就是5KB的内容了。为了管理上的方便,用数据库的管理方式来管理目录,则可以将1KB再分成10份,假定开始簇号为0,定义每份100B的各个位置的代表含义如图2-28。
此设计的结构绝对可以对文件进行正确的读写了。下面先改动个文件,例如,对A. TXT增加点内容在增加内容之前,可以先将B. TXT删了,B. TXT的空间随之释放,这时候空间如图2-29所示,目录如图2-30所示。
下面存入一个文件D. TXT大小为60. 3 KB),总共100簇的空间只用了31簇,还有68簇,实际中没有61个连续空间了,目录行无法写了,说明设计的文件系统有致命的漏洞。要解决这个问题,首先应允许文件的不连续存储。目录中依然只记录开始簇和文件的大小。可以用簇来映射文件,在整个存储空间的前部留下几簇来记录数据区中数据与簇号的关系。对于上例,因为总空间也不大,所以,用前部的1KB的空间来记录这种对应,假设3个文件都存储,空间分配如图2-31所示,同时修改一下目录,如图2-32所示。
第一簇用来记录数据区中每一簇的被占用的情况,暂时称其为文件分配表。结合文件分配表和文件目录就可以达到完全的文件读取了。把文件分配表做成一个数据表,以图2-33的形式记录簇与数据的对应。
用图2-33的组织方式是完全可以实现对文件占有簇的记录的,但效率不够高。例如文件名在文件分配表中记录太多,浪费空间,而实际上在目录中已经记录了文件的开始簇了所以可以改良一下,用链的方式来存放占有簇的关系,即图2-34的组织方式。
例如,文件A. TXT,根据目录项中指定的A. TXT的首簇为2,然后找到文件分配表的第2簇记录,上面登记的是3,就能确定下一簇是3,找到文件分配表的第3簇记录,上面登记的是4,就能确定下一簇是4……直到指到第11簇,发现下一个指向是FF,就是结束,文件便读取完毕。
根据上面提到的第三种情况:就是将B. TXT删除以后,存入一个大小为60. 3 KB的D. TXT。利用簇中很容易实现,实现后的磁盘如图2-35、图2-37所示。文件分配表如图2-36所示。
3) FAT32存储原理
由于目前主要使用的是FAT和NTFS存储方式,下面以FAT32为例介绍存储原理。
FAT32由如图2-38所示的6部分组成(主要是前5部分),FAT将磁盘空间按一定数目的扇区为单位进行划分,这样前单位称为簇。通常情况下,每扇区512B的原则是不变的。簇的大小一般是2(n为整数)个扇区的大小,像512B,1KB、2KB、4KB、8KB、16KB、32KB、64KB,实际中通常不超过64KB。以簇为单位而不以扇区为单位进行磁盘的分配,是因为当分区容量较大时,采用大小为512B的扇区管理会增加FAT表的项数,对大文件存取增加消耗,文件系统效率不高。分区的大小和簇的取值是有关系的,FAT32分区大小与对应簇的关系见表2-9。
簇的取值意义见表2-10
FAT32的另一项重大改革是根目录的文件化,即将根目录等同于普通的文件,这样根目录便没有了FAT16中512个目录项的限制,不够用的时候增加簇链,分配空簇即可。而且,根目录的位置也不再硬性地固定了,可以存储在分区内可寻址的任意簇内。通常根目录是最早建立的(格式化就生成了)目录表,所以,人们看到的情况基本上都是根目录首簇占簇区顺序上的每1个簇。
FAT32对簇的编号顺序上,第,1个簇编号为第2簇,通常为根目录所用。
FAT32的目录项的各字节及其参数意义见表2-11。
说明:
(1)这是FAT32短文件格式目录项的意义,其中,文件名、扩展名、时间、日期的算法和FAT16是相同的。
(2)由于FAT32可寻址的簇号到了32位二进制数。所以,系统在记录文件(文件夹)开始簇地址的时候也需要32位来记录,FAT32启用目录项偏移0X12~0X13来表示起始簇号的高16位。
(3)文件长度依然用4个字节表示,这说明FAT32依然只支持小于4GB的文件(目录)。超过4GB的文件(目录),系统会截断处理。
FAT32的一个重要的特点是完全支持长文件名,长文件名依然是记录在目录项中的。为了低版本的OS或程序能正确读取长文件名文件,系统自动为所有长文件名文件创建了一个对应的短文件名,使对应数据既可以用长文件名寻址,也可以用短文件名寻址,不支持长文件名的OS或程序会忽略它认为不合法的长文件名字段,而支持长文件名的OS或程序则会以长文件名为显式项来记录和编辑,并隐藏起短文件名。
当创建一个长文件名文件时,系统会自动加上读/取的短文件名,其一般原则如下:
(1)取长文件名的前6个字符加上“~1”形成短文件名,扩展名不变。
(2)如果已存在这个文件名,则符号“~”后的数字递增,直到5。
(3)如果文件名中“~”后面的数字达到5,则短文件名只使用长文件名的前两个字母,通过数学操纵长文件名的剩余字母生成短文件名的后四个字母,然后加后缀“~1”直到最后。
(4)如果存在DOS或程序无法读取的字符,换以“-”。
长文件名的实现有赖于目录项偏移为0XB的属性字节,当此字节的属性为只读、隐藏、系统、卷标,即其值为OFH时,DOS和WIN32会认为其不合法而忽略其存在。这正是长文件名存在的依据。将目录项的OXB置为OF,其他就任由系统定义了,Windows 2000, XP通常支持不超过255个字符的长文件名。系统将长文件名以13个字符为单位进行切割,每一组占据一个目录项。所以,可能一个文件需要多个目录项,这时长文件名的各个目录项按倒序排列在目录表中,以防与其他文件名混淆。
长文件名中的字符采用Unicode形式编码,每个字符占据2B的空间,其目录项定义见表2-12。