最近在调试eCos STM32 SD卡驱动。目前情况是,驱动可以正常读取SD卡中block数据,但应用程序中mount时却提示失败。发现是对SD卡block0中数据处理有些问题,而且驱动中还涉及到CHS格式与LBA格式的转换,弄得我是一头雾水。
于是,老老实实地静下心来研究SD卡中的数据结构、CHS(cylinder、head、sector,即柱面、磁头、扇区)和LDA的概念及其关系、FAT文件系统等知识。下面的内容是转载的(同时加以整理),写得超详细,剖析全面,图文并茂,尤其是其中的数据格式分析,令人印象深刻,不得不佩服作者的写作水平。
注:以下内容整理并转自:http://blog.csdn.net/mjx91282041/article/details/8904705
说明:
- MBR :Master Boot Record ( 主引导记录)
- DBR :DOS Boot Record ( 引导扇区)
- FAT :File Allocation Table ( 文件分配表)
- 硬件:本文SD卡为Kingston 4GB,FAT32格式,簇大小4KB,每扇区512字节。
第一章 硬盘结构与SD卡结构
1.1 硬盘介绍
1.1硬盘结构
如果你熟悉硬盘结构跳过本节。下图是硬盘的结构,如果你只是为了学习SD卡FAT32文件系统的话,这里你只需要注意硬盘排序结构:主引导记录(MBR)—引导扇区—数据—引导扇区—数据。
1.2 MBR分析
MBR(Main Boot Record 主引导记录区)放置在硬盘物理地址0的地方。总共512字节的主引导扇区中,MBR只占用了其中的446个字节,另外64个字节交给了 DPT(Disk Partition Table硬盘分区表),最后两个字节“55,AA”是分区的结束标志。DPT由4个分区表组成,每个16字节。下图中以以硬盘的MBR图,粉红色为硬盘分区表。
对于我们来说,更关注硬盘分区表表中红色区域:下图为硬盘分区表详细说明
起始地址 | 字节数 | 描述 |
0x1BE | 1 | 可引导标志,0x00不可引导,0x80可引导 |
0x1BF~0x1C1 | 3 | 分区起始CHS地址(CHS=磁头、柱面、扇区),起始地址 |
0x1C2 | 1 | 分区类型 |
0x1C3~0x1C5 | 3 | 分区结束CHS地址 |
0x1C6 | 4 | 从磁盘开始到该分区开始的偏移量(分区起始LBA地址Little-endian顺序) |
0x1CA | 4 | 总扇区数(Little-endian顺序) |
SD结构
SD卡没有分区,默认就是一个分区。首先用WinHex文件打开SD所在的盘符,显示如下图:
① 非分区空间(红线所示): 起始扇区0,我认为这个分区就是硬盘上的MBR所在区域,
打开后如下图所示,也可以称为SD卡的MBR区域。
根据表1知道:
红线区域(00002000)为下个分区的扇区地址,即第8192扇区,见图3分区1的起始扇区。
蓝线区域(00760C00)为SD卡总的扇区个数,我们可以计算一下:
0x760C00 *512(每扇区字节)= 3960995840 (字节),与实际大小基本一样。
② 分区1(蓝线所示):起始扇区8192.
③ 剩余扇区 : 才疏学浅,我不知道干嘛的,呵呵
1.3 SD卡存储结构
由此可知SD卡文件系统并不是处在整个SD卡最开始的地方,它处在MBR所处的保留区之后,于是我们可以对使用FAT32文件系统的SD卡整体布局给出如下图示。
第二章是关于FAT32文件系统的介绍,由于篇幅过长,所以放到下一文章中!