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表占据的扇区数目
就这些数据就足以确定数据区的物理位置了。
相关文章推荐
- ZYNQ系统中实现FAT32文件系统的SD卡读写之三 SDK编程调试
- 软件安全学习笔记(5):FAT32文件系统与数据恢复
- SD卡中的FAT32文件系统(二)
- 尝试调试Fastfat(Fat32)文件系统
- SD卡FAT16文件系统的学习笔记
- HowTo:调试Fastfat(Fat32)文件系统
- SD卡FAT32文件系统,如何访问具体文件
- 用WinHex查看SD卡FAT32文件系统结构
- 基于ATmega32的SD卡上FAT32文件系统数据读取
- FAT32文件系统中使用VS2005调试C++项目出现MSVCP80D.dll错误
- 挂载镜像SD卡的FAT32文件系统分区到Linux中
- [RK3399][Android7.1] 调试笔记 --- 系统使用的分区文件
- 基于STM32的SD卡FATFS文件系统学习笔记
- RT-Thread 学习笔记(九)---开启基于SD卡中的 Elm FatFS 文件系统
- sd卡与FAT32文件系统
- SD卡中的FAT32文件系统(一)
- ZYNQ系统中实现FAT32文件系统的SD卡读写 之一 硬件介绍
- ZYNQ系统中实现FAT32文件系统的SD卡读写之四 经验总结
- SD卡FAT16文件系统的学习笔记
- ZYNQ系统中实现FAT32文件系统的SD卡读写 之二 VIVADO配置