【asp精品源码栏目提醒】:本文主要为网学会员提供“FAT12文件系统基本格式 - 基础科学”,希望对需要FAT12文件系统基本格式 - 基础科学网友有所帮助,学习一下!
一、基本数据分布-------------------- 2879扇区 数据区(长度不固定) --------------------------- 根目录区(长度不固定,需计算) 19 扇区--------------------------- 18扇区 FAT2 10扇区--------------------------- 9 扇区 FAT1 1扇区--------------------------- 引导扇区 -------------------- 0扇区可以看出,FAT1和FAT2紧紧接着引导扇区,每个FAT占9扇区,根目录又紧随其后,从第19扇区开始,但根目录区的大小则不固定,依赖于Directory Entry的数目,最多有BPB_RootEntCnt个。
每个Directory Entry占32字节,其结构如下: 名称 开始字节 长度 内容 DIR_Name 0 0xB 文件名8 字节,扩展名3 字节 DIR_Attr 0xB 1 文件属性 保留位 0xC 10 保留 DIR_WrtTime 0x16 2 最后一次写入的时间 DIR_WrtDate 0x18 2 最后一次写入的日期 DIR_FstClus 0x1A 2 此文件在数据区和FAT表中的开始簇号 DIR_FileSize 0x1C 4 文件大小DIR_FstClus:对应了文件的第一个簇号,但需要注意的是:数据区的开始簇号是2,不是0和1,为此,FAT中的前两个FAT项(0项和1项)不被使用,从第2个FAT项开始有效。
每个FAT项(FATEntry)长度位12Bit,即一个半字节,FAT表中每3个字节存放了2个FATEntry。
3 Bytes: 字节3 FATEntry2 字节2 gt gt FATEntry1 FATEntry2 字节1 FATEntry1 FATEntry代表文件的下一个簇号,但如果其值大于等于0xFF8,则表示当前簇是文件的最后一个簇;如果是0xFF7,则表示这是一个坏簇。
上面已经提到,FAT中第一个有效的FATEntry是2号,对应了数据区的开始簇号。
------------------------------可以这样理解:FATEntry就是数据区对应簇的next字段,它使一个文件以链表结构存放在数据区各个不连续的簇中,而把“索引”放在FAT中。
主要介绍以3.5英寸的1.44M标准格式化的FAT12文件系统的软盘为介绍对象。
这里强调那么多是因为:1.44M的软盘格式化可以不是1.44M,可以大于也可以小于;格式化的文件系统也可以不是FAT12。
为什么会出现正常的1.44M软盘格式化后可大可小的情况呢?从软盘及软盘驱动器原理出发,软盘的寻址方式(可以认为是读取数据的方式)是:CHS,C Cylinder(柱面)H Header(磁头)S Sector(扇区)。
标准地格式化后,磁盘将被格式化为 每面80磁道(80个同心圆,柱面),每个磁道有18个扇区,每个扇区是 512字节,那么高密3.5英寸软盘的容量为:2×80×18×512 = 1474560 Byte 1440 KB 1.44 MB。
然而,软盘可以不格式为80磁道,每个磁道也可以不是18扇区,这是题外话,如果您有兴趣,可以用古老的HDCopy试试。
文件存储到磁盘上时至少要占用1个扇区,即使这个文件只有1个字节,如果文件有513字节,那就得占用2个扇区,下一个文件就不能用这只使用了一个字节的扇区。
即软盘以扇区为单位存储文件。
现在用下面的假设来说明本文的目的:假设只有18个扇区的磁盘,以 0 - 17 编址,如果一个文件保存在 1 - 6扇区,另一文件保存在 7 - 16扇区,如果我们对第一个文件增加了内容,又需要一个扇区来保存它,但由于文件连续存储, 7号扇区是第二个文件的,我们当然不能用它,只有最后留有一个扇区可用,我们会不会把第二个文件先挪到8-17扇区以腾出一个扇区来给第一个文件使用呢?当只有少数两个文件的时候可以,但有很多文件的时候会变得麻烦起来。
如果我们用一个表来表示有一个文件占用了 1-6扇区 和 17扇区,那事情就简单了——我们不必为文件不连续而烦恼。
这个表就叫它:文件分配表File Allocation Table。
那怎样才能知道这个文件存储的文件名和文件存放的起始扇区?再建一个表,用于存放文件名、起始扇区、文件创建时间、文件实际大小等等资料,这个表叫:文件目录表File Directory Table。
将这两个表放在磁盘指定的位置,以便操作系统使用,磁盘的其它扇区全都用来存放文件的实际内容,这就构成了有文件系统的磁盘。
磁盘上,0面0磁道第1扇区用于存放引导程序,如果这512字节最后两个字节分别是0x550xAA(一个字是0xAA55,称为可引导标志,BIOS会将这512字节读取出来执行,操作系统便是利用这里来实现引导的。
标识软盘是不是FAT12并不是没有根据的,在这512字节中,还有一个设备头用于标识这个软盘(设备),例子如下: 程序执行的第一条指令必须是跳转(如果你想使用FAT12这类文件系统的磁盘) 必须占用3字节jmp SHORT main 2 bits,跳转到主程序执行nop 1 bit FAT12 文件系统头,从NYAOS 借过来的,可以参考相关的文档以获得更多细节 这个块会让 Winimage 认出编译后的二进制文件为有效的引导文件 如果不使用这个块,Winimage将不会将其作为引导程序处理 但我们可以借助其它方法和工具处理,比如DEBUGbsOEM db quotExOS0.02quot OEM String任意你喜欢的8字节ASCII码bsSectSize dw 512 Bytes per sectorbsClustSize db 1 Sectors per clusterbsRessect dw 1 of reserved sectorsbsFatCnt db 2 of fat copiesbsRootSize dw 224 size of root directorybsTotalSect dw 2880 total of sectors if lt 32 megbsMedia db 0xF0 Media DescriptorbsFatSize dw 9 Size of each FATbsTrackSect dw 18 Sectors per trackbsHeadCnt dw 2 number of read-write headsbsHidenSect dd 0 number of hidden sectorsbsHugeSect dd 0 if bsTotalSect is 0 this value is the number of sectorsbsBootDrv db 0 holds drive that the bs came frombsReserv db 0 not used for anythingbsBootSign db 29h boot signature 29hbsVolID dd 0 Disk volume ID also used for temp sector / sectors to loadbsVoLabel db quotNO NAME quot Volume LabelbsFSType db quotFAT12 quot File System type lt- FAT 12文件系统 Main start heremain:至于如何引导计算机,可以参考我Blog里的more.aspnamexemeanampid20面0道第2扇区到第10扇区的9个扇区是FAT表的存放位置,为了预防,0面0道的第11扇区到1面0道第1扇区的9个扇区是第2个FAT表的存放位置,这第2个FAT是备用的,当第一个FAT出了问题里,可以用第2个FAT。
1面0道的第2扇区起到1面0道的第15扇区(共14个扇区)用于存放 FDT。
FDT没有备份,所以没有第二个FDT。
这里要注意的是,磁盘为了读写的速度,0面0道的18个扇区接下来的是 1面0道的扇区,而不是0面1道,因为0面0道跟1面0道同在一个柱面上(同心圆),只是用的磁头不同。
FAT12 中,每个文件分配表项只占12位bit,即1.5字节byte,每个表项代表一个扇区,在这里,磁盘只有扇区的概念,磁盘里所有扇区都被类似于上一段提到的磁盘读写方式线性地编址(LBA),不再有CHS。
这里还要提一提簇的概念:DOS会把2个扇区作为一簇,那么文件就要以簇为单位读写。
簇的大小通常根据磁盘的大小设定,以尽可能少浪费磁盘空间为本。
FAT12每个表项的值指出文件存放的下一个扇区号,同时也是表项入口。
比如如果文件的存放的第一个扇区是002,那系统首先找FAT的
上一篇:
入门第1讲
下一篇:
气相色谱法测定蔬菜中有机磷农药的残留量