解析FAT16文件系统

引导扇区的信息如下:

 

1.  偏移地址00H,长度3,内容:EB 3C 90 跳转指令。

2.  偏移地址03H,长度8,内容:4D 53 44 4F 53 35 2E 30 为厂商标志和os 版本号,这里是MSDOS5.0。

3.  偏移地址0BH,长度2,内容:00 02。注意这里数据的布局,高地址放高字节,低地址放低字节(数据为小端格式组织),所以数据应该是0200,即512。表示的意思是,该磁盘每个扇区有512个字节。有的可能是1024、2048、4096。

4.  偏移地址0DH,长度1,内容:01。表示的意思是每个簇有1个扇区。这个值不能为0,而且必须是2的整数次方,比如1、2、4、8、16、32、64、128。但是这个值不能使每个簇超过32KB字节。

5.  偏移地址0EH,长度2,内容:08 00。转换一下,就是00 08,意思是保留区域中的保留扇区数为8个。那么就可以知道下面的FAT1区的开始的地址就是:0x08*0x200(每个扇区的字节数)=0x1000。

6.  偏移地址10H,长度1,内容:02。表示此卷中的FAT结构的份数为2,另外一个是备份的。

7.  偏移地址11H,长度2,内容:00 02。转换一下,就是0200H,表示根目录项数(Root Entries) 能够保存在该分区的根目录文件夹中的32个字节长的文件和文件夹名称项的总数。在一个典型的硬盘上,本字段的值为512。

8.  偏移量地址13H,长度2,内容:4D ED。转换一下就是ED4DH,即大约32MB的SD卡存储量。表示小扇区数(Small Sector) 。该分区上的扇区数,表示为16位(<65536)。对大于65536个扇区的分区来说,本字段的值为0,而使用大扇区数来取代它。

9.  偏移地址16H,长度2,内容:EC 00。转换一下为00EC,表示每个FAT占用的扇区数。那么每个扇区占用的字节数就是0x00EC*0x200=0x1D800。根据启动区、FAT1、FAT2、根目录、数据区的次序,可以依次计算出它们的地址了。(教程中给出的偏移地址为24H,但是根据实际的FAT1/FAT2地址的推算,应该是16H地址)

10. 偏移量地址20H,长度2,内容:00 00。表示大扇区数(Large Sector) 。如果小扇区数字段的值为0,本字段就包含该FAT16分区中的总扇区数。如果小扇区数字段的值不为0,那么本字段的值为0。

11. 偏移量地址36H,长度为8,内容:46 41 54 31 36 20 20 20,对于ASCII码为“FAT16”,表示文件系统类型(File System Type) 根据该磁盘格式,该字段的值可以为FAT、FAT12或FAT16

启动区:理所当然是0x00;

FAT1:0x1000;

FAT2:0x1000 + 0x1D800 = 0x1E800;

根目录区:0x1E800 + 0x1D800 = 0x3C000;

数据区的地址,等等再计算。这个只是计算,可以看看是不是和实际的一致。

 

 

 

 

怎么样,是不是和计算的很一致。

为什么要计算SD数据的读取要给出地址,而且每次读取都是一个整扇区,512个字节。找出这些地址后,可以很方便的找到数据。

 现在分析下根目录区的内容:

 

这里使用的是FAT16短文件目录项,每32个字节表示一个文件(文件夹也是),32个字节的表示定义分别如下:

FAT16目录项32个字节的表示定义

字节偏移(16进制)

字节数

定义

0x0~0x7

8

文件名

0x8~0xA

3

扩展名

0xB

1

属性字节

00000000(读写)

00000001(只读)

00000010(隐藏)

00000100(系统)

00001000(卷标)

  00010000(子目录)

00100000(归档)

0xC~0x15

10

系统保留

0x16~0x17

2

文件的最近修改时间

0x18~0x19

2

文件的最近修改日期

0x1A~0x1B

2

表示文件的首簇号

0x1C~0x1F

4

表示文件的长度

 

1.  偏移地址00H,长度8,内容:驱动器的名称,8个字节。这里的CCD8对应国标码“特”,而C8A8对应国标码“权”,即特权同学给该SD卡起的“特权”一名。

2.  偏移地址20H,长度8,内容:54 45 53 54 20 20 20 20。表示第一个文件名:TEST (空缺部分是空格)。

偏移地址80H,长度8,内容:4E 45 58 54 20 20 20 20。表示第二个文件名:NEXT (空缺部分是空格)。

3.  偏移地址28H(88H也一样),长度3,内容:54 58 54。表示文件类型,为ASCII字符表示。

4.  偏移地址2BH(8BH也一样),长度1,内容:20。表示文件属性,00000000(读写);00000001(只读);00000010(隐藏);00000100(系统);00001000(卷标);00010000(子目录);00100000(归档)。

5.  偏移地址36H,长度2,内容为BA 49。表示时间=小时*2048+分钟*32+秒/2。得出的结果换算成16进制填入即可。也就是:36H字节的0~4位是以2秒为单位的量值;36H字节的5~7位和37H字节的0~2位是分钟;37H字节的3~7位是小时。

