2024年1月5日发(作者:)
FAT32文件系统简介
[日期:2008-09-27] 来源: 作者: [字体:大 中 小]
(一)FAT32 文件系统将逻辑盘的空间划分为三部分,依次是引导区(BOOT区)、文件分配表区(FAT区)、数据区(DATA区)。引导区和文件分配表区又合称为系统区。
(二)引导区从第一扇区开始,使用了三个扇区,保存了该逻辑盘每扇区字节数,每簇对应的扇区数等等重要参数和引导记录。之后还留有若干保留扇区。而FAT16文件系统的引导区只占用一个扇区,没有保留扇区。
(三)文件分配表区共保存了两个相同的文件分配表,因为文件所占用的存储空间(簇链)及空闲空间的管理都是通过FAT实现的,FAT如此重要,保存两个以便第一个损坏时,还有第二个可用。文件系统对数据区的存储空间是按簇进行划分和管理的,簇是空间分配和回收的基本单位,即,一个文件总是占用若干个整簇,文件所使用的最后一簇剩余的空间就不再使用,而是浪费掉了。
从统计学上讲,平均每个文件浪费0.5簇的空间,簇越大,存储文件时空间浪费越多,利用率越低。因此,簇的大小决定了该盘数据区的利用率。FAT16系统簇号用16位二进制数表示,从0002H到FFEFH个可用簇号(FFF0H到FFFFH另有定义,用来表示坏簇,文件结束簇等),允许每一逻辑盘的数据区最多不超过FFEDH(65518)个簇。FAT32系统簇号改用32位二进制数表示,大致从00000002H到FFFFFEFFH个可用簇号。FAT表按顺序依次记录了该盘各簇的使用情况,是一种位示图法。
每簇的使用情况用32位二进制填写,未被分配的簇相应位置写零;坏簇相应位置填入特定值;已分配的簇相应位置填入非零值,具体为:如果该簇是文件的最后一簇,填入的值为FFFFFF0FH,如果该簇不是文件的最后一簇,填入的值为该文件占用的下一个簇的簇号,这样,正好将文件占用的各簇构成一个簇链,保存在FAT表中。0000000H、00000001H两簇号不使用,其对应的两个DWORD位置(FAT表开头的8个字节)用来存放该盘介质类型编号。FAT表的大小就由该逻辑盘数据区共有多少簇所决定,取整数个扇区。
(四)FAT32系统一簇对应8个逻辑相邻的扇区,理论上,这种用法所能管理的逻辑盘容量上限为16TB(16384GB),容量大于16TB时,可以用一簇对应16个扇区,依此类推。FAT16系统在逻辑盘容量介于128MB到256MB时,一簇对应8个扇区,容量介于256MB到512MB时,一簇对应16个扇区,容量介于512MB到1GB时,一簇对应32个扇区,容量介于1GB到2GB时,一簇对应32个扇区,超出2GB的部分无法使用。显然,对于容量大于512MB的逻辑盘,采用FAT32的簇比采用FAT16的簇小很多,大大减少了空间的浪费。
但是,对于容量小于512MB的盘,采用FAT32虽然一簇8个扇区,比使用FAT16一簇16个扇区,簇有所减小,但FAT32的FAT表较大,占用空间较多,总数据区被减少,两者相抵,实际并不能增加有效存储空间,所以微软建议对小于512M的逻辑盘不使用FAT32。
另外,对于使用FAT16文件系统的用户提一建议,硬盘分区时,不要将分区(逻辑盘)容量正好设为某一区间的下限,例:将一逻辑盘容量设为1100M(稍大于1024M),则使用时其有效存储容量比分区为950M的一般还少,因其簇大一倍,浪费的空间较多。还有,使用FDISK等对分区指定容量时,由于对1MB的定义不一样(标准的二进制的1MB为1048576B,有的系统将1MB理解为1000000B,1000KB等),及每个分区需从新磁道开始等因素,实际分配的容量可能稍大于指定的容量,亦需注意掌握。
五)根目录区(ROOT区)不再是固定区域、固定大小,可看作是数据区的一部分。因为根目录已改为根目录文件,采用与子目录文件相同的管理方式,一般情况下从第二簇开始使用,大小视需要增加,因此根目录下的文件数目不再受最多512的限制。FAT16文件系统的根目录区(ROOT区)是固定区域、固定大小的,是从FAT区之后紧接着的32个扇区,最多保存512个目录项,作为系统区的一部分。
(六)目录区中的目录项变化较多,一个目录项仍占32字节,可以是文件目录项、子目录项、卷标项(仅跟目录有)、已删除目录项、长文件名目录项等。目录项中原来在DOS下保留未用的10个字节都有了新的定义,全部32字节的定义如下:
(1) 0-- 7字节 文件正名。
(2) 8--10字节 文件扩展名。
(3) 11字节 文件属性,按二进制位定义,最高两位保留未用,0至5位分别是只读位、隐藏位、系统位、卷标位、子目录位、归档位。
(4) 11--13字节 仅长文件名目录项用,用来存储其对应的短文件名目录项的文件名字节校验和等。
(5) 13--15字节 24位二进制的文件建立时间,其中的高5位为小时,次6位为分钟。
(6) 16--17字节 16位二进制的文件建立日期,其中的高7位为相对于1980年的年份值,次4位为月份,后5位为月内日期。
(7) 18--19字节 16位二进制的文件最新访问日期,定义同(6)。
(8) 20--21字节 起始簇号的高16位。
(9) 22--23字节 16位二进制的文件最新修改时间,其中的高5位为小时,次6位为分钟,后5位的二倍为秒数。
(10)24--25字节 16位二进制的文件最新修改日期,定义同(6)。
(11)26--27字节 起始簇号的低16位。
(12)28--31字节 32位的文件字节长度。
其中第(4)至(8)项为以后陆续定义的。 对于子目录项,其(12)为零;已删除目录项的首字节值为E5H。在可以使用长文件名的FAT32系统中,文件目录项保存该文件的短文件名,长文件名用若干个长文件名目录项保存,长文件名目录项倒序排在文件短目录项前面,全部是采用双字节内码保存的,每一项最多保存十三个字符内码,首字节指明是长文件名的第几项,11字节一般为0FH,12字节指明类型,13字节为校验和,26--27字节为零。
修复被CIH破坏的硬盘一例(FAT32)
1) 用无毒系统Windows 9X软盘启动计算机,进入CMOS SETUP,将系统日期修改为26日以前。
2) 用软盘重新引导计算机,运行FDISK /MBR,清除主引导记录MBR代码区。
3) 运行DEBUG,输入以下程序:
-a
XXXX:0100 mov ax,201
XXXX:0103 mov bx,1000
XXXX:0106 mov cx,1
XXXX:0109 mov dx,80
XXXX:010C int13
XXXX:010E int3
XXXX:010F [回车]
-g
....(显示寄存器结果,略去)
-f11BE 11FD 00
-f11FE 11FF 55 AA
-a100
XXXX:0100 mov ax,301
XXXX:0103 [回车]
-g=100
......
-q
以上程序清空分区表。或者,直接运行DISKEDIT,选择物理驱动器HARD DISK 1,按Alt-P
选择物理扇区,Side 0,Cylinder 0,Sector 1,用00清空偏移01BE至01FD,并在扇区最
后输入55,AA。在启动DISKEDIT后,系统自动设为READ ONLY,从菜单中选TOOLS-]CONFIGURATION,
清除READ ONLY标记并回车,就可以对硬盘进行写操作了。在写操作之后,按Ctrl-W存盘。
4) 清空分区表后,用NDD重建原分区。如果硬盘上还有除C以外的逻辑分区,可以一齐找回。
5) 为重建逻辑驱动器C,下面将计算FAT区:
a) Windows 9X操作系统的逻辑驱动器C的BOOT区在Cylinder 0,Side 1,Sector 1。
b) 用DISKEDIT的FIND功能寻找ASC II字符串:COMMAND COM
(COMMAND与COM中间有一个空格,ASC II值为20,找寻FDT表中的原因是,根目录中一般都有此文件,如果你的计算机里该文件不在根目录,就将上述字符串改为根目录中的其他文件名,如或MS
。但要注意文件名和后缀名之间要有空格,总长度为11字节)
c) 找到后,用PgUp向前翻页,直到上一扇区尾部出现连续的00
(一般说,没见过硬盘的最后几十K还有存放数据的情况,否则,Windows 9X的虚拟内存恐怕就没法建立了,)
d) 记录该扇区的Cylinder,Side,Sector值。——ROOT
e) 寻找FAT2的开始扇区,其特点是:
(要选中“Search at specified sector offset:[0...]”)
扇区偏移0000H处为F8 FF FF ;FAT16
扇区偏移0000H处为F8 FF FF FF ;FAT32
找到后,确认上一扇区尾部出现连续的00,则该扇区为FAT2头部。
(FAT1应与FAT2内容相同,但其头部数个扇区已被CIH破坏)
f) 记录该扇区的Cylinder,Side,Sector值。——FAT2
g) 计算FAT2的扇区数,用以下公式,其中,尾标0为FAT2地址,尾标1为ROOT地址:
扇区数=(Cylinder1-Cylinder0)*Sectors/Cylinder+(Side1-Side0)*Sides
*Sectors/Cylinder+Sector1-Sector0
说明:Sectors/Cylinder为每道扇区数,Sides为硬盘的总磁头数。一个简单的查看方法是:在DISKEDIT中按下[End]键,屏幕右下角的Sector值即为每道扇区数,而Side值+1即为总磁头数。FAT1扇区数与FAT2相同。
h) 计算出FAT1头部地址,并记录。——FAT1
i) 在DISKEDIT中按Alt-P重选Physical Sector,起始地址为步骤e)记录的地址。扇区数为步骤g)计算出的扇区数。按Alt-W将选中的扇区(即FAT2)存至FAT1开始的地址(步骤h)计算出的FAT1头部)。
j) 至此,FAT2-]FAT1的恢复工作宣告结束。
6) 下面恢复主引导记录中的标志:
用DISKEDIT选择Cylinder 0,Side 0,Sector 1,将此扇区尾部偏移为01C2H地址的标志修复。如果为FAT16系统,应为06H;如果为FAT32系统,应为0CH。均表示PRI-DOS分区。
7) 恢复BOOT扇区,位置在Cylinder 0,Side 1,Sector 1,以下用0-1-1表示,以此类推。
a) 在步骤5)中,已计算出了FAT1的起始位置。在FAT16系统中,FAT1一般自0-1-2开始;在FAT32系统中,FAT1一般自0-1-33开始。如果你的系统与此不同,以实际计算出的数值为准。
b) 将FAT1的起始扇区号减1,就是系统的隐含扇区数,一般FAT16为1,FAT32为32。
c) 如为FAT16系统,跳过本步骤,至d)。
选择一台无毒的FAT32系统作参考,将0-1-1至FAT1前面的隐含扇区保存到
FAT16/FAT32文件系统介绍
本文旨在给通用PC或数码相机用户介绍文件分配表(FAT)和簇的概念和意义,并介绍12位、16位和32位FAT的特点和不同应用以及未来的发展趋势。
在开发最初的个人计算机时,人们用180KB的软磁盘,不久便采用360KB的双面磁盘。为了组织这些存储设备上数据,最初的DOS系统开发者设计一个表来指示哪个扇区属于哪些文件,以及哪些扇区空闲,这样操作系统可以最大限度地利用这些磁盘空间,使文件可以存储在不连续的扇区上。文件数据可以分散有组织地存储在磁盘的不同扇区,这称为文件分割。
由于在360KB磁盘上有720个扇区,因此,表要做得足够大以能标识每个扇区,并预留一些空间以备未来采用更大存储空间的磁盘。表中的每个记录只用一个字节,这样只能有256个可能值,不能满足这么多扇区的需要。如果采用两个字节则最多可以有65,536个记录,但这样将浪费磁盘空间。因此,综合这两种情况,决定采用12位作为表记录的长度来跟踪磁盘上扇区的利用情况。采用12位长度可以有4,096个可能值,如果每个表记录对应一个512字节扇区,那么这个FAT表可以处理高达2MB存储容量的存储设备。
但要从这么长的表中得到需要的信息将花太长时间,因此,人们引入了簇(cluster)的概念。这使设备的最小存储单元从单个扇区增加到固定数量扇区,这些固定数量扇区称为簇。对于180KB磁盘,簇的大小为两个扇区(1,024字节)。因此,如果要保存一个500字节的文件,将占用磁盘上1,024个字节。这看上去会浪费,但实际上簇的概念在存储大文件时效果很好,而实际上多数系统和用户文件都是较大的。表1列出FAT所能代表簇的最大数字。
簇的概念
磁盘上最小可寻址存储单元称为扇区,通常每个扇区为512个字节(或字符)。由于多数文件比扇区大得多,因此如果对一个文件分配最小的存储空间,将使存储器能存储更多数据,这个最小存储空间即称为簇。根据存储设备(磁盘、闪卡和硬盘)的容量,簇的大小可以不同以使存储空间得到最有效的应用。在早期的360KB磁盘上,簇大小为2个扇区(1,024字节);第一批的10MB硬盘的簇大小增加到8个扇区(4,096字节);现在的小型闪存设备上的典型簇大小是8KB或16KB。2GB以上的硬盘驱动器有32KB的簇。表2列出在给定簇大小和FAT类型的最大分区。
为什么采用簇呢?通常,存储设备上的空间分配是随机的。在一个新存储设备上,文件连续存储,并知道开始和结束扇区和长度,在读取时可以根据这些信息重新得到所存储的文件。但是,过一段时间后,有些文件将会被擦掉,同时可能有些文件增大,这时不能保证同一个文件存储在连续的一系列扇区里。因此,需要一种方法来辨别哪个扇区被分配到某些文件,以及还有哪些扇区可用。这时可以采用一种表结构来实现这种功能,使每个扇区对应一个表记录。然而,由于大多数文件存储在多个扇区,一个记录对应一个扇区的作法将造成一些浪费。因此,采用每个记录代表一个固定数量扇区将更有意义,这个固定扇区被称为簇。
给文件分配扇区
如果给一个文件(簇)分配的最小存储空间大小取决于保存该文件的介质类型,我们必须有一种方法来标明某个簇是否可用或者已分配给一个文件。如果已将一个簇分配给一个文件,我们必须知道这个簇分配给文件的哪部分了,这就是通过一个链接列表来实现,即文件分配表(FAT)。FAT仅仅是一个包含N个整数的列表,N是存储设备上最大的簇数。表中每个记录的位数称为FAT大小,是12、16或32三个数之一。早期的存储设备使用12位(1.5字节)FAT以减少浪费,12位可以提供4,096个簇。假定一个簇具有两个扇区(1,024字节),则代表存储设备将近有4.2MB存储容量。更大的簇就能实现更大的存储空间,但是在存储较小文件时,由于簇没有完全装满而将造成存储空间的浪费。
操作系统根据表现整个磁盘空间所需要的簇数量来确定使用多大的FAT。如果磁盘要求的簇少于4,096个,则可以使用12位FAT;如果小于65,536但大于4,096个簇,就使用16位FAT;否则,必须采用32位FAT。在存储设备的第一个扇区内以数据列表的形式定义了簇的大小,该数据列表被称为BIOS参数块。在系统引导期间操作系统可以读该扇区,这样就能设定如何从存储设备中读取文件。
FAT是一种链接列表,链接列表中相关记录之间互相指向对方。在存储设备目录中包含了FAT表名称、该文件大小和分配给该文件的第一个簇的编号。存储该文件的第一个簇所对应的表记录中包含了该文件的第二个簇号码。同样,第二个簇对应的记录里包含有存储该文件的第三个簇编号,以此类推直到该文件的最后一个簇。在新存储设备上存储的第一个文件将保存在连续的簇内,因此第一个簇会指向第二个,第二个指向第三个,如此类推。
实际上,第一个簇(簇0)总是保留用于存储操作系统信息、根目录和两份FAT。系统建立两份FAT,其目的是在当修改其中一个时如果系统发生中断(崩溃),另一份还完整无缺,恢复程序会检查FAT并使用这份FAT来恢复。
FAT的作用
那么FAT的重要意义是什么呢?当前的闪存设备使用12位FAT或16位FAT,数码相机和MP3播放器被设计成利用这种表结构进行读写。随着4GB微硬盘逐渐进入实际应用,16位FAT将不能够满足这种硬盘的需求,因为16位FAT只能实现65,536个簇,对于最大的32K字节的簇而言只能提供最大2.14GB的容量。对于更大容量存储设备有两个解决方案,即将FAT增加到32位或者将驱动器分成多个区。
簇的概念
存储器分区
一个存储设备可以分成多个区(其中每个区看起来像单独的存储设备),每个区有自己的目录和FAT。大多数工程师在自己的PC硬盘上已经体验过多分区,通常仅有一个硬盘的计算机具有“C:”和“D:”盘。
多数便携式设备如数码相机和MP3播放器都没有设计成采用存储器分区,而PDA是真正的计算机,其文件系统程序是按分区来设计的。以数码相机市场为例,存储器必须只有单个分区才能兼容。对用户来说,每个区有自己的逻辑驱动器字母,通常指定为驱动器“C:”、
“D:”和“E:”等。
FAT兼容性
在一个兼容FAT32的主机里可以无缝使用FAT16存储设备,因为支持FAT32的操作系统也支持FAT16。唯一需要注意的是在对FAT16设备重新格式化的时候,有些兼容FAT32的主机(如一些PDA)在没有特别选择下会默认为FAT32格式。第一次对存储设备格式化时,必须认真观察提示以保证用的是FAT16格式,除非你的相机/PDA/MP3播放器支持FAT32。
在一个兼容FAT16的主机里使用FAT32设备会有几个可能结果,最普遍的是在显示屏上显示的“CF错误”指示。如果4GB的存储器在只兼容FAT16的主机里格式化,将可能不出现错误提示,但显示的容量将为2G。通常,不同的程序设计工程师会采用不同的方法来处理这个问题,对于这个特例,其结果不是总可预测的。如果4GB设备是用FAT16来格式化,就能在兼容FAT32的主机里对这个设备重新格式化,只要在格式化期间规定了FAT32。这样,用户可以在兼容FAT32的主机里恢复整个4GB容量。
本文小结
由于相机和MP3播放器在处理多分区上有困难,FAT32是提供它们超过2.14GB存储容量的唯一途径。所以,有些公司推出新的4GB微驱动器在出厂前将采用FAT32格式化。为实现与更多设备的兼容,2GB的微驱动器将继续使用FAT16,其他容量超过2GB的CF设备必须采用FAT32。目前,有几家公司已经在其相机和MP3播放器中支持FAT32,现在多数有CF插槽的PDA都支持FAT32。如果你计划要购买一台新的数码相机或MP3播放器,最好能验证它是否支持FAT32,以便将来与最新的CF存储设备兼容。
FAT32文件系统简介
Windows95 OSR2和Windows 98开始支持FAT32 文件系统,它是对早期DOS的FAT16文件系统
的增强,由于文件系统的核心--文件分配表FAT由16位扩充为32位,所以称为FAT32文件系
统。在一逻辑盘(硬盘的一分区)超过 512 兆字节时使用这种格式,会更高效地存储数
据,减少硬盘空间的浪费,一般还会使程序运行加快,使用的计算机系统资源更少,因此
是使用大容量硬盘存储文件的极有效的系统。本人对Windows 98下的FAT32 文件系统做了
分析实验,总体上与FAT16文件系统变化不大,现将有关变化部分简介如下:
(一)FAT32 文件系统将逻辑盘的空间划分为三部分,依次是引导区(BOOT区)、文
件分配表区(FAT区)、数据区(DATA区)。引导区和文件分配表区又合称为系统区。
(二)引导区从第一扇区开始,使用了三个扇区,保存了该逻辑盘每扇区字节数,每
簇对应的扇区数等等重要参数和引导记录。之后还留有若干保留扇区。而FAT16文件系统的
引导区只占用一个扇区,没有保留扇区。
(三)文件分配表区共保存了两个相同的文件分配表,因为文件所占用的存储空间
(簇链)及空闲空间的管理都是通过FAT实现的,FAT如此重要,保存两个以便第一个损坏
时,还有第二个可用。文件系统对数据区的存储空间是按簇进行划分和管理的,簇是空间
分配和回收的基本单位,即,一个文件总是占用若干个整簇,文件所使用的最后一簇剩余
的空间就不再使用,而是浪费掉了。
从统计学上讲,平均每个文件浪费0.5簇的空间,簇越大,存储文件时空间浪费越多,
利用率越低。因此,簇的大小决定了该盘数据区的利用率。FAT16系统簇号用16位二进制数
表示,从0002H到FFEFH个可用簇号(FFF0H到FFFFH另有定义,用来表示坏簇,文件结束簇
等),允许每一逻辑盘的数据区最多不超过FFEDH(65518)个簇。FAT32系统簇号改用32位二
进制数表示,大致从00000002H到FFFFFEFFH个可用簇号。FAT表按顺序依次记录了该盘各簇
的使用情况,是一种位示图法。
每簇的使用情况用32位二进制填写,未被分配的簇相应位置写零;坏簇相应位置填入
特定值;已分配的簇相应位置填入非零值,具体为:如果该簇是文件的最后一簇,填入的
值为FFFFFF0FH,如果该簇不是文件的最后一簇,填入的值为该文件占用的下一个簇的簇
号,这样,正好将文件占用的各簇构成一个簇链,保存在FAT表中。0000000H、00000001H
两簇号不使用,其对应的两个DWORD位置(FAT表开头的8个字节)用来存放该盘介质类型编
号。FAT表的大小就由该逻辑盘数据区共有多少簇所决定,取整数个扇区。
(四)FAT32系统一簇对应8个逻辑相邻的扇区,理论上,这种用法所能管理的逻辑盘
容量上限为16TB(16384GB),容量大于16TB时,可以用一簇对应16个扇区,依此类推。
FAT16系统在逻辑盘容量介于128MB到256MB时,一簇对应8个扇区,容量介于256MB到512MB
时,一簇对应16个扇区,容量介于512MB到1GB时,一簇对应32个扇区,容量介于1GB到2GB
时,一簇对应32个扇区,超出2GB的部分无法使用。显然,对于容量大于512MB的逻辑盘,
采用FAT32的簇比采用FAT16的簇小很多,大大减少了空间的浪费。
但是,对于容量小于512MB的盘,采用FAT32虽然一簇8个扇区,比使用FAT16一簇16个
扇区,簇有所减小,但FAT32的FAT表较大,占用空间较多,总数据区被减少,两者相抵,
实际并不能增加有效存储空间,所以微软建议对小于512M的逻辑盘不使用FAT32。
另外,对于使用FAT16文件系统的用户提一建议,硬盘分区时,不要将分区(逻辑盘)容
量正好设为某一区间的下限,例:将一逻辑盘容量设为1100M(稍大于1024M),则使用时其
有效存储容量比分区为950M的一般还少,因其簇大一倍,浪费的空间较多。还有,使用
FDISK等对分区指定容量时,由于对1MB的定义不一样(标准的二进制的1MB为1048576B,有
的系统将1MB理解为1000000B,1000KB等),及每个分区需从新磁道开始等因素,实际分配的
容量可能稍大于指定的容量,亦需注意掌握。
(五)根目录区(ROOT区)不再是固定区域、固定大小,可看作是数据区的一部分。
因为根目录已改为根目录文件,采用与子目录文件相同的管理方式,一般情况下从第二簇
开始使用,大小视需要增加,因此根目录下的文件数目不再受最多512的限制。FAT16文件
系统的根目录区(ROOT区)是固定区域、固定大小的,是从FAT区之后紧接着的32个扇区,
最多保存512个目录项,作为系统区的一部分。
(六)目录区中的目录项变化较多,一个目录项仍占32字节,可以是文件目录项、子
目录项、卷标项(仅跟目录有)、已删除目录项、长文件名目录项等。目录项中原来在DOS下
保留未用的10个字节都有了新的定义,全部32字节的定义如下:
(1) 0-- 7字节 文件正名。
(2) 8--10字节 文件扩展名。
(3) 11字节 文件属性,按二进制位定义,最高两位保留未用,0至5位分别是只读位、隐藏
位、系统位、卷标位、子目录位、归档位。
(4) 11--13字节 仅长文件名目录项用,用来存储其对应的短文件名目录项的文件名字节校
验和等。
(5) 13--15字节 24位二进制的文件建立时间,其中的高5位为小时,次6位为分钟。
(6) 16--17字节 16位二进制的文件建立日期,其中的高7位为相对于1980年的年份值,次4
位为月份,后5位为月内日期。
(7) 18--19字节 16位二进制的文件最新访问日期,定义同(6)。
(8) 20--21字节 起始簇号的高16位。
(9) 22--23字节 16位二进制的文件最新修改时间,其中的高5位为小时,次6位为分钟,后
5位的二倍为秒数。
(10)24--25字节 16位二进制的文件最新修改日期,定义同(6)。
(11)26--27字节 起始簇号的低16位。
(12)28--31字节 32位的文件字节长度。
其中第(4)至(8)项为以后陆续定义的。 对于子目录项,其(12)为零;已删除目录项的
首字节值为E5H。在可以使用长文件名的FAT32系统中,文件目录项保存该文件的短文件
名,长文件名用若干个长文件名目录项保存,长文件名目录项倒序排在文件短目录项前
面,全部是采用双字节内码保存的,每一项最多保存十三个字符内码,首字节指明是长文
件名的第几项,11字节一般为0FH,12字节指明类型,13字节为校验和,26--27字节为零。
(七)以前版本的 Windows 和DOS与 FAT32 不兼容,不能识别FAT32分区,有些程序
也依赖于 FAT16 文件系统,不能和 FAT32 驱动器一道工作。将硬盘转换为 FAT32,就不
能再用双引导运行以前版本的 Windows(Windows 95 [Version 4.00.950]、Windows NT
3.x、Windows NT 4.0 和 Windows 3.x)。
NTFS、FAT、FAT16、FAT32的区别
(2010-01-27 19:10:44)
FAT16:FAT16就是FAT,以前用的DOS、Windows 95都使用FAT16文件系统,现在常用的Windows 98/2000/XP等系统均支持FAT16文件系统。它最大可以管理大到2GB的分区,但每个分区最多只能有65525个簇(簇是磁盘空间的配置单位)。随着硬盘或分区容量的增大,每个簇所占的空间将越来越大,从而导致硬盘空间的浪费。
FAT32:随着大容量硬盘的出现,从Windows 98开始,FAT32开始流行。它是FAT16的增强版本,可以支持大到2TB(2048GB)的分区。FAT32使用的簇比FAT16小,从而有效地节约了硬盘空间。FAT32是FAT16文件系统的派生,比
FAT16 支持更小的簇和更大的分区,这就使得 FAT32 分区的空间分配更有效率。FAT32主要应用于Windows 98及后续Windows系统(实际从未正式发布的Windows 97,即OSR2就开始支持了),它可以增强磁盘性能并增加可用磁盘空间,同时也支持长文件名。
NTFS(New Technology File System):微软Windows NT内核的系列操作系统支持的、一个特别为网络和磁盘配额、文件加密等管理安全特性设计的磁盘格式。它与旧的FAT文件系统的主要区别是NTFS支持元数据(metadata),并且可以利用先进的数据结构提供更好的性能、稳定性和磁盘的利用率。随着以NT为内核的Windows 2000/XP的普及,很多个人用户开始用到了NTFS。NTFS也是以簇为单位来存储数据文件,但NTFS中簇的大小并不依赖于磁盘或分区的大小。簇尺寸的缩小不但降低了磁盘空间的浪费,还减少了产生磁盘碎片的可能。NTFS支持文件加密管理功能,可为用户提供更高层次的安全保证。NTFS有三个版本:在NT 3.51和NT 4中的1.2版,Windows 2000中的3.0版和Windows
XP中的3.1版。这些版本有时被提及为4.0版、5.0版和5.1版。更新的版本添加了额外的特性,比如Windows 2000引入了配额。在兼容性方面,Windows的95/98/98SE和Me版都不能识别NTFS文件系统。
下面介绍每个文件系统与各种操作系统的兼容性:
NTFS:运行 Windows XP 或 Windows 2000 的计算机可以访问 NTFS 分区上的文件。运行带有 Service Pack 4(或更高版本)的 Windows NT 4.0 的计算机可能可以访问某些文件。其它操作系统则无法访问。
FAT:可以通过 MS-DOS、所有版本的 Windows、Windows NT、Windows 2000、Windows XP 和 OS/2 进行访问。
FAT32:只能通过 Windows 95 OSR2、Windows 98、 Windows Millennium Edition、Windows 2000 和Windows XP 进行访问。
下面是每个文件系统支持的磁盘和文件大小:
NTFS:推荐的最小容量大约为 10 MB,也可使用大于 2 TB 的卷。无法在软盘上使用。文件大小只受卷的容量限制。
FAT:容量可从软盘大小到 4 GB。不支持域。最大文件大小为2 GB。
FAT32:容量从 512 MB 到 2 TB。在 Windows XP 中,只能格式化最多达 32 GB 的 FAT32 卷。不支持域。最大文件大小为4 GB。
FAT32与NTFS的区别
在推出FAT32文件系统之前,通常PC机使用的文件系统是FAT16。像基于MS-DOS,Win 95等系统都采用了FAT16文件系统。在Win 9X下,FAT16支持的分区最大为2GB。我们知道计算机将信息保存在硬盘上称为“簇”的区域内。使用的簇越小,保存信息的效率就越高。在FAT16的情况下,分区越大簇就相应的要增大,存储效率就越低,势必造成存储空间的浪费。并且随着计算机硬件和应用的不断提高,FAT16文件系统已不能很好地适应系统的要求。在这种情况下,推出了增强的文件系统FAT32。同FAT16相比,FAT32主要具有以下特点:
1. 同FAT16相比FAT32最大的优点是可以支持的磁盘大小达到2TB(2047GB),但是不能支持小于512MB的分区。基于FAT32的Win 2000可以支持分区最大为32GB;而基于 FAT16的Win 2000支持的分区最大为4GB。
2. 由于采用了更小的簇,FAT32文件系统可以更有效率地保存信息。如两个分区大小都为2GB,一个分区采用了FAT16文件系统,另一个分区采用了FAT32文件系统。采用FAT16的分区的簇大小为32KB,而FAT32分区的簇只有4KB的大小。这样FAT32就比FAT16的存储效率要高很多,通常情况下可以提高15%。
3. FAT32文件系统可以重新定位根目录和使用FAT的备份副本。另外FAT32分区的启动记录被包含在一个含有关键数据的结构中,减少了计算机系统崩溃的可能性。
NTFS文件系统
NTFS文件系统是一个基于安全性的文件系统,是Windows NT所采用的独特的文件系统结构,它是建立在保护文件和目录数据基础上,同时照顾节省存储资源、减少磁盘占用量的一种先进的文件系统。使用非常广泛的Windows NT 4.0采用的就是NTFS 4.0文件系统,相信它所带来的强大的系统安全性一定给广大用户留下了深刻的印象。Win 2000采用
了更新版本的NTFS文件系统??NTFS 5.0,它的推出使得用户不但可以像Win 9X那样方便快捷地操作和管理计算机,同时也可享受到NTFS所带来的系统安全性。
NTFS 5.0的特点主要体现在以下几个方面:
1. NTFS可以支持的分区(如果采用动态磁盘则称为卷)大小可以达到2TB。而Win 2000中的FAT32支持分区的大小最大为32GB。
2. NTFS是一个可恢复的文件系统。在NTFS分区上用户很少需要运行磁盘修复程序。NTFS通过使用标准的事物处理日志和恢复技术来保证分区的一致性。发生系统失败事件时,NTFS使用日志文件和检查点信息自动恢复文件系统的一致性。
3. NTFS支持对分区、文件夹和文件的压缩。任何基于Windows的应用程序对NTFS分区上的压缩文件进行读写时不需要事先由其他程序进行解压缩,当对文件进行读取时,文件将自动进行解压缩;文件关闭或保存时会自动对文件进行压缩。
4. NTFS采用了更小的簇,可以更有效率地管理磁盘空间。在Win 2000的FAT32文件系统的情况下,分区大小在2GB~8GB时簇的大小为4KB;分区大小在8GB~16GB时簇的大小为8KB;分区大小在16GB~32GB时,簇的大小则达到了16KB。而Win 2000的NTFS文件系统,当分区的大小在2GB以下时,簇的大小都比相应的FAT32簇小;当分区的大小在2GB以上时(2GB~2TB),簇的大小都为4KB。相比之下,NTFS可以比FAT32更有效地管理磁盘空间,最大限度地避免了磁盘空间的浪费。
5. 在NTFS分区上,可以为共享资源、文件夹以及文件设置访问许可权限。许可的设置包括两方面的内容:一是允许哪些组或用户对文件夹、文件和共享资源进行访问;二是获得访问许可的组或用户可以进行什么级别的访问。访问许可权限的设置不但适用于本地计算机的用户,同样也应用于通过网络的共享文件夹对文件进行访问的网络用户。与FAT32文件系统下对文件夹或文件进行访问相比,安全性要高得多。另外,在采用NTFS格式的Win 2000中,应用审核策略可以对文件夹、文件以及活动目录对象进行审核,审核结果记录在安全日志中,通过安全日志就可以查看哪些组或用户对文件夹、文件或活动目录对象进行了什么级别的操作,从而发现系统可能面临的非法访问,通过采取相应的措施,将这种安全隐患减到最低。这些在FAT32文件系统下,是不能实现的。
6. 在Win 2000的NTFS文件系统下可以进行磁盘配额管理。磁盘配额就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。设置磁盘配额后,可以对每一个用户的磁盘使用情况进行跟踪和控制,通过监测可以标识出超过配额报警阈值和配额限制的用户,从而采取相应的措施。磁盘配额管理功能的提供,使得管理员可以方便合理地为用户分配存储资源,避免由于磁盘空间使用的失控可能造成的系统崩溃,提高了系统的安全性。
7. NTFS使用一个“变更”日志来跟踪记录文件所发生的变更。
小提示(选取FAT32和NTFS的建议)
在系统的安全性方面,NTFS文件系统具有很多FAT32文件系统所不具备的特点,而且基于NTFS的Win 2000运行要快于基于FAT32的Win 2000;而在与Win 9X的兼容性方面,FAT32优于NTFS。所以在决定Win 2000中采用什么样的文件系统时应从以下几点出发:
1. 计算机是单一的Win 2000系统,还是采用多启动的Win 2000系统;
2. 本地安装的磁盘的个数和容量;
3. 是否有安全性方面的考虑等。
基于以上的考虑,如果要在Win 2000中使用大于32GB的分区的话,那么只能选择NTFS格式。如果计算机作为单机使用,不需要考虑安全性方面的问题,更多地注重与Win 9X的兼容性,那么FAT32是最好的选择。如果计算机作为网络工作站或更多的追求系统的安全性,而且可以在单一的Win 2000模式下运行,强烈建议所有的分区都采用NTFS格式;如果要兼容以前的应用,需要安装Win 9X或其它的操作系统,建议做成多启动系统,这就需要两个以上的分区,一个分区采用NTFS格式,另外的分区采用FAT32格式,同时为了获得最快的运行速度建议将Win 2000的系统文件放置在NTFS分区上,其它的个人文件则放置在FAT32分区中
别让文件系统迷糊你——NTFS、FAT32解析
经常使用电脑的用户一定经历过重装系统、重新分区、分区文件的一些转换这些操作,而其中一定会遇到NTFS、FAT32问题,若不正确的选择或错误的分区,则会导致某些文件操作无法完成或出现兼容性的问题,随着操作系统的不断更新,FAT32逐渐走出历史的舞台,但许多刚接触电脑的用户一定常被这两种分区弄迷糊,今天小编就对NTFS、FAT32两种形式进行详细介绍,彻底将这两种形式存在的各种迷团揭开。
NTFS、FAT32解析:
NTFS :
NTFS全称为:New Technology File System,是Windows NT操作环境和Windows NT高级服务器网络操作系统环
境的文件系统,用来代替FAT文件系统,NTFS通过可恢复能力(事件跟踪)和热定位的容错特征实现,增加功能性的一个平台,并增加对POSIX需求的支持,消除FAT和HPFS文件系统中的限制。
NTFS提供长文件名、数据保护和恢复,并通过目录和文件许可实现安全性,NTFS支持大硬盘和在多个硬盘上存储文件,提供内置安全性特征,控制文件的隶属关系和访问,从DOS或其他操作系统上不能直接访问 NTFS分区上的文件。
FAT 32:
FAT32实际上是文件分区表采取的一种形式,该标准的是相对于FAT16而言的,而最早的FAT32是在Windows95OSR2中第一次出现的,FAT32能大限度的节约磁盘空间。在推出FAT32文件系统之前,通常PC机使用的文件系统是FAT16,如基于MS-DOS,Win 95等系统都采用了FAT16文件系统,在Win 9X下,FAT16支持的分区最大为2GB,文件在磁盘上是以簇的方式存放的,但簇里仅能存放一个文件,FAT32的优势就在于其能够将簇的大小控制到最小,使用的簇越小,这样在相同大小的盘符内FAT32的形式则能存放更多的文件。
相比FAT16,FAT32有如下特点:
1.同FAT16相比FAT32最大的优点是可以支持的磁盘大小达到2TB(2048GB),但是不能支持小于512MB的分区。
2.由于采用了更小的簇,FAT32文件系统可以更有效率地保存信息。
32文件系统可以重新定位根目录和使用FAT的备份副本,分区的启动记录被包含在一个含有关键数据的结构中,减少了系统崩溃的可能性,保持系统的稳定运行。
NTFS相对FAT的优点:
1.具备错误预警系统
在NTFS分区中,最开始的16个扇区是分区引导扇区,其中保存着分区引导代码,接着就是主文件表(Master File
Table,简称MFT),如果其所在的磁盘扇区恰好出现损坏,NTFS文件系统会比较智能地将MFT换到硬盘的其他扇区,保证了文件系统的正常使用,确保了Windows的稳定运行,而以往的FAT32则只能固定在分区引导扇区的后面,一旦遇到扇区损坏,则会造成整个文件系统的瘫痪。
2.高效读取速度
对比FAT32,NTFS在文件的读取速度上更为高效,在NTFS文件系统中的文件属性可以分成常驻属性和非常驻属性两类:
①常驻属性
NTFS中的常驻属性直接保存在MFT中,如文件名和相关时间信息都属于常驻属性。
②非常驻属性
非常驻属性保存在MFT之外,使用一种复杂的索引方式来进行指示,导致读取速度相对较慢。
系统中的多数常用文件都为MFT,熟悉系统的用户都应该知道MFT是随系统启动就会载入到内存中的,因此已处于缓存状态的MFT文件则能高效的被用户访问,NTFS的高效性也就得于此。
3.磁盘修复功能
NTFS采用一种可修复的系统,可以对硬盘上的逻辑错误和物理错误进行自动侦测和修复,在FAT16和FAT32时代,用户需要借助Scandisk这个程序来标记磁盘上的坏扇区,但当发现错误时,数据往往已经被写在了坏的扇区上了,损失已经造成。
NTFS文件系统则彻底避免了这个问题,在每次读写时,其都会检查扇区正确与否,当读取时发现错误,NTFS会报告这个错误,而当向磁盘写文件时发现错误,NTFS会自动更换正常的位置存储数据,操作不会受到任何影响,在这两种情况下,NTFS都会在坏扇区上作标记,协助用户进行各种处理,这样的工作模式可以使磁盘错误可以较早地被发现,避免灾难性的事故发生。
4.事件日志功能
在NTFS文件系统中,任何操作都被记录成为“事件”,这样的记录方式相当于监督着整个操作,若操作过程中出现断电、死机等突发性的状况,NTFS则可以在来电后重新完成刚才的事件,事件日志的作用并不在于能直接挽回损失,而在于其能够监督所有事件,从而让系统明确完成了哪些任务,那些任务还没有完成,保证系统不会因为突发事件而导致更大的损失,将各类文件、数据的安全性进一步提高。
5.动态磁盘功能
动态磁盘是从Windows 2000时代开始的新特性,Windows Server 2003继续使用了这个相当棒的特性,相比基本磁盘,其提供更加灵活的管理和使用特性,用户可以在动态磁盘上实现数据的容错、高速的读写操作、相对随意的修改卷大小等操作,而不能在基本磁盘上实现。
动态磁盘没有卷数量的限制,只要磁盘空间允许,用户就可以在动态磁盘中任意建立卷,并可以将数块磁盘中的空余磁盘空间扩展到同一个卷中来增大卷的容量,目前采用NTFS系统的磁盘读写速度均由硬件决定,并不存在任何以往的软件瓶颈问题,高端硬件的性能得到充分的发挥。
目前主流的文件系统为NTFS,但许多用户在电脑的使用中也会遇到FAT32形式,通过小编上面的介绍,相信对于文件系统的NTFS与FAT32,大家都有了较明确的认识,对于两者之间的区别再不会迷糊。
FAT文件系统原理一[转]
FAT文件系统原理
——
表1 分区表参数
文本结构索引:
图片表格索引:
表2 扩展分区表项的内容
表3 FAT32分区DBR的位置划分
表4 FAT32分区的BPB字段
一、硬盘的物理结构
图1 硬盘的物理结构
二、硬盘的逻辑结构
3.1 MBR扇三、磁盘引区
导原理
3.2 扩展分区
图2 winhex下的磁盘MBR
图3 winhex给出的MBR参数的意表5 FAT32分区的扩展BPB字
义
段
图4 分区表类型标志
表6 FAT16分区上的DBR组成
4.1
4.1.1 FAT32 DBR扇
图5 一个4分区的磁盘结构图示
表7 FAT16分区的BPB字段
关于区
4.1.2 FAT16 DBR扇区
图6 分区表链接图示
表8 FAT16分区的扩展BPB字段
表9 FAT16分区大小与对因簇大小
DBR
四、FAT分区原理
4.2 关于保留扇区
图7 磁盘的整体结构图示
图8 winhex下的FAT32基本分区DBR图
表11 FAT16目录项的定义
4.3 FAT表和数据的存4.3.1 存储过程假想
图9 winhex给出的图8DBR参数表12 FAT32分区大小与对因簇说明
大小
储原则
4.3.2 FAT16存储原理
图10 winhex所截FAT16的文件分配表
表13 FAT表的取值含义
4.3.3 FAT32存储原理
图4.3.11 Fat16的组织形式
表14 FAT32短文件目录项的定义
表15 FAT32长文件目录项的定义
五、结束
图4.3.12 Fat32的组织形式
一、硬盘的物理结构:
硬盘存储数据是根据电、磁转换原理实现的。硬盘由一个或几个表面镀有磁性物质的金属或玻璃等物质盘片以及盘片两面所安装的磁头和相应的控制电路组成(图1),其中盘片和磁头密封在无尘的金属壳中。
硬盘工作时,盘片以设计转速高速旋转,设置在盘片表面的磁头则在电路控制下径向移动到指定位置然后将数据存储或读取出来。当系统向硬盘写入数据时,磁头中“写数据”电流产生磁场使盘片表面磁性物质状态发生改变,并在写电流磁场消失后仍能保持,这样数据就存储下来了;当系统从硬盘中读数据时,磁头经过盘片指定区域,盘片表面磁场使磁头产生感应电流或线圈阻抗产生变化,经相关电路处理后还原成数据。因此只要能将盘片表面处理得更平滑、磁头设计得更精密以及尽量提高盘片旋转速度,就能造出容量更大、读写数据速度更快的硬盘。这是因为盘片表面处理越平、转速越快就能越使磁头离盘片表面越近,提高读、写灵敏度和速度;磁头设计越小越精密就能使磁头在盘片上占用空间越小,使磁头在一张盘片上建立更多的磁道以存储更多的数据。
[返回索引]
二、硬盘的逻辑结构。
硬盘由很多盘片(platter)组成,每个盘片的每个面都有一个读写磁头。如果有N个盘片。就有2N个面,对应2N个磁头(Heads),从0、1、2开始编号。每个盘片被划分成若干个同心圆磁道(逻辑上的,是不可见的。)每个盘片的划分规则通常是一样的。这样每个盘片的半径均为固定值R的同心圆再逻辑上形成了一个以电机主轴为轴的柱面
(Cylinders),从外至里编号为0、1、2……每个盘片上的每个磁道又被划分为几十个扇区(Sector),通常的容量是512byte,并按照一定规则编号为1、2、3……形成Cylinders×Heads×Sector个扇区。这三个参数即是硬盘的物理参数。我们下面的很多实践需要深刻理解这三个参数的意义。
[返回索引]
三、磁盘引导原理。
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引导代码可能并非这样。不过即使不同,所执行的功能大体是一样的。这是wowocock关于磁盘mbr的反编译,已加了详细的注释,感兴趣可以细细研究一下。
我们看DPT部分。操作系统为了便于用户对磁盘的管理。加入了磁盘分区的概念。即将一块磁盘逻辑划分为几块。磁盘分区数目的多少只受限于C~Z的英文字母的数目,在上图DPT共64个字节中如何表示多个分区的属性呢?microsoft通过链接的方法解决了这个问题。在DPT共64个字节中,以16个字节为分区表项单位描述一个分区的属性。也就是说,第一个分区表项描述一个分区的属性,一般为基本分区。第二个分区表项描述除基本分区外的其余空间,一般而言,就是我们所说的扩展分区。这部分的大体说明见表1。
表1 图2分区表第一字段
字节位移
字段长值
字段名和定义
度
引导指示符(Boot
0x01BE
BYTE
0x80
Indicator) 指明该分区是否是活动分区。
0x01BF
BYTE
0x01
开始磁头(Starting Head)
开始扇区(Starting
Sector) 只用了0~5位。0x01C0
6位
0x01
后面的两位(第6位和第7位)被开始柱面字段所使用
开始柱面(Starting
Cylinder) 除了开始扇区字段的最后两位外,0x01C1
10位
0x00
还使用了1位来组成该柱面值。开始柱面是一个10位数,最大值为1023
系统ID(System ID) 定0x01C2
BYTE
0x07
义了分区的类型,详细定义,请参阅图4
0x01C3
BYTE
0xFE
结束磁头(Ending Head)
结束扇区(Ending
0x01C4
6位
0xFF
Sector) 只使用了0~5位。最后两位(第6、7位)被结束柱面字段所使用
结束柱面(Ending
Cylinder) 除了结束扇区字段最后的两位外,还0x01C5
10位
0x7B
使用了1位,以组成该柱面值。结束柱面是一个10位的数,最大值为1023
相对扇区数(Relative
0x01C6
DWORD
0x0000003F
Sectors) 从该磁盘的开始到该分区的开始的位移量,以扇区来计算
总扇区数(Total Sectors)
该分区中的扇区总数
0x01CA
DWORD
0x00DAA83D
[返回索引]
注:上表中的超过1字节的数据都以实际数据显示,就是按高位到地位的方式显示。存储时是按低位到高位存储的。两者表现不同,请仔细看清楚。以后出现的表,图均同。
也可以在winhex中看到这些参数的意义:
[返回索引]
说明:每个分区表项占用16个字节,假定偏移地址从0开始。如图3的分区表项3。分区表项4同分区表项3。
1、0H偏移为活动分区是否标志,只能选00H和80H。80H为活动,00H为非活动。其余值对microsoft而言为非法值。
2、重新说明一下(这个非常重要):大于1个字节的数被以低字节在前的存储格式格式(little endian format)或称反字节顺序保存下来。低字节在前的格式是一种保存数的方法,这样,最低位的字节最先出现在十六进制数符号中。例如,相对扇区数字段的值0x3F000000的低字节在前表示为0x0000003F。这个低字节在前的格式数的十进制数为63。
3、系统在分区时,各分区都不允许跨柱面,即均以柱面为单位,这就是通常所说的分区粒度。有时候我们分区是输入分区的大小为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。最后一个逻辑驱动器的扩展分区表只会列出它本身的分区项。最后一个扩展分区表的第二个项到第四个项被使用。
表2 扩展分区表项的内容
扩展分区表项
分区表项的内容
包括数据的开始地址在内的与扩展分区第一个项
中当前逻辑驱动器有关的信息
有关扩展分区中的下一个逻辑驱动器的信息,包括包含下一个逻辑驱动器的第二个项
EBR的扇区的地址。如果不存在进一步的逻辑驱动器的话,该字段不会被使用
第三个项
第四个项
未用
未用
[返回索引]
扩展分区表项中的相对扇区数字段所显示的是从扩展分区开始到逻辑驱动器中第一个扇区的位移的字节数。总扇区数字段中的数是指组成该逻辑驱动器的扇区数目。总扇区数字段的值等于从扩展分区表项所定义的引导扇区到逻辑驱动器末尾的扇区数。
有时候在磁盘的末尾会有剩余空间,剩余空间是什么呢?我们前面说到,分区是以1柱面的容量为分区粒度的,那么如果磁盘总空间不是整数个柱面的话,不够一个柱面的剩下的空间就是剩余空间了,这部分空间并不参与分区,所以一般无法利用。照道理说,磁盘的物理模式决定了磁盘的总容量就应该是整数个柱面的容量,为什么会有不够一个柱面的空间呢。在我的理解看来,本来现在的磁盘为了更大的利用空间,一般在物理上并不是按照外围的扇区大于里圈的扇区这种管理方式,只是为了与操作系统兼容而抽象出来CHS。可能其实际空间容量不一定正好为整数个柱面的容量吧。关于这点,如有高见,请告知或zymail@。
FAT文件系统原理二[转]
四、FAT分区原理。
先来一幅结构图:
[返回索引]
现在我们着重研究FAT格式分区内数据是如何存储的。FAT分区格式是MICROSOFT最早支持的分区格式,依据FAT表中每个簇链的所占位数(有关概念,后面会讲到)分为fat12、fat16、fat32三种格式"变种",但其基本存储方式是相似的。
仔细研究图7中的fat16和fat32分区的组成结构。下面依次解释DBR、FAT1、FAT2、根目录、数据区、剩余扇区的概念。提到的地址如无特别提示均为分区内部偏移。
[返回索引]
4.1 关于DBR.
DBR区(DOS BOOT RECORD)即操作系统引导记录区的意思,通常占用分区的第0扇区共512个字节(特殊情况也要占用其它保留扇区,我们先说第0扇)。在这512个字节中,其实又是由跳转指令,厂商标志和操作系统版本号,BPB(BIOS Parameter Block),扩展BPB,os引导程序,结束标志几部分组成。以用的最多的FAT32为例说明分区DBR
各字节的含义。见图8。
[返回索引]
图8的对应解释见表3
表3 FAT32分区上DBR中各部分的位置划分
对应字节位移
字段长度
字段名
图8颜色
0x00
0x03
0x0B
0x40
0x5A
0x01FE
3个字节
8个字节
53个字节
26个字节
420个字节
2个字节
跳转指令
厂商标志和os版本号
BPB
扩展BPB
引导程序代码
有效结束标志
[返回索引]
图9给出了winhex对图8 DBR的相关参数解释:
[返回索引]
根据上边图例,我们来讨论DBR各字节的参数意义。
MBR将CPU执行转移给引导扇区,因此,引导扇区的前三个字节必须是合法的可执行的基于x86的CPU指令。这通常是一条跳转指令,该指令负责跳过接下来的几个不可执行的字节(BPB和扩展BPB),跳到操作系统引导代码部分。
跳转指令之后是8字节长的OEM ID,它是一个字符串, OEM ID标识了格式化该分区的操作系统的名称和版本号。为了保留与MS-DOS的兼容性,通常Windows 2000格式化该盘是在FAT16和FAT32磁盘上的该字段中记录了“MSDOS
5.0”,在NTFS磁盘上(关于ntfs,另述),Windows 2000记录的是“NTFS”。通常在被Windows 95格式化的磁盘上OEM
ID字段出现“MSWIN4.0”,在被Windows 95 OSR2和Windows 98格式化的磁盘上OEM ID字段出现“MSWIN4.1”。
接下来的从偏移0x0B开始的是一段描述能够使可执行引导代码找到相关参数的信息。通常称之为BPB(BIOS
Parameter Block),BPB一般开始于相同的位移量,因此,标准的参数都处于一个已知的位置。磁盘容量和几何结构变
量都被封在BPB之中。由于引导扇区的第一部分是一个x86跳转指令。因此,将来通过在BPB末端附加新的信息,可以对BPB进行扩展。只需要对该跳转指令作一个小的调整就可以适应BPB的变化。图9已经列出了项目的名称和取值,为了系统的研究,针对图8,将FAT32分区格式的BPB含义和扩展BPB含义释义为表格,见表4和表5。
表4 FAT32分区的BPB字段
字节位移
字段长图8对应取度(字节)
值
名称和定义
扇区字节数(Bytes Per Sector) 硬件扇区0x0B
2
0x0200
的大小。本字段合法的十进制值有512、1024、2048和4096。对大多数磁盘来说,本字段的值为512
每簇扇区数(Sectors Per Cluster),一簇中的扇区数。由于FAT32文件系统只能跟踪有限个簇(最多为4 294 967 296个),因此,通过增加每簇扇区数,可以使FAT32文件系统支持最大分区数。一个分区缺省的簇0x0D
1
0x08
大小取决于该分区的大小。本字段的合法十进制值有1、2、4、8、16、32、64和128。Windows 2000的FAT32实现只能创建最大为32GB的分区。但是,Windows
2000能够访问由其他操作系统(Windows
95、OSR2及其以后的版本)所创建的更大的分区
保留扇区数(Reserved Sector) 第一个FAT0x0e
2
0x0020
开始之前的扇区数,包括引导扇区。本字段的十进制值一般为32
FAT数(Number of FAT) 该分区上FAT的副本数。本字段的值一般为2
根目录项数(Root Entries)只有0x11
2
0x0000
FAT12/FAT16使用此字段。对FAT32分区而言,本字段必须设置为 0
0x10
1
0x02
小扇区数(Small Sector)(只有0x13
2
0x0000
FAT12/FAT16使用此字段)对FAT32分区而言,本字段必须设置为0
媒体描述符( Media Descriptor)提供有关媒体被使用的信息。值0xF8表示硬盘,0x15
1
0xF8
0xF0表示高密度的3.5寸软盘。媒体描述符要用于MS-DOS FAT16磁盘,在Windows 2000中未被使用
每FAT扇区数(Sectors Per FAT)只被0x16
2
0x0000
FAT12/FAT16所使用,对FAT32分区而言,本字段必须设置为0
每道扇区数(Sectors Per Track) 包含使用0x18
2
0x003F
INT13h的磁盘的“每道扇区数”几何结构值。该分区被多个磁头的柱面分成了多个磁道
磁头数(Number of Head) 本字段包含使0x1A
2
0x00FF
用INT 13h的磁盘的“磁头数”几何结构值。例如,在一张1.44MB 3.5英寸的软盘上,本字段的值为 2
隐藏扇区数(Hidden Sector) 该分区上引导扇区之前的扇区数。在引导序列计算到0x1C
4
0x0000003F
根目录的数据区的绝对位移的过程中使用了该值。本字段一般只对那些在中断13h上可见的媒体有意义。在没有分区的媒体上它必须总是为0
总扇区数(Large Sector) 本字段包含FAT32分区中总的扇区数
每FAT扇区数(Sectors Per FAT)(只被FAT32使用)该分区每个FAT所占的扇区0x24
4
0x00001F32
数。计算机利用这个数和 FAT数以及隐藏扇区数(本表中所描述的)来决定根目录从哪里开始。该计算机还可以从目录中的0x20
4
0x007D043F
项数决定该分区的用户数据区从哪里开始
扩展标志(Extended Flag)(只被FAT32使用)该两个字节结构中各位的值为:
位0-3:活动 FAT数(从0开始计数,而不是1).
只有在不使用镜像时才有效
0x28
2
0x00
位4-6:保留
位7:0值意味着在运行时FAT被映射到所有的FAT
1值表示只有一个FAT是活动的
位8-15:保留
文件系统版本(File ystem Version)只供FAT32使用,高字节是主要的修订号,而低0x2A
2
0x0000
字节是次要的修订号。本字段支持将来对该FAT32媒体类型进行扩展。如果本字段非零,以前的Windows版本将不支持这样的分区
根目录簇号(Root Cluster Number)(只供0x2C
4
0x00000002
FAT32使用) 根目录第一簇的簇号。本字段的值一般为2,但不总是如此
文件系统信息扇区号(File System
Information SectorNumber)(只供FAT32使用) FAT32分区的保留区中的文件系统信0x30
2
0x0001
息(File System Information, FSINFO)结构的扇区号。其值一般为1。在备份引导扇区(Backup Boot Sector)中保留了该FSINFO结构的一个副本,但是这个副本不保持更新
备份引导扇区(只供FAT32使用) 为一个0x34
2
0x0006
非零值,这个非零值表示该分区保存引导扇区的副本的保留区中的扇区号。本字段
的值一般为6,建议不要使用其他值
12个字节均保留(只供FAT32使用)供以后扩充使用的为0x00
保留空间。本字段的值总为0
0x36
12
[返回索引]
表5 FAT32分区的扩展BPB字段
字节位移
字段长图8对应取度(字节)
值
字段名称和定义
物理驱动器号( Physical Drive Number)
与BIOS物理驱动器号有关。软盘驱动器被标识为0x00,物理硬盘被标识为0x80,0x40
1
0x80
而与物理磁盘驱动器无关。一般地,在发出一个INT13h BIOS调用之前设置该值,具体指定所访问的设备。只有当该设备是一个引导设备时,这个值才有意义
保留(Reserved) FAT32分区总是将本字段的值设置为0
扩展引导标签(Extended Boot Signature)
0x42
1
0x29
本字段必须要有能被Windows 2000所识别的值0x28或0x29
分区序号(Volume Serial Number) 在格式0x43
4
0x33391CFE
化磁盘时所产生的一个随机序号,它有助于区分磁盘
卷标(Volume Label) 本字段只能使用一0x47
11
"NO
NAME"
次,它被用来保存卷标号。现在,卷标被作为一个特殊文件保存在根目录中
系统ID(System ID) FAT32文件系统中一般取为"FAT32"
0x41
1
0x00
0x52
8
"FAT32"
[返回索引]
DBR的偏移0x5A开始的数据为操作系统引导代码。这是由偏移0x00开始的跳转指令所指向的。在图8所列出的偏移0x00~0x02的跳转指令"EB 58 90"清楚地指明了OS引导代码的偏移位置。jump 58H加上跳转指令所需的位移量,即开始于0x5A。此段指令在不同的操作系统上和不同的引导方式上,其内容也是不同的。大多数的资料上都说win98,构建于fat基本分区上的win2000,winxp所使用的DBR只占用基本分区的第0扇区。他们提到,对于fat32,一般的32个基本分区保留扇区只有第0扇区是有用的。实际上,以FAT32构建的操作系统如果是win98,系统会使用基本分区的第0扇区和第2扇区存储os引导代码;以FAT32构建的操作系统如果是win2000或winxp,系统会使用基本分区的第0扇区和第0xC扇区(win2000或winxp,其第0xC的位置由第0扇区的0xAB偏移指出)存储os引导代码。所以,在fat32分区格式上,如果DBR一扇区的内容正确而缺少第2扇区(win98系统)或第0xC扇区(win2000或winxp系统),系统也是无法启动的。如果自己手动设置NTLDR双系统,必须知道这一点。
DBR扇区的最后两个字节一般存储值为0x55AA的DBR有效标志,对于其他的取值,系统将不会执行DBR相关指令。上面提到的其他几个参与os引导的扇区也需以0x55AA为合法结束标志。
[返回索引]
FAT16 DBR:
FAT32中DBR的含义大致如此,对于FAT12和FAT16其基本意义类似,只是相关偏移量和参数意义有小的差异,FAT格式的区别和来因,以后会说到,此处不在多说FAT12与FAT16。我将FAT16的扇区参数意义列表。感兴趣的朋友自己研究一下,和FAT32大同小异的。
表6 一个FAT16分区上的引导扇区段
字段长度(字节)
3
8
25
26
字节位移
字段名称
0x00
0x03
0x0B
0x24
跳转指令(Jump Instruction)
OEM ID
BPB
扩展BPB
0x3E
0x01FE
448
4
引导程序代码(Bootstrap Code)
扇区结束标识符(0x55AA)
[返回索引]
表7 FAT16分区的BPB字段
字节位移
字段长度(字节)
例值
名称和定义
扇区字节数(Bytes Per Sector) 硬件扇0x0B
2
0x0200
区的大小。本字段合法的十进制值有512、1024、2048和4096。对大多数磁盘来说,本字段的值为512
每簇扇区数(Sectors Per Cluster) 一个簇中的扇区数。由于FAT16文件系统只能跟踪有限个簇(最多为65536个)。因此,通过增加每簇的扇区数可以支持最0x0D
1
0x40
大分区数。分区的缺省的簇的大小取决于该分区的大小。本字段合法的十进制值有 1、2、4、8、16、32、64和128。导致簇大于32KB(每扇区字节数*每簇扇区数)的值会引起磁盘错误和软件错误
保留扇区数(Reserved Sector) 第一个0x0e
2
0x0001
FAT开始之前的扇区数,包括引导扇区。本字段的十进制值一般为1
FAT数(Number of FAT)该分区上FAT的副本数。本字段的值一般为2
根目录项数(Root Entries) 能够保存在0x10
1
0x02
0x11
2
0x0200
该分区的根目录文件夹中的32个字节长的文件和文件夹名称项的总数。在一个典型的硬盘上,本字段的值为512。其中一个项常常被用作卷标号(Volume
Label),长名称的文件和文件夹每个文件使用多个项。文件和文件夹项的最大数一般为511,但是如果使用的长文件名,往往都达不到这个数
小扇区数(Small Sector) 该分区上的扇0x13
2
0x0000
区数,表示为16位(<65536)。对大于65536个扇区的分区来说,本字段的值为0,而使用大扇区数来取代它
媒体描述符( Media Descriptor)提供有关媒体被使用的信息。值0xF8表示硬0x15
1
0xF8
盘,0xF0表示高密度的3.5寸软盘。媒体描述符要用于MS-DOS FAT16磁盘,在Windows 2000中未被使用
每FAT扇区数(Sectors Per FAT) 该分区上每个FAT所占用的扇区数。计算机利0x16
2
0x00FC
用这个数和FAT数以及隐藏扇区数来决定根目录在哪里开始。计算机还可以根据根目录中的项数(512)决定该分区的用户数据区从哪里开始
0x18
0x1A
2
2
0x003F
0x0040
每道扇区数(Sectors Per Trark)
磁头数(Number of head)
隐藏扇区数(Hidden Sector) 该分区上0x1C
4
0x0000003F
引导扇区之前的扇区数。在引导序列计算到根目录和数据区的绝对位移的过程中使用了该值
大扇区数(Large Sector) 如果小扇区数0x20
4
0x003EF001
字段的值为0,本字段就包含该FAT16分区中的总扇区数。如果小扇区数字段
的值不为0,那么本字段的值为0
[返回索引]
表8 FAT16分区的扩展BPB字段
字节位字段长图8对应取移
度(字节)
值
字段名称和定义
物理驱动器号( Physical Drive
Number) 与BIOS物理驱动器号有关。软盘驱动器被标识为0x00,物理硬盘0x24
1
0x80
被标识为0x80,而与物理磁盘驱动器无关。一般地,在发出一个INT13h
BIOS调用之前设置该值,具体指定所访问的设备。只有当该设备是一个引导设备时,这个值才有意义
保留(Reserved) FAT16分区一般将本字段的值设置为0
扩展引导标签(Extended Boot
0x26
1
0x29
Signature) 本字段必须要有能被Windows 2000所识别的值0x28或0x29
卷序号(Volume Serial Number) 在格0x27
2
0x52368BA8
式化磁盘时所产生的一个随机序号,它有助于区分磁盘
卷标(Volume Label) 本字段只能使用0x2B
11
"NO
一次,它被用来保存卷标号。现在,0x25
1
0x00
NAME"
卷标被作为一个特殊文件保存在根目录中
文件系统类型(File System Type) 根据0x36
8
"FAT16"
该磁盘格式,该字段的值可以为FAT、FAT12或FAT16
[返回索引]
4.2 关于保留扇区
在上述FAT文件系统DBR的偏移0x0E处,用2个字节存储保留扇区的数目。所谓保留扇区(有时候会叫系统扇区,隐藏扇区),是指从分区DBR扇区开始的仅为系统所有的扇区,包括DBR扇区。在FAT16文件系统中,保留扇区的数据通常设置为1,即仅仅DBR扇区。而在FAT32中,保留扇区的数据通常取为32,有时候用Partition Magic分过的FAT32分区会设置36个保留扇区,有的工具可能会设置63个保留扇区。
FAT32中的保留扇区除了磁盘总第0扇区用作DBR,总第2扇区(win98系统)或总第0xC扇区(win2000,winxp)用作OS引导代码扩展部分外,其余扇区都不参与操作系统管理与磁盘数据管理,通常情况下是没作用的。操作系统之所以在FAT32中设置保留扇区,是为了对DBR作备份或留待以后升级时用。FAT32中,DBR偏移0x34占2字节的数据指明了DBR备份扇区所在,一般为0x06,即第6扇区。当FAT32分区DBR扇区被破坏导致分区无法访问时。可以用第6扇区的原备份替换第0扇区来找回数据。
FAT文件系统原理三[转]
4.3 FAT表和数据的存储原则。
FAT表(File Allocation Table 文件分配表),是Microsoft在FAT文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构。假如把磁盘比作一本书,FAT表可以认为相当于书中的目录,而文件就是各个章节的内容。但FAT表的表示方法却与目录有很大的不同。
在FAT文件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。
[返回索引]
★存储过程假想:
我们模拟对一个分区存储数据的过程来说明FAT文件系统中数据的存储原则。
假定现在有一个空的完全没有存放数据的磁盘,大小为100KB,我们将其想象为线形的空间地址。为了存储管理上的便利,我们人为的将这100KB的空间均分成100份,每份1KB。我们来依次存储这样几个文件:(大小10KB),(大小53.6KB),(大小20.5KB)。
最起码能够想到,我们可以顺序的在这100KB空间中存放这3个文件。同时不要忘了,我们还要记下他们的大小和
开始的位置,这样下次要用时才能找的到,这就像是目录。为了便于查找,我们假定用第1K的空间来存储他们的特征(属性)。还有,我们设计的存储单位是1KB,所以,我们需要10个存储单位(为了说明方便,我们把存储单位叫做“簇”吧。也能少打点字,呵呵。),需要54个簇,需要21个簇。可能有人会说和不是各自浪费了不到1簇的空间吗?干嘛不让他们紧挨着,不是省地方吗?我的回答是,如果按照这样的方式存储,目录中原本只需要记下簇号,现在还需要记下簇内的偏移,这样会增加目录的存储量,而且存取没有了规则,读取也不太方便,是得不偿失的。
根据上面所说的思想,我们设计了这样的图4.3.1所示的存储方式。
图4.3.1
整个100KB空间
目录
占1簇
占10簇
占54簇
占21簇
剩余14簇
我们再考虑如何来写这三个文件的目录。对于每个文件而言,一定要记录的有:文件名,开始簇,大小,创建日期、时间,修改日期、时间,文件的读写属性等。这里大小能不能用结束簇来计算呢?一定不能,因为文件的大小不一定就是整数个簇的大小,否则的话像的内容就是54KB的内容了,少了固然不行,可多了也是不行的。那么我们怎么记录呢?可以想象一下。为了管理上的方便,我们用数据库的管理方式来管理我们的目录。于是我把1KB再分成10份,假定开始簇号为0,定义每份100B的各个位置的代表含义如图4.3.2
图4.3.2
每行100B
共10行(这是例子,非Fat系统)
1
11
65
10
53.6
20.5
2004.3.22 10:41
2004.3.22 10:41
只读
1949:10:1 12:0
2003.8.22 20:40
隐藏
2000:3:8 21:11
2005:3:8 9:11
系统
有
效共
记录
。
行记录
。
。
内容留空
文件大小文件名(占开始簇(占4个
50个字节)
读写属保留创建日期、时间修改日期、时间(占10字节)
(占10字节)
字节)
(占10个字性(占4(12字
字节)
节)
节)
这样设计的结构绝对可以对文件进行正确的读写了。接着让我们设计的文件系统工作吧。先改动个文件,比如,增加点内容吧!咦?增加后往哪里放呀,虽然存储块的后面有很多空间,但紧随其后的数据还顶着呢?要是把移到后边太浪费处理资源,而且也不一定解决问题。这个问题看来暂时解决不了。
那我们换个操作,把删了,的空间随之释放。这时候空间如图4.3.3,目录如图4.3.4
图4.3.3
整个100KB空间
目录
占1簇
占10簇
空白54簇
占21簇
剩余14簇
图4.3.4
每行100B
共10行(这是例子,非Fat系统)
1
65
10
20.5
2004.3.22 10:41
2004.3.22 10:41
只读
内
共10
2000:3:8 21:11
2005:3:8 9:11
系统
。
。
。
行记录
容留
空
文件大小文件名(占开始簇(占4个
50个字节)
读写属保留创建日期、时间修改日期、时间(占10字节)
(占10字节)
字节)
(占10个字性(占4(12字
字节)
节)
节)
这个操作看来还可以,我们接着做,在存入一个文件(大小为60.3KB),总共100簇的空间只用了31簇,还有68簇剩余,按说能放下。可是?往那里放呢?没有61个连续的空间了,目录行没办法写了,看来无连续块存储暂时也不行。
你一定能够想到我们可以在连续空间不够或增加文件长度的时候转移影响我们操作的其他文件,从而腾出空间来,但我要问你,那不是成天啥也不要干了,就是倒腾东西了吗?
看来我们设计的文件系统有致命的漏洞,怎么解决呢?。。。。
。。。。。。
FAT文件系统原理四[转]
其实可以这样解决:
首先我们允许文件的不连续存储。目录中依然只记录开始簇和文件的大小。那么我们怎么记录文件占用那些簇呢,以文件映射簇不太方便,因为文件名是不固定的。我们换个思想,可以用簇来映射文件,在整个存储空间的前部留下几簇来记录数据区中数据与簇号的关系。对于上例因为总空间也不大,所以用前部的1Kb的空间来记录这种对应,假设3个文件都存储,空间分配如图4.3.5,同时修改一下目录,如图4.3.6
图4.3.5
整个100KB空间
文件分目配表
录
第0簇
第1第2~11簇
簇
第12~65簇
第66~86第87~99簇
簇
图4.3.6
每行100B
共10行(这是例子,非Fat系统)
2
12
66
10
53.6
20.5
2004.3.22 10:41
2004.3.22 10:41
只读
1949:10:1 12:0
2003.8.22 20:40
隐藏
2000:3:8 21:11
2005:3:8 9:11
系统
有
效共
记录
。
行记录
。
。
内容留空
文件大小文件名(占开始簇(占4个
50个字节)
读写属保留创建日期、时间修改日期、时间(占10字节)
(占10字节)
字节)
(占10个字性(占4(12字
字节)
节)
节)
第一簇用来记录数据区中每一簇的被占用情况,暂时称其为文件分配表。结合文件分配表和文件目录就可以达到完全的文件读取了。我们想到,把文件分配表做成一个数据表,以图4.3.7的形式记录簇与数据的对应。
图4.3.7
文件分配表
簇1
2
3
...
11
12
13
...
65
66
67
...
86
87
...
99
号
对应目(1)
(2)
...
(10)
(1)
(2)
...
(54)
(1)
(2)
...
(21)
...
数录
据
用图4.3.7的组织方式是完全可以实现对文件占有簇的记录的。但还不够效率。比如文件名在文件分配表中记录太多,浪费空间,而实际上在目录中已经记录了文件的开始簇了。所以可以改良一下,用链的方式来存放占有簇的关系,变成图4.3.8的组织方式。
图4.3.8
改良后的文件分配表
簇号
对应目数录
据
3
4
...
FF
13
14
...
FF
67
68
...
FF
00
...
00
1
2
3
...
11
12
13
...
65
66
67
...
86
87
...
99
参照图4.3.8来理解一下文件分配表的意义。如文件我们根据目录项中指定的的首簇为2,然后找到文件分配表的第2簇记录,上面登记的是3,我们就能确定下一簇是3。找到文件分配表的第3簇记录,上面登记的是4,我们就能确定下一簇是4......直到指到第11簇,发现下一个指向是FF,就是结束。文件便丝毫无误读取完毕。
FAT文件系统原理五[转]
我们再看上面提到的第三种情况,就是将删除以后,存入一个大小为60.3KB的。利用簇链可以很容易的实现。实现后的磁盘如图4.3.9 4.3.10 4.3.11
图4.3.9
整个100KB空间划分
文件分目配表
录
空
第0簇
第1第2~11簇
簇
第12~65簇
第66~86簇
第87~93簇
第94~99簇
图4.3.10
文件分配表
簇1
2
3
...
11
12
13
...
65
66
67
...
86
87
88
...
93
94
...
99
号
对应目数录
据
3
4
...
FF
13
14
...
87
67
68
...
FF
88
89
...
FF
00
...
00
图4.3.11
目录
每行100B
共10行(这是例子,非Fat系统)
2
66
12
10
20.5
60.3
2004.3.22 10:41
2004.3.22
10:41
只读
共10
系统
2000:3:8 21:11
2005:3:8 9:11
行记录
1999:5:1 8:00
2003:3:20 14:0
存档
。
。
。
内容留
空
文件名(占开始簇(占文件大小(占创建日期、时间修改日期、时间
50个字4个字节)
10个字节)
(占10字节)
(占10字节)
读写属保留(12性(占4字节)
字节)
节)
上面是我们对文件存储的一种假设,也该揭开谜底的时候了。上面的思想其实就是fat文件系统的思想的精髓(但并不是,尤其像具体的参数的意义与我们所举的例子是完全不同的。请忘掉上边细节,努力记忆下边)。
FAT文件系统原理六[转]
★FAT16存储原理:
当把一部分磁盘空间格式化为fat文件系统时,fat文件系统就将这个分区当成整块可分配的区域进行规划,以便于数据的存储。一般来讲,其划分形式如图7所示。我们把FAT16部分提取出来,详细描述一下:
FAT16是Microsoft较早推出的文件系统,具有高度兼容性,目前仍然广泛应用于个人电脑尤其是移动存储设备中,
FAT16简单来讲由图4.3.12所示的6部分组成(主要是前5部分)。引导扇区(DBR)我们已经说过,FAT16在DBR之后没有留有任何保留扇区,其后紧随的便是FAT表。FAT表是FAT16用来记录磁盘数据区簇链结构的。像前面我们说过的例子一样,FAT将磁盘空间按一定数目的扇区为单位进行划分,这样的单位称为簇。通常情况下,每扇区512字节的原则是不变的。簇的大小一般是2n (n为整数)个扇区的大小,像512B,1K,2K,4K,8K,16K,32K,64K。实际中通常不超过32K。之所以簇为单位而不以扇区为单位进行磁盘的分配,是因为当分区容量较大时,采用大小为512b的扇区管理会增加fat表的项数,对大文件存取增加消耗,文件系统效率不高。分区的大小和簇的取值是有关系的,见表9
图4.3.12 Fat16的组织形式
引导扇区
1扇实际情况取大32个扇FAT1
FAT2(重复的)
根文件夹
其他文件夹及所有文件
剩余扇区
区
小
同FAT1
区
开始簇编号(从2开始)
不足一簇
[返回索引]
表9 FAT16分区大小与对因簇大小
分区空间大小
0MB-32MB
33MB-64MB
65MB-128MB
129MB-225MB
256MB-511MB
512MB-1023MB
1024MB-2047MB
2048MB-4095MB
每个簇的扇区
1
2
4
8
16
32
64
128
簇空间大小
512个字节
1k
2k
4k
8k
16k
32k
64k
[返回索引]
注意:少于32680个扇区的分区中,簇空间大小可最多达到每个簇8个扇区。不管用户是使用磁盘管理器来格式化分区,还是使用命令提示行键入format命令格式化,格式化程序都创建一个12位的FAT。少于16MB的分区,系统通常会将其格式化成12位的FAT,FAT12是FAT的初始实现形式,是针对小型介质的。FAT12文件分配表要比FAT16和FAT32的文件分配表小,因为它对每个条目使用的空间较少。这就给数据留下较多的空间。所有用FAT12格式化的
5.25英寸软盘以及1.44MB的3.5英寸软盘都是由FAT12格式化的。除了FAT表中记录每簇链结的二进制位数与FAT16不同外,其余原理与FAT16均相同,不再单独解释。。。
格式化FAT16分区时,格式化程序根据分区的大小确定簇的大小,然后根据保留扇区的数目、根目录的扇区数目、数据区可分的簇数与FAT表本身所占空间来确定FAT表所需的扇区数目,然后将计算后的结果写入DBR的相关位置。
FAT16 DBR参数的偏移0x11处记录了根目录所占扇区的数目。偏移0x16记录了FAT表所占扇区的数据。偏移0x10记录了FAT表的副本数目。系统在得到这几项参数以后,就可以确定数据区的开始扇区偏移了。
FAT16文件系统从根目录所占的32个扇区之后的第一个扇区开始以簇为单位进行数据的处理,这之前仍以扇区为单位。对于根目录之后的第一个簇,系统并不编号为第0簇或第1簇 (可能是留作关键字的原因吧),而是编号为第2簇,也就是说数据区顺序上的第1个簇也是编号上的第2簇。
FAT文件系统之所以有12,16,32不同的版本之分,其根本在于FAT表用来记录任意一簇链接的二进制位数。以FAT16为例,每一簇在FAT表中占据2字节(二进制16位)。所以,FAT16最大可以表示的簇号为0xFFFF(十进制的65535),以32K为簇的大小的话,FAT32可以管理的最大磁盘空间为:32KB×65535=2048MB,这就是为什么FAT16不支持超过2GB分区的原因。
FAT表实际上是一个数据表,以2个字节为单位,我们暂将这个单位称为FAT记录项,通常情况其第1、2个记录项(前4个字节)用作介质描述。从第三个记录项开始记录除根目录外的其他文件及文件夹的簇链情况。根据簇的表现情况FAT用相应的取值来描述,见表10
表10 FAT16记录项的取值含义(16进制)
对应簇的表现FAT16记录项的取值
情况
未分配的簇
已分配的簇
系统保留
坏簇
文件结束簇
0000
0002~FFEF
FFF0~FFF6
FFF7
FFF8~FFFF
看一幅在winhex所截FAT16的文件分配表,图10:
[返回索引]
[返回索引]
如图,FAT表以"F8 FF FF FF" 开头,此2字节为介质描述单元,并不参与FAT表簇链关系。小红字标出的是FAT扇区每2字节对应的簇号。
相对偏移0x4~0x5偏移为第2簇(顺序上第1簇),此处为FF,表示存储在第2簇上的文件(目录)是个小文件,只占用1个簇便结束了。
第3簇中存放的数据是0x0005,这是一个文件或文件夹的首簇。其内容为第5簇,就是说接下来的簇位于第5簇——〉
FAT表指引我们到达FAT表的第5簇指向,上面写的数据是"FF FF",意即此文件已至尾簇。
第4簇中存放的数据是0x0006,这又是一个文件或文件夹的首簇。其内容为第6簇,就是说接下来的簇位于第6簇——〉FAT表指引我们到达FAT表的第6簇指向,上面写的数据是0x0007,就是说接下来的簇位于第7簇——〉FAT表指引我们到达FAT表的第7簇指向……直到根据FAT链读取到扇区相对偏移0x1A~0x1B,也就是第13簇,上面写的数据是0x000E,也就是指向第14簇——〉14簇的内容为"FF FF",意即此文件已至尾簇。
后面的FAT表数据与上面的道理相同。不再分析。
FAT表记录了磁盘数据文件的存储链表,对于数据的读取而言是极其重要的,以至于Microsoft为其开发的FAT文件系统中的FAT表创建了一份备份,就是我们看到的FAT2。FAT2与FAT1的内容通常是即时同步的,也就是说如果通过正常的系统读写对FAT1做了更改,那么FAT2也同样被更新。如果从这个角度来看,系统的这个功能在数据恢复时是个天灾。


发布评论