USB通信程序设计 第7页
此扇区有时也称作“引导扇区”、“保留扇区”或是“零扇区”,因为它含有对文件系统进行识别的关键信息,因此十分重要。下表是此扇区的结构:
表3.2 引导扇区结构(一)
表3.3 引导扇区结构(二)
表3.4 引导扇区结构(三)
3.4.1.2 FAT 区
FAT即File Allocation Table,文件分配表。操作系统分配磁盘空间按簇来分配的。因此,文件占用磁盘空间时,基本单位不是字节而是簇,即使某个文件只有一个字节,操作系统也会给他分配一个最小单元——即一个簇。为了可以将磁盘空间有序地分配给相应的文件,而读取文件的时候又可以从相应的地址读出文件,我们把整个磁盘空间分成32K字节长的簇来管理,每个簇在FAT表中占据着一个16位的位置,称为一个表项。对于大文件,需要分配多个簇。同一个文件的数据并不一定完整地存放在磁盘的一个连续的区域内,而往往会分成若干段,像一条链子一样存放。这种存储方式称为文件的链式存储。为了实现文件的链式存储,硬盘上必须准确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后继内容的下一个簇的簇号,对一个文件的最后一簇,则要指明本簇无后继簇。这些都是由FAT表来保存的,FAT表的对应表项中记录着它所代表的簇的有关信息:诸如是否空,是否是坏簇,是否已经是某个文件的尾簇等。FAT区的结构如下:
表3.5 FAT区结构
FAT的项数与硬盘上的总簇数相关(因为每一个项要代表一个簇,簇越多当然需要的FAT表项越多),每一项占用的字节数也与总簇数有关(因为其中需要存放簇号,簇号越大当然每项占用的字节数就大)。FAT的格式有多种,最为常见是FAT16和FAT32,其中FAT16是指文件分配表使用16位,由于16位分配表最多能管理65536(即2的16次方)个簇,又由于每个簇的存储空间最大只有32KB,所以在使用FAT16管理硬盘时,每个分区的最大存储容量只有(65536×32 KB)即2048MB,也就是我们常说的2G。现在的硬盘容量是越来越大,由于FAT16对硬盘分区的容量限制,所以当硬盘容量超过2G之后,用户只能将硬盘划分成多个2G的分区后才能正常使用。由于FAT对于文件管理的重要性,所以FAT有一个备份,即在原FAT的后面再建一个同样的FAT。
3.4.1.3 根目录区(Root Directory Region)
紧接着第二个FAT表的后面一个扇区,就是根目录区了。根目录区中存放目录项,每个目录项为32个字节,记录一个文件或目录的信息(长文件名例外)。以下是目录项的结构:
表3.6 目录项结构
目录项所占的扇区数与有多少个目录项有关,它将占用(目录项*32/512)个扇区。
3.4.1.4 文件和目录数据区
目录项的所占的最后一个扇区之后,便是真正存放文件数据或是目录的位置了。
3.4.2 Flash盘的FAT结构
Flash硬盘与普通的磁头、柱面式介质不一样。在开发U盘的过程中,使用Flash作为存储介质。它有其特定的结构特点。以32M的三星K9F5608U0A-YCB0 Flash为例,它有2048个Block,每个Block 有32个Page,每个Page有512+16=528个字节。
图3.15 Flash 的结构
Flash的读写有其自身特点:
1. 必须以Page为单位进行读写;
2. 写之前必须先擦除原有内容;
3. 擦除操作必须对Block进行,即一次至少擦除一个Block的内容。
针对这种情况,将Flash的一个Page定为1个扇区,将其2个Block,64个扇区定为一个簇,这样,簇的容量刚好为512*64=32K,满足FAT16对簇大小的要求。FAT分配空间的时候,是按簇来分配的,但是其给出的地址却是LBA(Logical BlockAddress),即它只给出一个扇区号,比如对此Flash而言,若给出LBA为0x40,实代表簇1的扇区1。因此需要将Logical Block Address转换为物理地址,这样,才可以对数据进行存取操作。根据上面定义的结构,转换公式为:
Flash 的Block = Logical Block Address/0x20 (1)
Flash 的Page = Logical Block Address %0x20 (2)
实际上,如果定义每个簇为32 个扇区是最好的,因为这样物理结构和逻辑结构刚好一致。但是这也无防,因为不管Logical Block Address给出什么值,只要按上述公式,总可以得到物理上正确的Block 和Page,再使用Flash的读写命令读取对应的Block和Page就可以了,