打印

嵌入式之初探FAT32

[复制链接]
3471|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wzt19910506|  楼主 | 2012-4-10 11:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
嵌入式之初探FAT32
   前一段学习arm碰到了fat32文件系统,大概看了一下整个程序的长度,三十几页的长度吓住了我……看到那么长的程序发麻啊,就放了一个星期。也可能是加上同时学习FPGA和调频无线电,导致自己总是静不下心钻研进去。想想还是要静下心来一样一样完成,不能遇到点坎坷就放下吧……于是乎,开始从网站上搜索各种关于fat32的资料……经过两天的时间终于大概明白了fat文件系统的大概结构。应为我也是刚刚学不可能很深入,就讲解一下自己遇见的一些问题以及解决办法。也给学习fat的同学一个参考。
              我学习的是fat32所以就以fat32为模板。先介绍下fat32,我们平时都操作过计算机,我们建个文档很容易吧,复制篇电影也挺简单,可是在硬盘上这些文件又是怎样存储的呢?还有硬盘上的数据文件数目不会少吧,这些计算机怎么进行无误的管理,这就需要文件系统,现在大多数硬盘都采用ntfs文件系统,然而早期的电脑以及现在的大多数手机,u,MP3等很多带有存储功能的设备还是使用fat32fat32不支持单个大于4g的文件,可寻址空间可以达到2T,具体这些怎么计算大家可以参阅具体文档)。可以说他是操作系统和数据存储的支撑。现在的嵌入式免不了对数据的存储吧,所以fat32还是相当重要的,不懂他想diy个数码相框,mp3,视频播放器那是不可能的……

fat
文件系统大致可以分为5部分:主引导记录MBR、操作系统引导记录DBRFAT表、文件目录项FDT。这些东西到底储存在哪里?有何作用?这也是我起初的迷惑所在。其实这些东西在sd卡(或T-F卡)格式化之后会计算机会在卡的起始存储区域建立这些表格,当然文件的有效管理也是就是依靠他们。接下来在我寻找MBR是遇到了一个大问题(其实是个小问题,弄了一天才解决):我把我的sd卡,u盘统统格式化为fat32格式然后用winhex(软件)来查看磁盘里面的原始数据(都是些数字),他们统统的没有MBR,把sd卡在别人电脑上格式化还是没有。我就开始使劲的百度……别人总结的有的sd卡上面就是没有MBR我就只能信之,后来偶然看到振南写的znfat书的有一张讲到winhex说打开磁盘有两种格式:一种逻辑的,一种物理的。而之前我一直用的是逻辑的……物理磁盘打开后我狂晕,我一天没解决的问题就是因为这个。而物理和逻辑到底有          多大区别,其实很简单就是逻辑磁盘他把MBR包括MBR后面的空白扇区给隐藏了。直接把DBR当做0扇区。MBR有还是没有决定于你格式化所用的软件……而找到他究竟有何用?如果你的只是用来存储数据的sd卡,没有分区(一般sd卡都没有分区),不是操作系统启动盘,可以说他基本没用,找到他就是为了找到接下来要说的DBR的位置。如何找就要看里面的具体数据代表的含义,网上大多数资料都有,这里就不细说了。DBR中包含了很多信息,通过它我们可以找到FAT表和FDT文件目录。这里只是讲一下他的大概,也不深入讨论了。FAT32文件系统的DBR后面也留有备用空间,可以很方便以后的os代码扩展,这个DBR很关键所以在备用空间内有备份,大多数是再往后六个扇区的位置,这点在sd卡数据丢失再恢复有很大作用。通过DBR找到FDT文件目录就可以进行文件的读取了。FDT中记录了根目录文件的首簇,通过它可以找到FAT表里的记录,然后通过FAT链表把文件正常的读取出来。
       综上所述读取文件步骤就是:MBR->DBR->FDT文件目录->FAT->文件。这只是一个大概的步骤,而要真正实现文件的读取还有很多的细节问题……下面看一段我编写的找到DBR所在扇区的程序(更确切的说是修改,程序我一直都是参考stm32不完全手册里的例程他的这一部分写的我实在是搞不懂觉得太繁琐,呵呵……可能是人家思想深奥自己理解不透,于是自己在他的程序的基础上把他那部分替换自己写的):
