首先看一下SD卡中的储存结构大致为下图所示:
那么1BE-1CD中写的是些什么东西?从下表中可以分析得出结论,在看这些数据之前,一定记住这些都是用小端模式储存的,(关于大小端模式区别自己另外学习吧~)。从其中只要了解2个地方数据。一个是1C6~1C9地方的值为128,就是指分区从128号物理扇区开始,也就是逻辑扇区0的起始位置。还有1CA~1CD地方的数据表示逻辑扇区总数量。
看完了MDR引导区,根据1C6处的数据跳到物理128号扇区(逻辑扇区0)查看DBR处的数据。具体内容如下:
128号物理扇区(逻辑扇区0)我们需要的信息有很多,我们挑选对我们单片机读写有用的信息查看,如下,图中所示,其中红色文字对我们较为有帮助的信息:
从上面图表中可以得到一些有用的信息:
1. 卡的大小是3.56G
2. 每个簇有128个扇区,即64K
3. 卡的总扇区数7475200,隐含区数128
4. FAT表的大小为229个扇区
根据FAT16的格式,主引导区后就是两个一样的分区表,分区表后面又跟了32个扇区作为根目录区。然后后面就是存放文件和文件夹的地方了。每个分区表既然大小算出来是229个扇区,那么FAT1在6-234扇区,FAT2就是235-463扇区,根目录就是464-495,数据区开始于496,所以第一个图可以表示为
下面插入本SD卡中的一个FAT区的:
个扇区 ,如下图所示:
FAT16和FAT32每个文件名都占32个字节,这里放的是短文件名,也就是“8.3”格式的。
但FAT16的根目录区只有32个扇区,计算一下,每个扇区512字节,共32个扇区,而每个文件要占用32个字节,很显然,根目录只能放512个文件了。因此,FAT16的根目录下只能放512个文件(及文件夹)就是这个原因。 先看前32字节,它的内容是这样的
就看最前面的32字节吧,它表示了一个文件(或文件夹),现在对它分析一下。前11个字是文件名。从后面的ASCII表中可以看出,它就是我写进去的那个名为LongData.txt文件。
第0x0B个字节内容为0x20(0010 0000),可以知道它的属性为存档(文件),如下图这与我们从windows中观察到的它的属性是一致的。大小为384K,也与我们的分析一致
再从根目录表看一下创建和修改日期吧。找到对应的字节95 49。它代表的值为0x4995,把它弄成2进制就是0100 1001 1001 0101 ,把它按格式分析一下,0100100年1100月10101日,换成十进制就是年36,加上1980为2016年。月份为12,日期为21。与上图显示结果一致。时间也一样分析,这就不再举例了。
再看第二项,就是offset为0003A060那行,文件夹名是DIR,没有后缀名。偏移地址0A处对应的数据为2,对照着表看一下,它是一个文件夹。按上面的方法分析它,它开始于第2个簇。我这个文件夹下面放的是一个文件,名子叫testwo.txt。根据刚才的经验,那第一个表项一定是以testwo.txt开头的,没有后缀名,属性为文件夹跟踪过去看一下再说。
咦?不对哦,它是2E,后面是空格。第二项,也不对,它是2E2E,后面也是空格,直到第三项才是我预想的文件。 那前面那个项,一个是2E,一个是2E 2E,它倒底是何方神圣,对照ASCII表,它就是一个小点‘.’。这个小点什么意思,那第二项就是‘..’,有没有什么启发?——DOS!那个古老的操作系统是怎么访问文件夹的?cd ..就是返回上一层目录。难道……?没错!就是它,一个点代表当前目录,两个点代表上级目录。看一下当前目录那一项,观察一下它的地址为0002,就是这个目录。而‘..’对应的那一项,分析一下地址。00 00,也就是根录。所以就可以利用这里找到上一级目录,于是就可以实现一级一级目录的访问了。