找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5215|回复: 2
打印 上一主题 下一主题
收起左侧

FAT32文件系统的一点知识

[复制链接]
跳转到指定楼层
楼主
ID:83710 发表于 2015-6-23 18:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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
至此找到了,真他妈的麻烦啊





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:83710 发表于 2015-6-23 18:41 | 只看该作者
   最近在做SD卡读写,调了快一星期了总是调不通,昨天晚上做的时候,突然读到两个字节,55 AA,正好是最后两个,那时部分扇区的结束的标志,证明我可能读到了扇区,可是又读0及其他字节,令我失望,没有EB,全是00H,而我读的是0扇区,WINHEX显示是EB开头的,要是不对,那55AA哪来的?而且位置正确,要是对那怎么找不到EB呢?横头疼,所有的都按照时序来的,为什么达不到预期的结国?这么纠结还是今年的头一次!加油吧,毕竟这对我来说意义非常!@
回复

使用道具 举报

板凳
ID:926451 发表于 2021-5-29 10:35 | 只看该作者
讲解得很详细,辛苦了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表