6.  偏移地址38H,长度2,内容为A3 3A。表示日期=(年份-1980)*512+月份*32+日。得出的结果换算成16进制填入即可。也就是:38H字节0~4位是日期数;38H字节5~7位和39H字节0位是月份;39H字节的1~7位为年号,原定义中0~119分别代表1980~2099,目前高版本的Windows允许取0~127,即年号最大可以到2107年。

7.  偏移地址3AH,长度2,为该文件开始簇号,这里也是用了小端格式组织。转换下为00 02,根据这个就可以找到文件TEST.txt下一个簇号在FAT1中的位置了。1000H+02H*02H(因为2个字节存一个簇号)= 1004H。

偏移地址3AH,长度2,为该文件开始簇号,这里也是用了小端格式组织。转换下为00 62,根据这个就可以找到文件NEXT.txt下一个簇号在FAT1中的位置了。1000H+62H*02H(因为2个字节存一个簇号)= 10C4H。

8.  偏移地址3CH,长度4,内容:59 BE 00 00。表示文件长度,转换后为00 00 BE 59就是48729字节。

偏移地址9CH,长度4,内容:32 00 00 00。表示文件长度,转换后为00 00 00 32就是50字节。

  

TEST.txt占用了48KB的空间,NEXT占用了512B的空间。文件是按照整簇来存放的,不够一个簇的大小(由上面算得,一个簇为一个扇区即512B),也要给一个簇的空间。

 计算出该文件放置空间。

从文件的大小可以计算出,需要占用多少个簇。根据前面的数据,每个簇放1个扇区,每个扇区512个字节,那么一个簇的空间就是512字节了。那么48729字节需要96个簇,这96个簇的开始的地址就可以计算出来了。

 

    首先要提一点,这个地方也是特权同学找了很多资料才发现的,就是根目录中根文件夹占有32(20H)个扇区应该是固定的(至少对于FAT16应该是这样),所以真正的用户数据存放应该是从根目录地址的32个扇区偏移量后开始算的。

上面已经知道TEST.txt开始簇地址存放在FAT1中的偏移量了:02H,由此可以先计算出TEST.txt的第一簇数据存放地址为:3C000H(根目录地址)+20H*200H(前面提到的用户数据偏移量)+(02H-02H)*01H(1个簇有1个扇区)*200H=40000H。把偏移量-02H意思是簇号在FAT1中存储都是从02H开始的。

而第一个簇地址存放在FAT1中的:1000H(FAT1起始地址)+02H*02H=1004H。而1004H地址上的数据为:03 00,转换后为0003H,那么我们可以计算出TEST.txt第二个簇的地址为:3C000H(根目录区地址)+20H*200H(前面提到的用户数据偏移量)+ (03H-02H)*01H(1个簇有1个扇区)*200H=40200(第一个簇开始地址)。依此类推,一直到FAT1中偏移量为C2处出现了FF FF,这表示TEST.txt文件存储结束,那么前面的0061H就是文件最后一个簇偏移量。我们可以由此算一下文件大小为:(0061H-0002H+0001H(补偿))=96个簇,和实际相符。

    同样的道理可以算出NEXT.txt文件的存放地址。首先起首地址偏移量为62H,由此可以先计算出NEXT.txt的第一簇数据存放地址为:3C000H(根目录地址)+20H*200H(前面提到的用户数据偏移量)+(62H-02H)*01H(1个簇有1个扇区)*200H=4C000H。而第一个簇地址存放在FAT1中的:1000H(FAT1起始地址)+62H*02H=10C4H。而10C4H地址上的数据为:FF FF,即结束了,也就是说由于NTXT.txt不满一个簇,那么只能分配到一个簇的地址空间。

 

 

 

时间: 2024-09-17 04:02:51

解析FAT16文件系统的相关文章

深入解析 ext2 文件系统

 很久以来,就想写一篇关于ext 家族文件系统的文章,源于我刚工作的时候,曾经一不小心rm -rf,误删除了很多文件,当时真想有个数据恢复软件能帮我把数据回复了.当然学习数据恢复,首先要学习文件系统.最近工作原因,好长时间没看学习Linux kernel 相关的东西,感觉面目可憎.扯远了,开始我们的ext2 文件系统的探索之旅.       那些介绍ext2特征的套话我就不说了,任何一本靠谱的linux教程中都可以找到,我们直接单刀直入,开始探索.       首先生成一个ext2文件系统.我在

深入解析ext2文件系统之mke2fs

  上一遍博文的重点其实将ext2整体的组织框架,我们知道了ext2文件系统由块组组成,每个块组里面的组织形式.我们甚至直接把超级块和组描述符里面的内容,用十六进制形式展现了出来.这篇博文主要讲述如何mke2fs生成合适需要的ext2 文件系统,基本就是参数选择的问题.        mke2fs 常用的几个参数有:       1)    -b     block-size .       块大小是ext2文件系统比较重要的一个参数,目前只支持1024.2048和4096.上篇博文讲到了其中的

