原创 解析FAT16文件系统

2009-5-3 13:14 9268 13 19 分类: MCU/ 嵌入式

解析FAT16文件系统


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


引导扇区的信息如下:


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


点击看大图 


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个字节。有的可能是102420484096


4.  偏移地址0DH,长度1,内容:01。表示的意思是每个簇有1个扇区。这个值不能为0,而且必须是2的整数次方,比如1248163264128。但是这个值不能使每个簇超过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,即大约32MBSD卡存储量。表示小扇区数(Small Sector) 。该分区上的扇区数,表示为16(<65536)。对大于65536个扇区的分区来说,本字段的值为0,而使用大扇区数来取代它。


9.  偏移地址16H,长度2,内容:EC 00。转换一下为00EC,表示每个FAT占用的扇区数。那么每个扇区占用的字节数就是0x00EC*0x200=0x1D800。根据启动区、FAT1FAT2、根目录、数据区的次序,可以依次计算出它们的地址了。(教程中给出的偏移地址为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) 根据该磁盘格式,该字段的值可以为FATFAT12FAT16


启动区:理所当然是0x00


FAT10x1000


FAT20x1000 + 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.  偏移地址28H88H也一样),长度3,内容:54 58 54。表示文件类型,为ASCII字符表示。


4.  偏移地址2BH8BH也一样),长度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个簇的开始的地址就可以计算出来了。



 

点击看大图


 


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


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


而第一个簇地址存放在FAT1中的:1000HFAT1起始地址)+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中的:1000HFAT1起始地址)+62H*02H=10C4H。而10C4H地址上的数据为:FF FF,即结束了,也就是说由于NTXT.txt不满一个簇,那么只能分配到一个簇的地址空间。


 



点击看大图


 

 



 点击看大图


 

PARTNER CONTENT

文章评论7条评论)

登录后参与讨论

用户1821930 2015-1-25 21:38

看深入浅出那本书感觉没看透,上网搜,还是特权老师说的详细

用户377235 2014-11-26 09:58

牛人。。。

用户377235 2014-4-22 16:46

帮我看懂天书了

用户1707737 2012-10-15 21:46

受教了、、

用户421471 2012-8-24 09:23

谢谢总结分享

用户377235 2012-5-17 22:10

如果自己创建一个文件,保留字段应该怎么填?经测试随便填是不行的,到时候Windows不认。

用户189793 2009-5-8 08:06

不错,帮顶一下 以前自己也想整理一份,却没有时间,后来就忘记了.

用户1312638 2009-5-7 09:40

fat文件系统还有人用吗?尤其是fat16,2003年的时候研究过一段时间,

tengjingshu_112148725 2009-5-3 22:51

每簇放多少扇区,每扇区多少字节都是放在启动扇区DBR里,不同容量的卡是不一样的。 还刚赶巧,我这三天一直在看SD的FAT32,已经能实现读和单簇写了:)
相关推荐阅读
特权ilove314 2016-06-30 21:16
例说FPGA连载6:FPGA开发所需的技能
例说FPGA连载6:FPGA开发所需的技能 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   前面的文字已经做了很多铺垫,相信读...
特权ilove314 2016-06-28 21:09
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-28 21:05
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-26 22:11
例说FPGA连载4:FPGA语言与厂商介绍
例说FPGA连载4:FPGA语言与厂商介绍 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   Verilog与VHDL 说到FP...
特权ilove314 2016-06-23 21:26
例说FPGA连载3:FPGA与其它主流芯片的比较
例说FPGA连载3:FPGA与其它主流芯片的比较 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   FPGA、ASIC和ASSP...
特权ilove314 2016-06-21 20:32
例说FPGA连载2:FPGA是什么
例说FPGA连载2:FPGA是什么 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   2015年伊始,Intel欲出资百亿美金收...
EE直播间
更多
我要评论
7
13
关闭 站长推荐上一条 /3 下一条