原创 智林STM32开发板上的FatFS移植过程分析(四)

2010-3-16 21:41 5171 6 6 分类: MCU/ 嵌入式

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

 

 


七、FAT32文件系统格式分析


1、引导扇区


引导扇区包含着磁盘和文件系统的许多重要参数。文件管理系统首先要对该扇区的信息进行分析,才能了解当前磁盘上文件系统的格式。


EB 58 90 4D 53 44 <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />4F 53 35 2E 30 00 02 08 20 00 02 00 00 00


00 F8 00 00 3F 00 FF 00 00 00 00 00 00 34 0F 00 CC 03 00 00


00 00 00 00 02 00 00 00 01 00 06 00 00 00 00 00 00 00 00 00


00 00 00 00 00 00 29 22 B0 50 A0 4E 4F 20 4E 41 4D 45 20 20


20 20 46 41 54 33 32 20 20 20 33 C9 8E D1 BC F4 7B 8E C1 8E



11-12字节


每一扇区的字节数


典型为0x0002512


13


每簇扇区数


8


14-15


保留扇区数


0x2000,保留32个扇区


21


介质类型


0xF8,固定介质


32-35


总扇区数


0x00 34 0F 00,十进制996352


36-39


文件分配表所占扇区数


0x CC 03 00 00972


44-47


根目录所在簇号


02 00 00 002号簇


48-49


FSINFO扇区标号


01 00,在1号扇区


50-51


引导扇区的备份扇区号


06 00,在6号扇区


66


扩展引导标志


0x29


82-89


FAT32字符串


46 41 54 33 32 20 20 20


 


 


 


FAT32FAT12FAT16区分是通过簇的数量,簇总数=总扇区数-(保留扇区数+分配表扇区数+根目录区扇区数)/每簇扇区数。996352-32+972*2+0/8=12429712万多簇,肯定是FAT32系统。


FAT32文件系统,根目录区与普通目录一样,都是位于数据区,比较典型的都是从2号簇开始。数据区起始扇区号=根目录区起始扇区号=保留扇区+2*分配表扇区=32+1944=19763号簇起始就是1984。利用shell命令里的SDRD命令读出来看一下。我编写的这个命令以扇区号为参数,每次读入两个扇区,并以十六进制的形式显示在串口终端上。


Sdrd 6:


EB 58 90 4D 53 44 4F 53 35 2E 30 00 02 08 20 00 02 00 00 00


00 F8 00 00 3F 00 FF 00 00 00 00 00 00 34 0F 00 CC 03 00 00


00 00 00 00 02 00 00 00 01 00 06 00 00 00 00 00 00 00 00 00


00 00 00 00 00 00 29 22 B0 50 A0 4E 4F 20 4E 41 4D 45 20 20


0号扇区的一样,表明6号扇区是引导扇区备份。


FAT32文件系统的FSINFO扇区带有一些标志和


2、文件分配表格式


Sdrd 32


F8 FF FF 0F FF FF FF FF FF FF FF 0F FF FF FF 0F FF FF FF 0F


FF FF FF 0F FF FF FF 0F FF FF FF 0F FF FF FF 0F FF FF FF 0F


FF FF FF 0F FF FF FF 0F FF FF FF 0F 00 00 00 00 00 00 00 00


00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


0x0F FF FF F8表明文件分配表的开始,第4-7字节为分配表保留,第8-12字节0x0F FF FF FF代表这个文件或目录只占据一个簇,如果为非0且小于0x0F FF F7表明该文件的下一个簇簇号。


 


3、目录项结构形式


FAT32的目录项包含了文件的很多性质:包括文件名、是目录还是文件、创建日期、文件起始簇号等等,是读取文件数据的基础。


我在SD卡的根目录下创建了三个文件aaa.txtbbb.txtccc.txt和两个个目录111222、这两个目录都是相同的aaa.txt等文件。根据前面的计算,根目录是在簇21976扇区。


Sdrd 1976:


E5 B0 65 FA 5E 20 00 87 65 2C 67 0F 00 D2 87 65 63 68 2E 00


74 00 78 00 74 00 00 00 00 00 FF FF E5 C2 BD A8 CE C4 7E 31


54 58 54 20 00 36 17 8B 6F3C6F3C 00 00 18 8B 6F3C 00 00