unsigned char FAT_Init(void)

{




bootsector710 *bs
= 0;
//DBR
结构体指针

bpb710
*bpb = 0;

//BPB
结构体指针,BPB包含于DBR

partrecord
*pr
= 0;

//MBR
结构体指针

DWORD rltsector;

//
相对扇区数

if(SD_ReadSingleBlock(0,fat_buffer))return 1;


if(fat_buffer[0]==0xeb||fat_buffer[0]==0xe9)


{


bs=(bootsector710*)fat_buffer;

//
得到DBR数据指针

rltsector=0;


}


else
//
假设读回来的是MBR

{


pr=(partrecord *)((partsector*)fat_buffer)->psPart;
//
得到DPT数据指针

rltsector=pr->prStartLBA;
//
得到DBR所在扇区(在DPT中记录)

if(SD_ReadSingleBlock(rltsector,fat_buffer))return 2;


if(fat_buffer[0]==0xeb||fat_buffer[0]==0xe9)


{


bs=(bootsector710*)fat_buffer;


}


else return 3;




}





bpb = (bpb710 *)bs->bsBPB;

//
最后的到的就是BPB所在地址
}
这段程序的具体思路就是先读取第一扇区的第一个字节,看是否是0xeb,是的话证明没有MBR即第一字节就是DBR,然后就可以直接定位到BPB所在地址(BPB就是DBR中存放重要参数的一部分)。
如果不是0xeb就假设它是mbr通过它找到DBR的地址偏移,读取DBR的第一字节,如果是0xeb则证明假设成立,开始就是MBR,同时也找到了DBR;假若不是0xeb证明这张sd卡的文件系统不是fat32,返回非零值,初始化失败。就先到这吧,刚看了没几天自己还不是很深入了解所以就只能总结下fat32的大体轮廓,如需完全掌握还要下深功夫……
沙发
logokfu| | 2012-4-10 13:24 | 只看该作者
:)

使用特权

评论回复
板凳
ji7423| | 2012-4-10 14:10 | 只看该作者
嗯嗯。学习下。

使用特权

评论回复
地板
na239152605| | 2012-4-14 16:06 | 只看该作者
学习了!!!!!!!!

使用特权

评论回复
5
小韬同学| | 2012-4-14 17:49 | 只看该作者
学习下,我最近在移植FATFS

使用特权

评论回复
6
lcq07| | 2012-8-11 15:43 | 只看该作者
第一个字节是否是0xeb或者0xe9不能作为判断是否是MBR的条件,我用winhex将有MBR的的sd卡第一扇区第一字节改为0xeb后windows依然能识别出fat32分区

还有开源的fatfs在判断时是先假设第一扇区就是BPB然后去比较其中的一些字符是否匹配"FAT",如果匹配就认为第一扇区就是BPB(即没有MBR),如果没有匹配就认为第一扇区是MBR再按MBR的分区表去搜FAT分区。但事实上我将没有MBR的sd卡第一扇区内"FAT"字符清掉,windows仍然能识别,但fatfs就不行了,这说明楼主和fatfs对于识别第一扇区是否为MBR还是有问题的,微软可能还是有一部分技术细节没有公布

使用特权

评论回复
7
flyleaf91| | 2012-8-14 14:17 | 只看该作者
5# 小韬同学
可以参考一下野火fatfs0.09 例程~

使用特权

评论回复
8
一般首席| | 2013-11-5 17:42 | 只看该作者
学习了

使用特权

评论回复
9
puchuang| | 2013-11-5 20:51 | 只看该作者
很不错的学习帖子  很不错   强大  楼主

使用特权

评论回复
10
puchuang| | 2013-11-5 20:52 | 只看该作者
很不错的学习帖子  很不错   强大  楼主

使用特权

评论回复
11
puchuang| | 2013-11-5 20:53 | 只看该作者
这一块  有时间  需要好好看看  先顶一个  谢谢了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

134

帖子

8

粉丝