想做文件系统的移植好久了,一直没有时间,现在决定把他弄通弄会,一天天的纪录下来吧,
移植的平台是STR710,在小存储器NandFlash(K9F2808UOC)上的移植,先学学文件系统的基础,先了解一下何为文件系统。
硬盘上的数据按照其不同特点大致可分为5个部分:MBR区、DBR区、FAT区、DIR区和DATA区,来分别学习一下:
一、MBR区
MBR区(Main Boot Record),按照字面上的理解即为主引导区,位于整个硬盘的0磁道0柱面1扇区。不过,在总共512字节的主引导扇区中,MBR只占用了其中的446个字节(便宜0---偏移1BDH),另外的64个字节(偏移1BEH--偏移1FD)交给了DPT(Disk Partition Table硬盘分区表),最后两个字节“55,AA”(偏移1FEH-偏移1FFH)是分区的结束标志,这整个结构构成了硬盘的主引导区。
主引导纪录中包含了硬盘的一系列参数和一段引导程序。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后引导具有激活标志的分区上的操作系统,并将控制权交给启动程序。MBR是由分区程序(如Fdisk.com)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而实现多系统共存。
图1 SD卡的0扇区(图片来源于振南的znFAT)
其中DPT数据示例如下:80 01 01 00 0B 1F FF D8 3F 00 00 00 A1 4C 1E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA
这64个字节其实是4条纪录,每条纪录是16字节,用来纪录存储器上的分区信息。可取出一个纪录来进行分析:
80: 表明这是一个有效的分区,如果这里是00,则说明此分区无效。
01:开始磁头
01 00:开始扇区与开始柱面
0B:系统ID(0B:FAT32 、04:FAT16、07:NTFS)
1F:结束磁头
FF D8:结束扇区与结束柱面
3F 00 00 00:分区的开始扇区
A1 4C 1E 00:总扇区数
对于MBR可分为四个部分:MBR引导程序、4个分区纪录、0x55、0xAA。
二、DBR区
DBR(Dos Boot Record)是操作系统引导记录区的意思,它通常位于硬盘的0磁道1柱面1扇区,是操作系统可以直接访问的第一个扇区,它包括一个引导程序和一个被称为BPB(Bios Parameter Block) 的本分区参数纪录表。引导程序的主要任务是当MBR将系统控制权交给它时,判断本分区跟目录前两个文件是不是操作系统的引导文件(Dos为例,即是IO.sys和Msdos.sys)。如果确定存在,就把其读入内存,并把控制权交给该文件。BPB参数块记录着本分区的起始扇区,结束扇区、文件存储格式、硬盘介质描述符、根目录大小、FAT个数,分配单元的大小等重要参数。
举例分析:
图2:SD卡的DBR扇区(来源于振南的znFAT)
上面就是SD卡的DBR扇区数据,其中蓝色标记的部分就是BPB(79字节)。很多重要的数据都记录在这里面了,到底是什么参数,他们都占用了哪些字节,我们再来看一张图,DBR扇区示意图。
可以看到,BPB中的参数比DPT中要复杂得多,这是因为绝大部分的全局重要参数都在这里,所以BPB是极为重要的,对于BPB的解析是否正确,直接关系到FAT文件系统成功与否。
依照图中标注可分析参数:
00 02:每扇区的字节数(0x0200 = 512)
08:每簇扇区数(0x08 = 8)
20 00:保留扇区数(0x0020 = 32)
02:FAT表数(0x02)
00 00:FAT32固定为0
00 00:FAT32固定为0
F8:存储介质类型
00 00:FAT32固定为0
3F 00:磁道扇区数
00 FF:磁头数
3F 00 00 00:FAT 区前隐扇区数(0x0000003F = 63)
A1 4C 1E 00:总扇区数(0x001E4CA1 = 1985697)
90 07 00 00:FAT表所占扇区数(0x00000790 = 1936)
00 00:FAT32特有
00 00:FAT32特有
02 00 00 00:第一个目录的簇号(0x00000002 = 2)
01 00:FSINFO 扇区数
06 00:通常为6
12个00:用于扩展
00:驱动器号
00:保留
29:扩展引导标签
7A 16 0E 90:分区序号
4E 4F 20 4E 41 4D 45 20 20 20 20:卷标
46 41 54 33 32 20 20 20 :系统ID
上面的参数也不是每一个我们都会用到,我们将需要的提取出来
00 02:每扇区的字节数(0x0200 = 512)
08:没簇扇区数(0x08 = 8)
20 00:保留扇区数(0x0020 = 32)
02:FAT表数(0x02 = 2)
90 07 00 00:FAT表所占扇区数(0x00000790 = 1936)
02 00 00 00:第一个目录的簇号(0x00000002 = 2)
DBR扇区到底在什么地方捏,在MBR中的DPT中有一个字段叫作“分区的开始扇区”,他就是所谓的DBR区了,该字段为3F 00 00 00,计算得到的值为63,及MBR在63扇区)。
三、FAT区
在DBR之后的是我们比较熟悉的FAT(File Allocation Table文件分配表)区。在解释文件分配表的概念前,先来看看簇(cluster)的概念。文件占用磁盘空间时,基本单位不是字节而是簇。簇的大小与磁盘的规格有关,一般情况下,软盘每簇是1个扇区,硬盘每簇的扇区数与硬盘的总容量大小有关,可能是4、8、16、32、64......
我们知道,同一个文件的数据并不一定完整地放在磁盘的一个连续的区域内,而往往会分为若干段,像一条链子一样存放。这种存储方式称为文件的链式存储。硬盘上的文件常常要进行创建、删除、增长、缩短等操作。这样子操作越多,盘上的文件就可能被分得越零碎(每段至少是1簇)。但是由于硬盘上保存着段与段之间的连接信息(即FAT),操作系统在读取文件时,总是能够准确地找到各段的位置并正确读出,不过,这种以簇为单位的存储法也是有其缺陷的,这主要表现在对空间的利用上。每个文件的最后一簇都有可能未被完全利用的空间·····(未完待续)