初级会员

- 积分
- 54
- 金钱
- 54
- 注册时间
- 2013-7-15
- 在线时间
- 4 小时
|
最近这几天在啃代码,看到文件系统时。遇到一个问题。原子哥,给的资料,《fat文件系统原理》中有这么一段话。
FAT16 文件系统从根目录所占的 32 个扇区之后的第一个扇区开始以簇为单位进行数据的处理,这之前仍以扇区为单位。对于根目录之后的第一个簇,系统并不编号为第 0 簇或第 1 簇 (可能是留作关键字的原因吧),而是编号为第 2簇,也就是说数据区顺序上的第 1 个簇也是编号上的第 2 簇。
正如上面说说的,对于根目录之后的第一个簇,系统编号为第2簇。但是为什么我看fat代码的时候,是说fat16,根目录簇号为2。代码如下:(我用红色标出的那一句)
unsigned char FAT_Init(void)//Initialize of FAT need initialize SD first
{
bootsector710 *bs = 0; //定义DBR结构体,包含BPB部分(12~90字节是BPB)
bpb710 *bpb = 0; //定义BPB结构体
partrecord *pr = 0; //定义硬盘信息 结构休 (16字节)
DWORD hidsec=0; //隐藏的扇区数即为DBR在物理扇区的偏移量
long long Capacity;
Capacity =(long long)SD_GetSectorCount()*512; //得到SD容量,单位为字节
if(Capacity<0xff)return 1;
if(SD_ReadDisk(fat_buffer,0,1))return 2; //读物理扇区0。即MBR(其中MBR内的硬盘分区表中有DBR的地址信息),如没有MBR,则为DBR。经测试,我的SD卡是有MBR的
if(fat_buffer[0]!=0XEB&&fat_buffer[0]!=0XE9) //如物理0扇区第一字节不为0XEB或0XE9,则存在MBR,否则不存在
{
//printf("此SD卡的物理扇区0为MBR\n");
pr = (partrecord *)((partsector *)fat_buffer)->psPart;//first partition 第一分区
hidsec=pr->prStartLBA; //隐藏的扇区 即DBR的物理扇区偏移
//printf("此SD卡的DBR的物理扇区为=%d\n",hidsec) ;
}
else
{
hidsec=0; //无MBR,物理扇区0即为DBR
//printf("此SD卡不存在MBR,物理扇区0即为DBR,物理扇区0即为逻辑扇区0.\n");
}
if(SD_ReadDisk(fat_buffer,hidsec,1))return 3;
//printf("DBR物理扇区偏移量:%d \n",hidsec);
bs = (bootsector710 *)fat_buffer;
bpb = (bpb710 *)bs->bsBPB;
if(bpb->bpbFATsecs)//detemine thd FAT type do not support FAT12
{
FAT32_Enable=0; //FAT16
FATsectors = bpb->bpbFATsecs; //FAT表占用的扇区数
FirstDirClust = 2; //为什么是2,到底是根目录的簇号是2,还是根目录以后的一个数据区的簇号是2
}
else
{
FAT32_Enable=1; //FAT32
FATsectors = bpb->bpbBigFATsecs;//FAT占用的扇区数
FirstDirClust = bpb->bpbRootClust;
}
BytesPerSector = bpb->bpbBytesPerSec; //每扇区字节数
SectorsPerClust = (BYTE)bpb->bpbSecPerClust; //每簇扇区数
FirstFATSector = bpb->bpbResSectors+hidsec; //第一个FAT表扇区
RootDirCount = bpb->bpbRootDirEnts; //根目录项数
RootDirSectors = (RootDirCount*32)>>9; //根目录占用的扇区数
FirstDirSector = FirstFATSector+bpb->bpbFATs*FATsectors; //第一个目录扇区
FirstDataSector = FirstDirSector+RootDirSectors; //第一个数据扇区
//printf("每扇区字节数:%d \n",BytesPerSector);
//printf("每簇扇区数:%d \n",SectorsPerClust);
//printf("第一个FAT表扇区:%d \n",FirstFATSector);
//printf("根目录项数:%d \n",RootDirCount);
//printf("根目录占用的扇区数:%d \n",RootDirSectors);
return 0;
}
我现在都搞不明白到底,簇2是从哪一个开始了。还请高手解答。小弟菜鸟。 |
|