:SD+FAT16文件系统学习笔记

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 10:27:57

一、物理扇区0MBR

 

 物理扇区0常称为引导扇区(MBR).读取出SD卡的物理扇区0,在物理扇区00x1C6~0x1C94个字节中,可以得到逻辑扇区0(主引导区)的物理扇区地址.可能是因为我不会用WinHex,无法打开物理扇区,只能选择打开逻辑扇区.所以只有从开发板上读出物理扇区0的信息,然后用UART输出.我的SD卡物理扇区0的部分内容如下:

     0  1  2  3  4  5  6  7       8  9  A  B  C  D  E  F

1B0  0  0  0  0  0  0  0  0          0  0  0  0  0  0  0  2      

1C0  c  0  6  3f ff b7 89 0          0  0  77 91 3a 0  0  0      

1D0  0  0  0  0  0  0  0  0          0  0  0  0  0  0  0  0      

1E0  0  0  0  0  0  0  0  0          0  0  0  0  0  0  0  0      

1F0  0  0  0  0  0  0  0  0          0  0  0  0  0  0  55 aa 

 

446 字节为一些引导信息,地址为 0x00~0x1BD。从0x1BE开始,16字节就为一个分区的信息,我的SD卡只有一个分区,所以只有0X1BE~0X1CD有内容.最后两个字节0X550XAA为签名.0X1C6~0X1C9可以知道逻辑扇区0的位置。我这里为89 00  00  00,即0X89,所以第137个物理扇区为逻辑扇区0.16字节的分区信息的其它内容参考下表(表截图于jimsboy(海洋之星) 的“SD卡中 FAT16 文件分析”一文中)。

 

二、主引导区逻辑扇区0(BPB--BIOS参数数据块)

 

     知道了逻辑扇区0的物理扇区位置,接下来的文件系统操作都是基于这个逻辑扇区0,但SD卡的读、写扇区的操作都是从物理扇区地址计算的,比如我想读出逻辑扇区0的数据,我这里就是ReadSingelBlock(137,buffer).我的SD逻辑分区0的内容如下:

 

 

从这里,我们可以得到每扇区的字节数,每簇的扇区数,FAT表所占的扇区数,总扇区数(逻辑扇区),隐藏扇区数(逻辑扇区0前面的物理扇区数),详细内容参考下表(表截图于 jimsboy(海洋之星) 的“SD卡中 FAT16 文件分析”一文中)。

  

 

 对于上表,通过我的SD卡的逻辑扇区0中的数据可得出:每扇区的字节数为512,每簇的扇区数是0X4064),既32KBFAT表的SIZE0XEB235)个扇区,总逻辑扇区数为0X003A91773838327),隐藏扇区数为0X89137. 

三、FAT表

 

 

 

逻辑扇区0之后,跟着的就是两张一模一样的FAT表,从上可知FAT表的SIZE235,所以第一张FAT表的扇区地址是1~235,第二张FAT表的扇区地址是236~470,只要加上隐藏的扇区数,就可以计算出物理扇区的地址,因为FAT文件系统的操作是基于物理扇区地址的。FAT表用两个字节表示一个簇,第0簇用第01字节表示,第1簇用第23字节表示,以此类推。这两个字节里的数值指出下一簇的序号,用查FAT表的方法,就可以知道存放着一个文件的所有簇,当然,一个文件的簇可能并不是连续的。结束簇的值是0XFFFF其它特殊值的含义如下表(表截图于jimsboy(海洋之星) 的“SD卡中 FAT16 文件分析”一文中)。

 

结合上表,可以看出,第01簇已经为文件系统所用了,所以我们储存文件就是从第2簇开始的。综合上面分析过的,第2个簇的物理扇区地址=隐藏的扇区数+FAT保留的扇区数+FAT表的扇区数*2+根目录扇区数(FAT16的根目录扇区数固定为32), 我的SD卡为137+1+235*2+32640

 

 

四、根目录

     根目录里记录着在SD卡的根目录上的文件,包括文件夹,用32个字节来保存根目录下一个文件的信息。FAT16的根目录扇区数为32,因为一个文件信息占32字节,所以FAT16的根目录下的文件最大数为512个。这32个字节的内容如下表(表截图于 jimsboy(海洋之星) 的“SD卡中 FAT16 文件分析”一文中)。

 

 

 

 

一般文件对照上表就可以查出相关信息,特殊的是文件夹。如果根目录下的文件信息显示这个文件是文件夹的话,进入相关簇,可以看到,这个文件夹的簇的格式和根目录也是一样的,也是用32个字节记录文件信息,如果这里面还是有文件夹,则以此类推下去。无论这个文件夹里面是否有文件,里面总会有两个32字节的文件信息。如下图是我的SD卡的SD卡的根目录下的一个文件夹,这个文件夹在第2簇,这个文件夹里面是空的,名为123

     可以看到第一个文件名为0X2E0X2EASCII中表示”.”,表示这是一个目录,0X20表示空格。这个文件就表示是当前目录,在DOS中,也是用”.”表示当前目录的。可以再看一下这个文件的所在簇,就是第2 簇,所以这个就表示是当前文件夹。接下来,第三、四行数据显示文件名是0X2E 0X20 0X20……0X2E 0X2E就是“..”,这就是表示上一级目录,可以看一下这个文件的簇地址,是0000就表示是根目录。