您的位置:首页 > Web前端

SD卡FAT32文件系统调试笔记

2011-12-18 13:43 267 查看
 
 调试笔记:

 

第一步:读取物理扇区0.

从偏移0x1ca(458)开始的四个字节为:0x7,0x5b,0x1e,0x00;

及扇区数量为:0x1e5b07=.每个扇区为512字节。所以SD卡容量为:*512/1024/1024MByte

从偏移0x1C6=454开始的4个字节为:0xF9,0x00,0x00,0x00,表明引导扇区在0xF9=249扇区。获取了SD卡更详细的信息,0扇区就不用管了。

 /*

 unsigned long Range=0;                                                                                               //可以采用两种方式查找BPB区域。

 while(Range<FIND_BPB_UP_RANGE)

 {                                                                                                                                     //采用在扇区中搜寻字符串的方式

  FAT32_ReadSector(Range,FAT32_Buffer);                                                            //最好还是采用从物理0扇区读取的方式在454位置处有BPB的扇区号码

  if(FAT32_Buffer[0]==0xeb && FAT32_Buffer[2]==0x90)

   break;

  Range++;

 }

 return Range;*/

第二步:

进入引导扇区:

前面0x03 到0xA内容 应该为初始化的机器,我的卡上面没有显示,不予理睬

0xB开始的两个字节为0x00 0x02 及代表0x0200=512个字节。每个扇区为512个字节

接下来的0xD位置的为0x20,代表一个cluster有32个扇区

接下来0xE后面两位置为:0x01 0x00 代表有1(0x0001)个保留扇区,即每个fat表所在的扇区为引导扇区(97)+1=98

接下来0x02 代表有两个fat表 此时位置号为16,实际偏移为0--16

接下来00 02 及0x0200=512.代表FDT(目录区)有512个登记项

接下来0x16(22)开始的两个字节:F3 00  即0xF3=243 代表每个fat表占243个扇区

0x36到0x3D代表为:0x46 0x41 0x54 0x31 0x36 0x20 0x20 0x20 1G的卡为FAT16格式

换成2G 的卡:(FAT32)

从偏移0x1ca(458)开始的四个字节为:0x77,0x9F,0x3A,0x00;

及扇区数量为:0x3A9F77=.每个扇区为512字节。所以SD卡容量为:*512/1024/1024MByte

从偏移ox1C6=454开始的4个字节为:0x89,0x00,0x00,0x00,表明引导扇区在0x89=137扇区。获取了SD卡更详细的信息,0扇区就不用管了。

第二步:

进入引导扇区:

前面0x03 到0xA内容 应该为初始化的机器,2G卡上面显示为MSDOS5.0。

0xB(11,在我的后台调试界面上面的编号)开始的两个字节为0x00 0x02 代表0x0200=512个字节。每个扇区为512个字节

接下来的0xD位置的为0x08,代表一个cluster有8个扇区

接下来0xE后面两位置为:0x26 0x00 代表有38个保留扇区,即每个fat表所在的扇区为引导扇区(97)+38

接下来0x02 代表有两个fat表 此时位置号为16,实际偏移为0--16

//接下来00 00 及0x0200=512.代表FDT(目录区)有512个登记项

接下来0x16(22)开始的两个字节:00 00  即0xF3=243 代表每个fat表占243个扇区

0x52到0x58代表为:0x46 0x41 0x54 0x33 0x32 0x20 0x20 0x20 2G的卡为FAT32格式

(SD卡BPB采用小端模式,当读取连续的几个字节的时候,需要自行处理)

2GSDcard 参数:

BPB Num  137                 BPB所在的编号

Total_Size 1875M                总容量

FirstDirCluster 2 :          根目录簇号

FirstDataSector 7665         第一个数据扇区

BytesPerSector:512 bytes      每扇区字节数

FATSectors 3745                   FAT表格占用的扇区数,这个肯定是固定的,可以由总容量和簇数计算尺出来

