FAT文件系统分析报告 实现平台: PC硬盘40G,操作系统WinXP,测试软件WinHex 参考资料: 《数据恢复技术》 ――戴士剑,陈永红编著 《大容量硬盘修复技术及数据管理》――张钟澍编著 Fat32 报告人: 周俊辉(Tony) 完成时间: 2004.10.20 目录 一、基本概念 3 1、硬盘逻辑结构 3 2、LBA, 3 3、C/H/S值, 3 二、硬盘数据存储区域的划分 4 1、 MBR 4 2、虚拟MBR及其查找实例 5 3、DOS引导区DBR 6 4、文件分配表FAT 9 5、文件目录表FDT 10 6、DATA区12 四、FAT32文件系统根目录下文件查找实例 14 五、子目录下的文件查找举例 17 六、长文件名的实现及存在的问题 19 七、长文件名查找举例 20 一、基本概念 1、硬盘逻辑结构 硬盘是一个密封的腔体,里面密封着磁头、盘片(磁片、碟片)等部件,盘面号既磁头号,从0开始编号.磁道从外向面编号,从0开始.磁道被划成一段段圆弧,每段圆弧叫一个扇区,从1编号.所有盘面上的同一磁道构成一个圆柱,叫做柱面.磁盘容量计算公式: 硬盘容量=盘面数*柱面数*扇区数*每扇区字节数(通常为512) 2、LBA, 全称Logic Block Address,既扇区逻辑地址,它从0开始编号,一一对应硬盘上的物理扇区 3、C/H/S值, 柱面、磁头、扇区号,一一对应物理扇区 二、硬盘数据存储区域的划分 MBR(63) DBR(32) FAT1 FAT2 DIR(32) DATA 说明:MBR一般占用63个扇区(实际只占用1个扇区);DBR占用32个扇区(实际只占用第1和第6扇区,第1扇区起作用,第6扇区为第一扇区的备份);FAT1=FAT2,FAT文件为变长,隋分区大小、每簇扇区数的变化而变化;DIR变化最大,早期的系统中DIR是固定长度,为32个扇区,而每个文件目录项占用32个字节,所以,根目录下最多只能有512项(文件和目录总和),软盘只有112项,超过这个数就不能再在根目录下建立文件或目录.后来为了突破这个限制,根目录采用和子目录一样的方式来管理,称为根目录文件,就没有这个限制了,从此也就不再有单独的根目录,而成为DATA的一部分.甚至根目录文件并不一定紧跟在FAT之后,可以在DATA区任意的位置. 1、 MBR 既主引导记录区,位于0磁道0柱面1扇区.共512字节,MBR引导程序占用其前446个字节(偏移0-偏移1BDH),隋后64个字节(偏移1BEH-1FDH)为DPT硬盘分区表,最后以"55AA"结束. 硬盘分区表结构: 偏移 意义 偏移 意义 0 自举标志 8 本分区前已用扇区数 1 起始磁头号H 9 2 起始扇区号S 10 3 起始柱面号CYL 11 4 分区格式标志 12 本分区总扇区数 5 终止磁头号H 13 6 终止扇区号S 14 7 终止柱面号CYL 15 说明:柱面号的高2位存放在扇区字节的高2位2、虚拟MBR及其查找实例 起因:通过主引导记录定义硬盘分区表,最多只能描述4个分区,如果想要多于4个分区,就要突破主引导记录中的分区描主法,这在某些时候也是突破硬盘容量限制的一种方法.我们采用一种虚拟MBR技术来实现.分区表项描述为: C:盘分区表 D: 盘分区表 E: 盘分区表 F: 盘分区表 定义C:盘 定义D:盘 定义E:盘 定义F:盘 描述剩余空间 描述虚拟MBR 描述虚拟MBR 描述虚拟MBR 末用 末用 末用 末用 末用 末用 末用 末用 先查看硬盘的0扇区 既MBR的分区选项,C盘分区的起始扇区号(DBR位置)为:0000003F 既63号扇区,扩展分区号(虚拟MBR位置):01388B3B换成十进制是20482875号扇区.查看20482875扇区的分区表项为 第一分区0000003F(63)是D盘的DBR相对位置,那么D盘的DBR逻辑扇区计算为:20482875+63=20482938号扇区. 第二分区又指向系统盘E:的虚拟MBR位置(相对):01C92C09十进制是:29961225,E:盘分区的虚拟MBR位置计算为: 20482875+29961225=50444100 查看50444100号扇区为: 这里只有一个分区,偏移位置为:0000003F(63),所以E:盘DBR所在的扇区号为:50444100+63=50444163,如果有F:盘,则E:盘的虚拟MBR的第二分区将指向它,如果形成一个环,系统本身并不会去判断它,它只是按照这个链忠实地寻找分区,而不进行任何额外的检测与处理,这所谓"逻辑锁",表现为无法引导,不能访问硬盘. 3、DOS引导区DBR 硬盘各分区的逻辑管理方式表现为,所有分区内的逻辑扇区都是从"0"开始编号,直至其最大值-1,涵盖整个分区,分区内的0扇区称为BOOT区.由Format命令将DOS引导记录(DBR)写到该扇区,主要功能是完成系统的自举.DOS引导扇区结构如下: (1)跳转指令 (2)厂商标识和DOS版本号,占8个字节(03-0A) (3)BPB(BIOS Parameter Block,BIOS参数块) (4)DOS引导程序,负责完成DOS三个系统文件的装入 (5)结束标专"55AA" 硬盘DOS引导记录中BPB参数信息: 偏移量 字节数 含义 00H 3 跳转到引导代码 03H 8 厂商标识和DOS版本号 0BH 2 BPB参数信息 每扇区字节数 0DH 1 每簇扇区数(2的整数倍) 0EH 2 保留扇区数(FAT32一般为32) 10H 1 FAT个数(通常为2) 11H 2 根目录项数(早期版本允许最大目录基数) 13H 2 扇区总数(小卷,小于32MB)(FAT16系统) 15H 1 磁介质描述符(F8表示硬盘) 16H 2 每FAT表所占扇区数(小卷,FAT16系统) 18H 2 每磁道扇区数 1AH 2 逻辑磁头数 1CH 2 当前分区前面隐含扇区数(系统隐含扇区) 20H 4 扇区总数(大卷,大于32MB)(FAT32系统) FAT32区段 24H 4 每个FAT表所占扇区数(大卷,FAT32系统) 28H 2 标记 2AH 版本 2CH 4 引导目录第一簇,即根目录的起始簇 30H 2 FS信息扇区,BOOT本身占用的扇区数 32H 2 备份引导扇区的位置 34H 7 保留,一般为00H 40H 1 BIOS设备(从80开始,编号到85,86为光驱) 41H 1 未使用 42H 1 扩展引导标记 43H 4 序列号 47H 11 卷标 52H 8 文件系统 说明: 1、保留扇区是由DOS或Windows指定的被保留用做引导的扇区数.早期版本为1即BOOT本身占用的1个扇区,较新的版本一般为32.除本身占用一个外,有31个扇区保留未用,其中第6扇区一般是BOOT的备份,在BOOT损坏时,可覆盖BOOT扇区修复 2、系统隐含扇区(Hidden Sectors): 指分区表中所描述的该分区的起始扇区至该逻辑盘DBR扇区间的扇区数.即MBR或虚拟MBR至隋后的逻辑盘DBR扇区数,一般为3F(63) 而分区表中隐含扇区指每个分区以前的扇区数.不固定.对MBR隐含扇区是绝对位置,对于虚拟MBR,隐含扇区是相对于本扩展分区MBR的位置. 第一分区 第二分区 第三分区 MBR DBR及数据 虚拟MBR DBR及数据 虚拟MBR DBR及(1) (3) (4) (2) 第三分区MBR参数中的隐含扇区数 (1)指系统隐含扇区也指分区表中是隐含扇区 (2)指第二分区MBR参数中的隐含扇区数 (3),(4)指系统隐含扇区数 4、文件分配表FAT 文件分配表(FAT),是DOS文件管理系统用来记录每个文件的存储位置的表格,它以链的方式存放簇号.FAT紧接着DOS引导扇区存放.磁盘上有两个FAT,一个是基本表,另一个是备份.两个表的内容相同.每个FAT所占用的扇区数取决于DOS版本、分区大小、每簇的扇区数等因素.可查BPB参数查询到. 簇号的长度由簇的多少决定,进而取决于FAT表项的位数. 文件系统 区别 表示最大簇数 簇最大扇区 分区最大容量 FAT12 12位表示一簇 4096(12次方) 64 128MB FAT16 16位表示一簇 65536(16次方) 64 2048MB(2G) FAT32 32位表示一簇 4294967296 64 128TB 注:为提高磁盘利用率,FAT32每簇一般为8,16个扇区,软盘用12位FAT表项,磁盘分区文件系统一般规律: 小于20740(10M)用12位映射一个簇 小于512M多于2074(10M)用16位映射一个簇 大于512M用32映射一个簇 在FAT表中,簇统计编号也是登编号.每一个登记项作为一个簇的樗信息占用一定的字节,该标专信息表项值含义如下: 表项值(12位) 表项值(16位) 表项值(32位) 簇描述信息含义 000H 0000H 00000000H 未使用的簇 002H-FEFH 0002-FFEFH 00000002H-FFFFFFEFH 一个已分配的簇号 FF0H-FF6H FFF0H-FFF6H FFFFFFF0H-FFFFFFF6H 保留 FF7H FFF7H FFFFFFF7H 坏簇 FF8H-FFFH FFF8H-FFFFH FFFFFFF8H-FFFFFFFFH EOF(文件结束簇) 在FAT簇登记项中,0,1号登记项是表头,簇的登记项从2号开始,即磁盘的第一个文件从第2簇开始分配.早期DOS版本中,系统文件IO.SYS(或IBMBIO.COM)所在的首簇号总是2. 5、文件目录表FDT 根目录下的所有文件及其子目录在根目录的文件目录表中都有一个"目录登记项".每个目录登记项用32个字节,提供有关文件和子目录的信息.FAT32文件系统目录项含义: (1)0-7字节:文件名 (2)8-10字节:文件扩展名 (3)11字节:文件属性,按二进制定义,最高二位保留不用,0-5位分别表示只读位、隐藏位、系统位、卷标位、子目录和归档位,当11字节为"0FH"时,表示该项为长文件名记录项. (4)12-13字节:(仅长文件目录项有效)用来存储其对应的短文件名目录项的文件名字节校验和. (5)13-15字节:24位二进制文件建立时间,其中高5位为小时,次6位为分钟,再次5位的倍数为秒,最后8位为单位精确到10毫秒的创建秒数. (6)16-17字节:16位二进制文件建立日期,高7位为相对于1980年的年份值,次4位为月份,后5位为月内日期 (7)18-19字节:16位二进制文件最新访问日期,同16-17字节. (8)20-21字节:起始簇高16位(9)22-23字节,16位二进制文件最新修改时间,同13-15前16位(10)24-25字节:16位二进制文件最新修改时间,同16-17字节 (11)26-27字节:起始簇低16位(12)28-31字节:32位文件字节长度. 注: (1) 子目录项,其长度为0,已删除目录项的首字节值为E5H. (2)文件目录项保存该文件的短文件名,长文件名用若干个长文件名目录项保存,每一项最多保存13个字符内码,首字节指明是长文件名的第几项,11字节为0FH,12字节指明类型,13字节为校验和,26,27字节为零. 6、DATA区 用于实际存储文件数据,其组织与管理由前面4个区域的内容来完成 三、FAT32文件系统分区逻辑结构 由上面的分析,我们总结出如下的逻辑磁盘中系统对文件的管理链: MBR DBR 保留扇区 FAT1 FAT2 FDT=32 DATA 剩余扇区 总结:(1)由MBR可找到DBR (2)由DBR找确定保留扇区,FAT1,FAT2大小,算出起始位置,确定FDT首簇位,DATA起始位. (3)由FDT确定文件首簇位置和FAT中簇链起点 (4)由FAT文件和FDT中的簇链起点可找出文件所有簇号. (5)剩余扇区指,剩下的不足以组成一簇的扇区. 剩余扇区计算举例: 进入硬盘0分区1,我们计算第一分区(C:盘)的剩余扇区, 由C:盘的DBR如下: 我们可以得下如下参数图示: 20482812 保留扇区=32 FAT1=9997 FAT2=9997 DATA 剩余扇区 数据DATA扇区=20482812-32-9997*2=20462786个扇区 剩余扇区数=20462786 mod 16=10个扇区 共有簇数=20462786/16=1278846个簇 也就是C:盘有10个扇区不能成簇被浪费. 四、FAT32文件系统根目录下文件查找实例 在C:盘根目录下兴建一个文件file.txt,其C:盘根目录结构如图示: 查看MBR,找到C:盘DBR的位置: 得到C:盘DBR位置是:0+0000003F(63)=63 跳转到63号扇区,查看C:盘的DBR, 如图示: 从上图我们可以得到如下几个要用到的计算参数: Sectors per FAT(每个FAT文件扇区数):9997 Root dir 1st cluster(根目录占用第一簇号):2 Sectors per cluster(每簇扇区数):16 Reserved sectors(保留扇区数即MBR占用扇区数):32 C:盘DBR扇区由 结构如下: 20482812 保留扇区=32 FAT1=9997 FAT2=9997 DATA 剩余扇区 根据公式换算: 根目录的起始逻辑扇区=DBR起始扇区号+DBR占用扇区+FAT*2+(起始簇号-2)*每簇扇区数 根目录起始逻辑扇区为:63+32+9997*2+(2-2)16=20089 跳到20089扇区,查看:(从这儿看出FAT表没有参与编簇) 对照FDT参数含义,我们如到如下参数: 80-89:文件名我扩展名file.txt BA:属性字节:存档 94-95起始簇高16位:0002 9A-9B起始簇低16位:0036 则计算出file.txt的起始簇号为:00020036(131126)即131126簇 起始扇区为:63+32+9997*2+(131126-2)*16=2118073 跳到2118073扇区,找到file.txt文件如图所示: 这就是我们要找的文件,查找成功. 找file.txt在FAT表的入口地址: 第131126簇的偏移地址:131126*4=524504十六进制为800D8 偏移扇区:524504/512=1024.421875取整为:1024 FAT文件起始扇区:63+32=95查到FAT起始地址为:00000BE00 File.txt文件在FAT表的入口地址所在扇区为:95+1024=1119扇区 文件偏移地址524504十六进制为800D8所以 file.txt在FAT表的入口地址为:00000BE00+800D8=8BED8 跳到1119扇区,找到8BED8地址,如图所示: 取出其值为0FFFFFFF,它表示文件的结束,至此file.txt文件查找全部完成. 五、子目录下的文件查找举例 我们要找出download子目录下sonfold.txt文件.子目录结构如图示: 根据上面的计算FDT的起始扇区为:20089,在这个扇区找到download这个目录,如下图所示: 由上图我们可以得到如下信息: C00-C0A:目录名 CB:属性,"10"表示目录 D04-D05目录高16位:0002 D0A-D0B目录低16位:2252 D0C-D0F:目录的大小,固定为0值 所以偏移位置为:022252H簇,转为十进为139858, 计算出逻辑扇区为:63+32+(139858-2)*16=2257785 跳到2257785扇区,找到sonfold.txt文件的目录项,如图示: 由于前面有几个长文件名和一些文件,占用了大量的目录项,直到2257790扇区才找到sonfold.txt的目录下!找到这个文件的目录项,查出其首簇,其余步骤按找file.txt完全一样. 六、长文件名的实现及存在的问题 因为长文件名需要考虑Windows95与DOS和Windows3.X的兼容问题,所以,Windows实现的长文件名并不是对8.3格式的简单扩展,否则,Windows中的长文件名就会在DOS和Windows3.X系统中无法读出.在Windows中文件或是目录实际存储着两个名字,一个短文件名和一个长文件名,如果是短文件名,则存储在8.3格式的32字节的目录中,当创建一个长文件名时,其对应短文件名的存储有以下三个处理原则: (1)Windows取长文件名的前6个字符加上~1形成短文件名. (2)如果已存在这个名字的文件,则符号~后的数字自动增加. (3)如有DOS和Window3.X非法字符,以下划线"_"替代. 在DOS或Window3.X下只能看见其对应的短文件名,完全忽略长文件名.在Windows95或以上版本,系统会根据应用程序性质分别给矛不同的文件名:16位应用程序得到8.3格式的文件名,32位应用程序得到长文件名. 长文件名使用目录登记项格式,占用2个字节.采用Unicode格式(一个字符占两个字节16位)一个长文件名需要若干个这样的不登记项,它们的含义表示为: 偏移量 长(字节) 含义 0 1 顺序字节 1~10 10 长文件名节(5个字符) 11 1 文件属性(3F) 12 1 种类 13 1 校验和 14~25 12 长文件名节(6个字符) 26~27 2 起始簇号 28~31 4 长文件名节(2个字符) 所以一个目录登记项可以表示5+6+2共13个字符.第一个字节的低5位指明它在文件名中的顺序号,第6位为"1表明它是最后一项",第5,7位未用置0.所以一个长文件名最大能用33个目录项表示,即最大文件名可表示字符数为:13*32+6=422个字符. 七、长文件名查找举例 C盘download子目录下有文件ucosiichinadoc子目录.由上面所做的工作,我们可直接跳到2257785扇区,得到如下图示: 图中阴影部分即是ucosiichinadoc子目录的长文件名表示实现.