一、物理扇区0(MBR) 物理扇区0常称为引导扇区(MBR).读取出SD卡的物理扇区0,在物理扇区0的0x 0 1 2 3 4 5 6 7 8 1B0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 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 前446 字节为一些引导信息,地址为 0x00~0x1BD。从0x1BE开始,每16字节就为一个分区的信息,我的SD卡只有一个分区,所以只有0X1BE~0X1CD有内容.最后两个字节0X55、0XAA为签名.从0X 二、主引导区逻辑扇区0(BPB--BIOS参数数据块) 知道了逻辑扇区0的物理扇区位置,接下来的文件系统操作都是基于这个逻辑扇区0,但SD卡的读、写扇区的操作都是从物理扇区地址计算的,比如我想读出逻辑扇区0的数据,我这里就是ReadSingelBlock(137,buffer).我的SD逻辑分区0的内容如下: ![]() 从这里,我们可以得到每扇区的字节数,每簇的扇区数,FAT表所占的扇区数,总扇区数(逻辑扇区),隐藏扇区数(逻辑扇区0前面的物理扇区数),详细内容参考下表(表截图于 jimsboy(海洋之星) 的“SD卡中 FAT16 文件分析”一文中)。
![]() 对于上表,通过我的SD卡的逻辑扇区0中的数据可得出:每扇区的字节数为512,每簇的扇区数是0X40(64),既32KB,FAT表的SIZE为0XEB(235)个扇区,总逻辑扇区数为0X
三、FAT表
逻辑扇区0之后,跟着的就是两张一模一样的FAT表,从上可知FAT表的SIZE为235,所以第一张FAT表的扇区地址是1~235,第二张FAT表的扇区地址是236~470,只要加上隐藏的扇区数,就可以计算出物理扇区的地址,因为FAT文件系统的操作是基于物理扇区地址的。FAT表用两个字节表示一个簇,第0簇用第0、1字节表示,第1簇用第2、3字节表示,以此类推。这两个字节里的数值指出下一簇的序号,用查FAT表的方法,就可以知道存放着一个文件的所有簇,当然,一个文件的簇可能并不是连续的。结束簇的值是0XFFFF其它特殊值的含义如下表(表截图于jimsboy(海洋之星) 的“SD卡中 FAT16 文件分析”一文中)。 结合上表,可以看出,第0、1簇已经为文件系统所用了,所以我们储存文件就是从第2簇开始的。综合上面分析过的,第2个簇的物理扇区地址=隐藏的扇区数+FAT保留的扇区数+FAT表的扇区数*2+根目录扇区数(FAT16的根目录扇区数固定为32), 我的SD卡为137+1+235*2+32=640。
四、根目录 根目录里记录着在SD卡的根目录上的文件,包括文件夹,用32个字节来保存根目录下一个文件的信息。FAT16的根目录扇区数为32,因为一个文件信息占32字节,所以FAT16的根目录下的文件最大数为512个。这32个字节的内容如下表(表截图于 jimsboy(海洋之星) 的“SD卡中 FAT16 文件分析”一文中)。
一般文件对照上表就可以查出相关信息,特殊的是文件夹。如果根目录下的文件信息显示这个文件是文件夹的话,进入相关簇,可以看到,这个文件夹的簇的格式和根目录也是一样的,也是用32个字节记录文件信息,如果这里面还是有文件夹,则以此类推下去。无论这个文件夹里面是否有文件,里面总会有两个32字节的文件信息。如下图是我的SD卡的SD卡的根目录下的一个文件夹,这个文件夹在第2簇,这个文件夹里面是空的,名为123。 可以看到第一个文件名为0X2E,0X2E在ASCII中表示”.”,表示这是一个目录,0X20表示空格。这个文件就表示是当前目录,在DOS中,也是用”.”表示当前目录的。可以再看一下这个文件的所在簇,就是第2 簇,所以这个就表示是当前文件夹。接下来,第三、四行数据显示文件名是0X2E 0X20 0X20……,0X2E 0X2E就是“..”,这就是表示上一级目录,可以看一下这个文件的簇地址,是00,00就表示是根目录。
![]() |
|