【0】写在前面
0.0) text description from orange’s implemention of a os ,文末总结系个人臆测出的干货
【1】intro to FAT12(file allocation table 12)文件系统格式(from Baidu Baike)
- (1)FAT12定义: FAT12是DOS时代就开始使用的文件系统(File System),直到2009年仍然在软盘上使用。
- (2)FAT12的主磁盘结构:
- 2.1)引导扇区(Boot Sector):位于第一个扇区,在软盘上就是0柱面(磁道)0磁头1扇区。
- 2.2)文件分配表(FAT):紧接着引导扇区的是两个完全相同的FAT表,每个FAT表占用9个(FAT2是FAT1 的 copy)
- 2.3)根目录区: FAT表之后是根目录区,根目录区长度不固定
- 2.4)数据区:根目录后面就是数据区
【2.1】FAT12的引导扇区格式:
名称 开始字节 长度 内容 参考值
BS_jmpBOOT 0 3 一个短跳转指令 jmp Label_07c00H
nop
BS_OEMName 3 8 厂商名 'QingFeng'
BPB_BytesPerSec 11 2 每扇区字节数(Bytes/Sector) 0x200
BPB_SecPerClus 13 1 每簇扇区数(Sector/Cluster) 0x1
BPB_ResvdSecCnt 14 2 Boot记录占用多少扇区 ox1
BPB_NumFATs 16 1 共有多少FAT表 0x2
BPB_RootEntCnt 17 2 根目录区文件最大数 0xE0
BPB_TotSec16 19 2 扇区总数 0xB40[2*80*18]
BPB_Media 21 1 介质描述符 0xF0
BPB_FATSz16 22 2 每个FAT表所占扇区数 0x9
BPB_SecPerTrk 24 2 每磁道扇区数(Sector/track) 0x12
BPB_NumHeads 26 2 磁头数(面数) 0x2
BPB_HiddSec 28 4 隐藏扇区数 0
BPB_TotSec32 32 4 如果BPB_TotSec16=0,则由这里给出扇区数 0
BS_DrvNum 36 1 INT 13H的驱动器号 0
BS_Reserved1 37 1 保留,未使用 0
BS_BootSig 38 1 扩展引导标记(29h) 0x29
BS_VolID 39 4 卷序列号 0
BS_VolLab 43 11 卷标 'QingFeng'
BS_FileSysType 54 8 文件系统类型 'FAT12'
引导代码及其他内容 62 448 引导代码及其他数据 引导代码(剩余空间用0填充)
结束标志0xAA55 510 2 第510字节为0x55,第511字节为0xAA 0xAA55
【2.2】文件分配表-FAT
- a)FAT的作用:当文件size 大于 512B,则FAT是找出该文件所占用的簇(簇:一个或多个扇区,引导扇区的BPB_SecPerClus记录该数字)
- b)FAT项:每个项占用12 位,代表一个簇,第0和1个簇不使用,从第2个FAT项 开始表示数据区的每一个簇,即是第2个FAT项表示数据区第一个簇。数据区的第一个簇号是2,和这里是呼应的 。(注意: FAT项值代表的是文件的下一个簇号)
看个荔枝(只看16个字节):(干货)
如FAT所在扇区(一个扇区512字节)存储值为:F0 FF FF FF 8F 00 FF FF FF FF FF FF 09 A0 00 FF , 0F 00 00 ; 则簇号分别为:0-FF0 1-FFF 2-FFF 3-008 4-FFF 5-FFF 6-FFF 7-FFF 8-009 9-00A A-FFF
如果根目录去中有条目记载某文件A 的 DIR_FstClus=3的话,则对应第3个FAT项,结合上一行,我们知道FAT3==008,所以下一个簇号是8-009 , 以此类推9-00A、 A-FFF。FFF就表示这个簇是最后一个簇了。
【2.3】根目录区-root dir sector
- a)根目录区中的每一个条目占用32字节,每个条目格式如下:
- b)根目录区的大小依赖于 BPB_RootEntCnt(引导扇区中的BPB_RootEntCnt,根目录区文件最大数==根目录条目数),所以长度不固定;
如何计算根目录区的扇区数量?
显然,BPB_RootEntCnt 和 BPB_BytePerSec 都是由软盘(文件系统FAT12所在的分区)的引导扇区提供的;
所以,我们可以算出该软盘的根目录扇区数量。
【2.4】数据区
- a)数据区的第一个簇的簇号是2,而不是0 or 1;
【3】下面,我们讲一下,如何从文件系统中读取一个文件的内容(读取某文件的步骤)(纯属个人臆测,干货):
- a)应用程序给出文件名;
- b)通过该分区(文件系统)的引导扇区算出 根目录目录 所占扇区大小 和 数据区的起始扇区;
- c)依据app 给出的文件名 和 根目录项的DIR_Name 定位该文件名对应的根目录项(根目录条目);
- d)该条目记录了 对应文件的起始簇号,并将 该簇号 送到 FAT1 以找出该文件的占用的所有簇号;(FAT2 是 FAT1 的copy)
- e)拿到该文件的所有簇号后,依据步骤a)算出的数据区起始扇区,从数据区中 取出 这些簇号里的内容,至此,取出该文件的内容;
版权声明:本文为博主原创文章,未经博主允许不得转载。