单片机学习小组
直播中

肖蕾

7年用户 150经验值
私信 关注

FAT32文件系统寻找文件存储扇区

FAT32文件系统寻找文件存储扇区

自从我做完12864图像显示后就在想做个视频玩玩,结果视频生成的帧需要大量的储存空间,仅凭那可怜的8KB啥也做不了,于是就开始找一种大容量的存储器!可是用什么呢?EEPROM是肯定不行的,外部扩展也不行,还是信息的力量让我知道了-------SD卡;

其实SD卡我不陌生,以前在日照买的MP4用的是1GB SD卡,想到那东西如果可以用的话,那将会对我有质的飞跃,于是我找了一些资料,通过看这些资料我开始知道奥原来SD卡内部是有文件系统的!怪不得电脑能读取他呢!并且这种文件系统在我们的电脑上,手机上,到处是,平时我们只是知道:把一首歌考到MP3播放器里的文件夹里,就可以听了;熟不知这就是文件系统的功劳啊!在文件系统里我看到了FAT32的存在,于是我决定看看到底什么是FAT32文件系统。

开始在看振南写的关于FAT32的资料,不行啊,不懂,后来又在网上找了些资料综合后找出了寻找FAT32文件的路径。

打个比方:现在我在可移动磁盘(H)里建一个文件文件名为EEE.txt,里面写ABCDE五个字符,

然后保存;我要在存储卡里找到这五个字符怎么实现呢?

下面是我找到他的过程:

首先进入DBR中找到BPB


这就是SD卡的0扇区,我们要的是BPB,那BPB在哪里?呵呵在从地址字节0----地址字节5960字节数据;

当然在这60字节里也有大部分是不必要的,真正有用的是一小部分,那这部分是什么呢?

第一:11——12地址字节的数据代表每扇区字节数(上表中为0002)这里数据时小端(数据地位在地址高位)表示所以要转换成大端(数据地位在地址地位)为0x0200;再转换成十进制为512,原来是这样,也就是这两个字节告诉我们每扇区512个字节;仅此而已!

第二:13地址字节数据代表每簇扇区数(上表位08)表示一个簇有8个扇区,也就是8*512=4096=4KB

第三:14——15地址字节代表保留扇区数,也就是FAT表是从这里开始的。(上表中为0C11转成0x110C转成十进制4364扇区)

到这里引出第一个关键项

FAT1地址字节的开始=4364*512=2234368(记好了)

第四:16地址字节代表FAT表的个数(上表位02)表示有2FAT

第五:36——37地址字节代表FAT表占的扇区数(上表为7A07转换0X077A转换成十进制1914扇区)为了方便起见我们把它转换成字节形式:1914*512=979968,与其说FAT表占了1914个扇区不如说FAT表占了979968个字节

第六:有了FAT1的初始字节,FAT表的长度,那么根据FAT32文件系统的结构可知,FAT1表下面是FAT2

FAT2地址字节=FAT1地址字节+FAT长度=2234368+979968=3214336地址字节

同理FAT2表下面是根目录则:

根目录地址字节= FAT2地址字节+ FAT长度=3214336+979968=4194304地址字节

至此BPB的有效数据已经读完了总结如下:

通过上面的对BPB的分析我们知道了原来一个扇区有512个字节,一个簇有4KB8个扇区),

关键是我们知道了FAT表和根目录的位置如下:

FAT1开始地址字节:2234368

FAT2开始地址字节:3214336

根目录开始地址字节:4194304

下面看看我们找的对不对?

FAT1:







FAT2:

根目录:

这样我们找到了根目录,FAT表后有什么用那?还是没找到文件存哪里啊?接下来该是找得到文件的存储位置的时候了:

第一:我们现在根目录里找到EEE.TXT如图:


这就是了:在对根目录进行解释

第一行45 45 45 20 20 20 20 20:表示EEEEASCII码是4520表示空格,即不满八位空格补,54 58 54表示TXT即文件类型,

第二行5-6个字符01 00表示此文件开始簇的高位地址

第二行10-11个字符BC 2F表示此文件开始簇低位地址

把这两个字节结合为一个四位:0x00012FBC这就是此文件的开始簇,转换成十进制为77756

然后你知道了开始簇你还要到FAT表里找到他,看看他占了几簇!怎么在FAT表里找到他呢?

FAT表里一簇用4个字节表示,数据是从FAT表中第二个簇开始的(也就是第9个字节向后,前8个字节为FAT标志)

所以前两个簇是无用的,要用(777562=77754簇,前面说了一个簇用4字节表示那么我们要找到77754簇的字节地址就要把它分解成字节所以有77754*4字节=311014字节(也就是在FAT表中第311014字节是此文件的FAT对应簇),好了这就找到了?没有还差一步

你要知道FAT1的首地址,好了我知道然后加上311014才是;

所以=FAT1首地址字节+此文件在FAT表中占得字节数=2234368+311014=2545392(此文件的FAT表中的簇)如果这个文件大于一簇那么必定会有下一簇,如果这个文件不到一簇那么这个我们找到的FAT表中应为FF FF FF 0F(结束标志)好了前面我们写入的是ABCDE怎么会大于4KB那?显然我们找到的这个簇一定是FF FF FF 0F

看看是不是:

果然是FF FF FF 0F;

这其实是为超过一簇的文件制作的链表,这个不满一簇所以就结束了,如果满一簇则会在下一个FAT表中给出超出一簇的存处地址,一次类推,这也是FAT表的关键用途;

我们这个继续,既然FAT表中显示我们存储的数据不满一簇我们直接找就行了,根据FAT32结构,可知根目录下是数据区,所以要这样计算存数扇区的首地址字节=根目录+(此文件的簇大小—2FAT表中的前两个簇是FAT标志,真正的数据从第二簇开始所以要减去】)*一簇的字节数=4194304+77756-2*4096=322674688

看看我们写的ABCDE是不是存在这个地址字节下了?


看看吧第一行:41 41 43 44 45 正好是ABCDEASCII

现在我敢说:我在可移动磁盘(H)盘下建立的EEE.TXT文件中的ABCDE被保存在H盘的第322674688/512=630224扇区看看图:

第二行逻辑扇区数:630224

至此找到了,真>他*的麻烦啊






更多回帖

发帖
×
20
完善资料,
赚取积分