《NTFS文件系统扇区存储探秘》——第2章 FAT文件系统的扇区分配 2.1 FAT16的扇区分配

第2章 FAT文件系统的扇区分配 2.1 FAT16的扇区分配 NTFS文件系统扇区存储探秘 FAT16文件系统由于能被目前所有的操作系统所识别,所以在硬盘分区时使用得极为普遍.特别是安装多操作系统的硬盘,有时必须在主分区(C盘)使用FAT16文件系统.如果使用不能被某个操作系统识别的文件系统,则该操作系统就不能顺利安装. 现在的硬盘越来越大,硬盘上安装的应用软件越来越多,而适合这些应用软件运行的操作系统不尽相同,特别是编程人员使用的计算机,一般都安装两三个操作系统.用于多操作系统引导的有关文件

《NTFS文件系统扇区存储探秘》——2.2 FAT16扇区寻址实例分析

2.2 FAT16扇区寻址实例分析 NTFS文件系统扇区存储探秘 详细了解文件系统的扇区分配是排除硬盘逻辑故障的重要基础.下面以作者使用的硬盘为例,介绍FAT16文件系统的扇区地址的寻址计算方法. 在进行扇区寻址和计算的过程中,需要用到后面<工具篇>中介绍的一些工具程序,本章先使用这些程序的执行结果,程序的详细运行方法在后面的章节中再作介绍. 作者使用的计算机上挂接了两块硬盘,为了在以后进行扇区扫描时节省时间,特意选用了两块小容量的硬盘.一块容量是6.2GB,接在第一IDE接口上,硬盘编号是&

全面解析磁盘分区格式

当前越来越多的用户已经从Windows 98逐步升级到更高级的系统了,随之而来的就是必须面对Windows 98/2000/XP/2003等系统的FAT16/FAT32/NTFS磁盘分区 格式,它们到底是什么?有什么特点和优点?到底选择那种格式?如何建立的转换?如何解决使用中的各种问题? 本专题就是针对读者普通遇到的上述一系统问题,进行全方位的讨 当前越来越多的用户已经从Windows 98逐步升级到更高级的系统了,随之而来的就是必须面对windows 98/2000/XP/2003等系统的FA

操作系统安装时文件系统的选择

Windows可以同时支持FAT32和NTFS两种文件系统,FAT32长于兼容性,NTFS长于系统安全性.在满足应用的前提下,怎样设置文件系统才能充分发挥Windows的特性呢?在讨论这个问题之前,我们先来看一下FAT32和NTFS两种文件系统各有哪些特点. FAT32文件系统 在推出FAT32文件系统之前,通常PC机使用的文件系统是FAT16.像基于MS-DOS,Win 95等系统都采用了FAT16文件系统.在Win 9X下,FAT16支持的分区最大为2GB.我们知道计算机将信息保存在硬盘上称

解析U盘不能启动的缘由

  不同的BIOS进行U盘(USB-HDD方式)启动时,对同一U盘的容量参数---柱面.磁头和扇区数(简称CHS),识别各不相同(证明这一点可以在不同的机器上安装同一版本的linux,然后插入U盘,使用hdparm /dev/sda命令就可以发现CHS在不同机器各不相同,甚至如果U盘可以使用GRUB启动的话,在GRUB里使用geometry (hd0)命令也能看出来),这样在一台机器上分区格式化所产生的的分区表和FAT磁盘参数表是按照这台机器所识别的硬盘的CHS来表达的,换到另一台机器时由于另一

fat,fat32,ntfs,ext2,ext3等 文件系统说明

A.FAT16(最大分区2GB,最大文件2GB ,最大容量) 在说明FAT16文件系统之前,我们必须清楚FAT是什么?FAT(File Allocation Table)是"文件分配表"的意思.顾名思义,就是用来记录文件所在位置的表格,它对于硬盘的使用是非常重要的,假若丢失文件分配表,那么硬盘上的数据就会因无法定位而不能使用了.不同的操作系统所使用的文件系统不尽相同,在个人计算机上常用的操作系统中,MS-DOS 6.x及以下版本使用FAT16:OS/2使用HPFS:Windows NT

《NTFS文件系统扇区存储探秘》——1.3 分区引导记录

1.3 分区引导记录 NTFS文件系统扇区存储探秘 硬盘的主引导记录只有一个,存储在硬盘的线性0号扇区上.而硬盘的分区引导记录不止一个,每一个逻辑驱动器都有一个分区引导记录.如果将一个硬盘分为C.D.E.F.G5个逻辑驱动器,就应该有5个分区引导记录,分别存储在各个逻辑驱动器的第1个逻辑扇区中. 分区引导记录主要由4部分组成. (1)BIOS参数记录块BPB(BIOS Parameter Block). (2)磁盘标志记录表. (3)分区引导记录代码区. (4)结束标志"55 AA".