1、DBR(DOS BOOT RECORD 操作系统引导记录区)
DBR是我们进军FAT32的首道防线。
3、其实DBR中的BPB部分才是这一区域的核心部分(第12~90字节为BPB)
4、在程序中我们采用以上的结构体指针对扇区数据指针进行转化,就可以直接读取数据中的某一字段,如要读取BPB_BytesPerSec,可以这样来作:
((structFAT32_DBR*)pSector)->BPB_BytesPerSec,用如上语句就可以得到这一字段的首地址。
5、不同机器内部对变量的字节存储顺序不同,有的采用大端模式(big-endian),有的采用小端模式(little-endian)。
大端模式是指高字节数据存放在低地址处,低字节数据放在高地址处。
小端模式是指低字节数据存放在低地址处,高字节数据放在高地址处。
FAT32中字节的排布是采用小端模式的。在我们程序中需要将它转为大端模式的表达方式。
6、这样就可以从BPB中读出关于磁盘的各种参数信息,为我们后面的工作作准备。而这个从BPB中读取参数装入到参数表中以备后用的过程就是FAT32的初始化了
具体实现如下:
(1)先定义用来装入从BPB中读取的参数的结构
FAT表是FAT32文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构。
FAT表其实有两个,同步操作,为了安全起见进行操作
利用FAT表进行判断文件的大小,
FAT表。前8个字节“F8FFFF0FFFFFFFFF”为FAT32的FAT表头标记,用以表示此处是FAT表的开始。后面的数据每四个字节为一个簇项(从第2簇开始),用以标记此簇的下一个簇号。
根据簇号判断文件的大小,当时FF FF FF 0F时说明后面没有簇了
PS:基础知识了解
磁盘上最小可寻址存储单元称为扇区,通常每个扇区为512个字节。
由于多数文件比扇区大得多,因此如果对一个文件分配最小的存储空间,将使存储器能存储更多数据,这个最小存储空间即称为簇。
根据存储设备(磁盘、闪卡、和硬盘)的容量,簇的大小可以不同以使存储空间得到最有效的应用。
在早期的360KB磁盘上,簇大小为2个扇区(1,024字节);
第一批的10MB硬盘的簇大小增加到8个扇区(4,096字节);
现在的小型闪存设备上的典型簇大小是8KB或16KB。
2GB以上的硬盘驱动器有32KB的簇。
如果对于容量大的存储定义了比较小的簇的话,就会使FAT表的体积很大,从而造成数据的冗余和效率的下降。
我们按照初始化参数表中的SectorsPerClust可以知道一个簇中的扇区数
给出一个簇号,计算出它的后继簇号,是实现FAT32的重点
如何计算FAT表可以表示的簇的个数:
FAT表中每四个字节表示一个簇,所以FAT表的大小由实际的簇数来决定。从这里也可以看出,如果簇过大,就会则FAT表比较小,但会造成空间的浪费,
而如果簇过小,可以减小空间的浪费,但会使FAT表变得臃肿。FAT表的大小也可以从BPB参数FATsectors读出。
若SD卡的FAT表大小为958个扇区(“BE 03 00 00”的大端表示)。如果这958个扇区每四个字节都表示一个簇项,则它可以
表示(958*512/4)-2=122622个簇(减去2是因为有8个字节的FAT表头标识。
一个文件数据的首簇号怎样 来确定呢?
只有知道了一个文件数据的首簇号才能继续查找下一簇数据的位置,直到数据结束。下面将要讲到的“根目录区”就可以由一个文件的文件名来查到它的首簇。
根目录区(也是文件),根目录的名称就是磁盘的卷标
根目录区所在扇区可从BPB参数FirstDirSector获取,从BPB图得FirstDirSector=FirstFATSector+BPB_NumFATs*FATsectors=2053。根目录区的 初始大小为一个簇,
我们最终要实现的是对TEST.TXT文件的读取,须要作到给定文件名后,可以得到相应文件的首簇。主要的思想就是对根目录区中(本实例只针对根目录中的文件进行读取,
至于多级子目录的实现,只须要进行多次首簇定位)的记录进行扫描,对记录中的文件名进行匹配。
通过对根目录区的扫描,可以得到TEST.TXT首簇为3,下面就可能以它为起点,来读取文件内容了。
得到首簇号后如何对文件进行读取?
目的:就是到相应的簇及其后继簇去读取数据
这些簇在磁盘的什么位置呢?从FAT表中可以看到,簇号是从2开始的,而第2簇的位置就在第二个FAT表(一共有两个FAT表,它们即时同步)的后面,即根目录所在的簇就为第2簇。
主要思想是这样的:
在已各文件首簇的前提下,从首簇开始,对于文件满一簇的数据,就把整簇数据读出(其实还是按扇区来读,只是一次性读出所有扇区),对于文件
结尾不足一簇的部分,计算它占用了簇内几个扇区,把占用整个扇区部分直接按扇区读出,而最后很有可能是零散的若干个字节,不足一个扇区,即占用了
最后一个此文件最后一个扇区的一部分,对于这部分我们也要将整个扇区读出,截选中有效的数据部分。文件信息结构中的FileOffset参数将时刻记录文
件读到的位置,它与文件大小的差就是还未读取的数据数量。