00 00 00 00 41 41 41 20 20 20 20 20 54 58 54 20 18 36 17 8B  //文件aaa.txt目录项


6F 3C 6F3C00 00 49 8B 6F3C03 00 64 05 00 00 E5 B0 65 FA


5E 20 00 87 65 2C 67 0F 00 D2 87 65 63 68 2E 00 74 00 78 0//为什么中间有两个空目录项


74 00 00 00 00 00 FF FF E5 C2 BD A8 CE C4 7E 31 54 58 54 20


00 36 17 8B 6F3C6F3C 00 00 21 8B 6F3C 00 00 00 00 00 00


42 42 42 20 20 20 20 20 54 58 54 20 18 36 17 8B 6F3C6F3C  //文件bbb.txt目录项


00 00 55 8B 6F3C 04 00 15 01 00 00 E5 B0 65 FA 5E 20 00 87


65 2C 67 0F 00 D2 87 65 63 68 2E 00 74 00 78 00 74 00 00 00


00 00 FF FF E5 C2 BD A8 CE C4 7E 31 54 58 54 20 00 36 17 8B


6F 3C6F3C 00 00 23 8B 6F3C 00 00 00 00 00 00 43 43 43 20   //文件ccc.txt目录项


20 20 20 20 54 58 54 20 18 36 17 8B 6F3C6F3C00 00 61 8B


6F 3C05 00 70 01 00 00 E5 B0 65 FA 5E 87 65 F6 4E 39 59 0F


00 75 00 00 FF FF FF FF FF FF FF FF FF FF 00 00 FF FF FF FF


E5 C2 BD A8 CE C4 7E 31 20 20 20 10 00 78 ED 98 70 3C 70 3C


00 00 EE 98 70 3C 06 00 00 00 00 00 31 31 31 20 20 20 20 20 //这是目录项111


20 20 20 10 00 78 ED 98 70 3C 70 3C00 00 EE 98 70 3C 06 00


00 00 00 00 E5 B0 65 FA 5E 87 65 F6 4E 39 59 0F 00 75 00 00 //目录项大小为0


FF FF FF FF FF FF FF FF FF FF 00 00 FF FF FF FF E5 C2 BD A8


CE C4 7E 31 20 20 20 10 00 BB F4 98 70 3C 70 3C 00 00 F5 98


70 3C 07 00 00 00 00 00 32 32 32 20 20 20 20 20 20 20 20 10  //这是目录项222


00 BB F4 98 70 3C 70 3C00 00 F5 98 70 3C07 00 00 00 00 00


下面结合目录项的性质进行简单分析:



0-10字节


短文件名


0字节为E5表示目录空。41 41 41 20 20 20 20 20 54 58 54,就是aaa.txt的内部表示。


11


文件属性


1只读、2隐藏、4系统、8ID15长文件,16目录,32档案。


13


时间单位


 


14-15


建立文件时间


17 8B表示172446


16-17


建立文件日期


6F 3C表示3003151980开始2010-3-15


20-2126-27


文件开始的簇号


00 00 03 00表示aaa.txt开始于3号簇


28-31


文件大小,按字节算


64 05 00 00,表示文件供两个扇区,1380个字节


因为根目录可能有一些特殊性,下面进入子目录111看一下:


这个目录的首扇区=1976+6-2*8=2008,利用sdrd命令读入。


Sdrd 2008


2E 20 20 20 20 20 20 20 20 20 20 10 00 78 ED 98 70 3C 70 3C//红色表示目录。、目录为自身,6号簇


00 00 EE 98 70 3C 06 00 00 00 00 00 2E 2E 20 20 20 20 20 20 // 、、目录, 0号簇


20 20 20 10 00 78 ED 98 70 3C 70 3C00 00 EE 98 70 3C00 00  //上层目录为根目录


00 00 00 00 41 41 41 20 20 20 20 20 54 58 54 20 18 23 FB 98


70 3C 70 3C00 00 49 8B 6F3C08 00 64 05 00 00 42 42 42 20 //这个下面的aaa.txt


20 20 20 20 54 58 54 20 18 33 FB 98 70 3C 70 3C 00 00 55 8B  文件在8号簇


6F 3C 09 00 15 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00


由此可见普通目录完全与书中介绍的一样,根目录不知道怎么回事?

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条