SectorsPerCluster:8              每簇扇区数

FirstFatSector 175            第一个FAT表扇区号,是不是固定的?

FirstDirSector 7665         第一个目录扇区

RootDirSectors 0                 根目录占用的扇区数,在FAT32中,因为根目录区文件化,即在数据区中,所以没有固定的根目录区占用扇区数,全部为0

RootDirCount 0              根目录项数,固定为 0

跟进到175扇区,可以看到第一个FAT里面的数据:

F8 FF FF 0F FF FF FF FF    FF FF FF 0F FF FF FF 0F(前8个为表头标记)

62 1e 00 00 ff ff ff 0f    ff FF FF 0F FF FF FF 0F

FF FF FF 0F FF FF FF 0F    FF FF FF 0F

(在后面一些位置还会出现有效的数字,先分析我前面读出来的这些数据)

register int nTmp; 

continue: 读文件的根目录区:

46 4f 55 4e 44 20 20 20     30 30 30 16 00 00 cc 44

F  O  U  N  D                0  0  0 

D9 3e d9 3e d9 3e 00 00     CC 44 d9

 

   /*时钟跳变情况,24M->8M不稳定

  关掉COP watchdog可以解决。调试程序的时候可以先把看门狗关掉

  在需要循环延时的地方,需要不断喂狗*/

 

  FAT32:

  物理扇区&逻辑扇区

  CMD24命令往里面写入数据的时候认识的是物理扇区地址

 确定:MBR位于物理扇区0扇区,在里面存储了DBR扇区的物理扇区地址。

              DBR位于逻辑扇区0扇区

             

     读写物理扇区是物理地址,逻辑地址是文件系统来说的,如果只是把SD卡当成FLASH ROM来用的话

     就没有逻辑地址的概念。

     文件系统中,逻辑地址是针对某一个分区的DBR(Dos Boot Record)来说的,如果DBR在100扇区,那么

     物理扇区在150扇区,逻辑扇区地址是50.如果格式化过后,逻辑扇区和物理扇区一致,也就是DBR在0扇区,则在WINHEX中

     不显示物理扇区

    

 

  笔记:多级目录结构。FAT 32下面主要结构:引导区,文件系统区,数据区

  在FAT32下面,根目录也归于数据区(DATA)

  创建了一个子目录过后,在7552扇区看到了子目录扇区,在7528扇区(根目录区)看到了一级文件名字,后面详细研究

 

 

  FAT32的另一项重大改革是根目录的文件化,即将根目录等同于普通的文件,可以分布在数据区的任何地方,FAT16中根目录区是

  硬性固定的,紧跟在FAT表后面,不属于数据区。

  这样根目录便没有了FAT16中512个目录项的限制,不够用的时候增加簇链,分配空簇即可。

  而且,根目录的位置也不再硬性地固定了,可以存储在分区内可寻址的任意簇内,不过通常

  根目录是最早建立的(格式化就生成了)目录表。所以,我们看到的情况基本上都是根目录首簇占簇区顺序上的第1个簇。

  FAT32对簇的编号依然同FAT16。顺序上第1个簇仍然编号为第2簇,通常为根目录所用(这和FAT16是不同的,FAT16的根

  目录并不占簇区空间,32个扇区的根目录以后才是簇区第1个簇)

  key:1,顺序上的首簇编号为第二簇,所以找到了数据区即为第二簇

            2,数据区,跟在FAT表的后面,既可以找到数据区的开始了

            3,一般数据区的开始都是根目录区,所以通常也是找到根目录区,就找到了想要的位置。

           

           

能够直接获取的信息:

MBR:BPB所在的位置(所谓的逻辑偏移位置)

BPB:影藏扇区数量 FAT表个数 每一个FAT表占据的扇区数目

就这些数据就足以确定数据区的物理位置了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  buffer 存储 dos flash cmd up