首页 FAT文件系统

FAT文件系统

举报
开通vip

FAT文件系统标签: FAT 文件系统 FAT文件系统学习 MBR:Master Boot Record (主引导记录) DBR:DOS Boot Record (DOS引导记录,位于分区引导扇区) DPT:Disk Partition Table (磁盘分区表) BPB:BIOS Parameter Block (BIOS参数块) FAT:File Allocation Table (文件分配表) Sector:扇区 Cluster:簇 一、 硬盘组织结构 下面是一个包含4个分区的硬盘...

FAT文件系统
标签: FAT 文件系统 FAT文件系统学习 MBR:Master Boot Record (主引导 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 ) DBR:DOS Boot Record (DOS引导记录,位于分区引导扇区) DPT:Disk Partition Table (磁盘分区表) BPB:BIOS Parameter Block (BIOS参数块) FAT:File Allocation Table (文件分配表) Sector:扇区 Cluster:簇 一、 硬盘组织结构 下面是一个包含4个分区的硬盘结构示意图,其中分为3个基本分区和一个扩展分区。 二、FAT文件系统结构 FAT文件系统是由按照如下顺序排列的几个部分组成的:  0 – Reserved Region  1 – FAT Region  2 – Root Directory Region (FAT32没有这部分)  3 – File and Directory Data Region FAT系统的数据存储采用小端(Little Endian)方式,注意到这一点很重要,在使用大端(Big Endian)的系统中,读取多字节数据的时候必须要经过转换,否则,读取到的数据是不正确的。 三、主引导扇区 硬盘主引导扇区 =硬盘主引导记录(MBR)+ 硬盘分区表(DPT) MBR:扇区内偏移地址0 ~ 0x1BD DPT:扇区内偏移地址0x1BE ~ 0x1FD,其中又分为4个分区表: 第一个分区表:0x1BE ~ 0x1CD 第二个分区表:0x1CE ~ 0x1DD 第三个分区表:0x1DE ~ 0x1ED 第四个分区表:0x1EE ~ 0x1FD 每个分区表的信息如下表所示: 主引导扇区 上面是从一张SD卡读到的主引导扇区信息。可以看出,MBR区域数据全部为0,这张SD卡只有一个分区,这个分区前的扇区数为0x0000003F,所以这个分区的开始位置就是扇区0x0000003F,总扇区数为0x000F1EC1(990913个扇区)。 四、分区引导扇区DBR 也常常称为启动扇区DBR(Dos Boot Recorder),Microsoft称它为0扇区(0th sector),通过前面的介绍我们知道,称它为0扇区其实是不正确的,这样容易让人误解它为磁盘的最前面一个扇区,称它为0扇区只是表明它是FAT中扇区的参考点而已。MBR将CPU寻址地址转移给DBR,因此DBR的前3个字节必须是合法的可执行的X86的跳转指令,负责跳过接下来的几个不可执行的字节BPB和扩展BPB。 图2:DBR 该扇区中包含有我们关注的一个重要数据结构BPB(BIOS Parameter Block)。以下表格内容翻译自Microsoft的《Microsoft Extensible Firmware Initiative FAT32 File System Specification—version1.03》,其中包含BPB各项的描述。 NOTE:在以下的叙述中,名字以BPB_开头的属于BPB部分,以BS开头的属于启动扇区(Boot Sector)部分,实际上并不属于BPB。 offset(byte) 长度(byte) 描述 BS_jmpBoot 0x00 3 跳转指令,指向启动代码 BS_OEMName 0x03 8 建议值为“MSWIN4.1”。有些厂商的FAT驱动可能会检测此项,所以设为“MSWIN4.1”可以尽量避免兼容性的问题 BPB_BytsPerSec 0x0b 2 每扇区的字节数,取值只能是以下几种:512,1024,2048或是4096。设为512会取得最好的兼容性,目前有很多FAT代码都是硬性规定每扇区的字节数为512,而不是实际的检测此值。但微软的操作系统能够很好支持1024,2048或是4096 BPB_SecPerClus 0x0d 1 每簇的扇区数,其值必须是2的整数次方(该整数必须>=0),同时还要保证每簇的字节数不能超过32K,也就是1024*32字节 BPB_RsvdSecCnt 0x0e 2 保留扇区的数目,此域不能为0,FAT12/FAT16必须为1,FAT32的典型值取为32,,微软的系统支持任何非0值 BPB_NumFATs 0x10 1 分区中FAT表的份数,,任何FAT格式都建议为2 BPB_RootEntCnt 0x11 2 对于FAT12和FAT16此域表示根目录中最多可容纳的目录的个数(每项长度为32bytes),对于FAT32,此项必须为0。对于FAT12和FAT16,此数乘以32必为BPB_BytesPerSec的偶数倍,为了达到更好的兼容性,FAT12和FAT16都应该取值为512 BPB_ToSec16 0x13 2 早期版本中16bit的总扇区,这里总扇区数包括FAT卷上四个基本分区的全部扇区,此域可以为0,若此域为0,那么BPB_ToSec32必须为0,对于FAT32,此域必为0。对于FAT12/FAT16,此域填写总扇区数,如果该值小于0x10000的话,BPB_ToSec32必须为0 BPB_Media 0x15 1 对于“固定”(不可移动)存储介质而言,0xF8是标准值,对于可移动存储介质,经常使用的数值是0xF0,此域合法的取值可以取0xF0,0xF8,0xF9,0xFA,0xFC,0xFD,0xFE,0xFF。另外要提醒的是,无论此域写入什么数值,同时也必须在FAT[0]的低字节写入相同的值,这是因为早期的MSDOS 1.x使用该字节来判定是何种存储介质 BPB_FATSz16 0x16 2 FAT12/FAT16一个FAT表所占的扇区数,对于FAT32来说此域必须为0,在BPB_FATZ32中有指定FAT表的大小 BPB_SecPerTrk 0x18 2 每磁道的扇区数,用于BIOS中断0x13,此域只对于有“特殊形状”(由磁头和柱面每分割为若干磁道)的存储介质有效,同时必须可以调用BIOS的0x13中断得到此数值 BPB_NumHeads 0x1A 2 磁头数,用于BIOS的0x13中断,类似于上面的BPB_ SecPerTrk,只对特殊的介质才有效,此域包含一个至少为1的数值,比如1,4M的软盘此域为2 BPB_HidSec 0x1C 4 在此FAT分区之前所隐藏的扇区数,必须使得调用BIOS的0x13中断可以得到此数值,对于那些没有分区的存储介质,此域必须为0,具体使用什么值由操作系统决定 BPB_ToSec32 0x20 4 该卷总扇区数(32bit),这里的扇区总数包括FAT卷四个基本分的全部扇区,此域可以为0,若此域为0,BPB_ToSec16必须为非0,对FAT32,此域必须是非0。对于FAT12/FAT16如果总扇区数大于或等于0x10000的话,此域就是扇区总数,同时BPB_ToSec16的值为0。 FAT32的BPB的内容和FAT12/16的内容在地址0x36以前是完全一样的,从偏移量0x36开始,他们的内容有所区别,具体的内容要看FAT类型为FAT12/16还是FAT32,这点保证了在启动扇区中包含一个完整的FAT12/16或FAT32的BPB的内容,这么做是为了达到最好的兼容性,同时也为了保证所有的FAT文件系统驱动程序能正确的识别和驱动不同的FAT格式,并让他们良好地工作,因为他们包含了现有的全部内容 从offset 36开始FAT12/FAT16的内容开始区别于FAT32,下面分两个表格列出,下表为FAT12/FAT16的内容 名称 offset(byte) 长度(byte) 描述 BS_drvNum 0x24 1 用于BIOS中断0x13得到磁盘驱动器参数,(0x00为软盘,0x80为硬盘)。此域实际上由操作系统决定 BS_Reseved1 0x25 1 保留(供NT使用),格式化FAT卷时必须设为0 BS_VolID 0x26 1 扩展引导标记(0x29)用于指明此后的3个域可用 BS_BootSig 0x27 4 卷标序列号,此域以BS_VolLab一起可以用来检测磁盘是否正确,FAT文件系统可以用此判断连接的可移动磁盘是否正确,引域往往是由时间和日期组成的一个32位的值 BS_VolLab 0x2B 11 磁盘卷标,此域必须与根目录中11字节长的卷标一致。 FAT文件系统必须保证在根目录的卷标文件列改或是创建的同时,此域的内容能得到时的更新,当FAT卷没有卷标时,此域的内容为“NO NAME” BS_FilSysType 0x36 8 以下的几种之一:“FAT12”,“FAT16”,“FAT32” 不少人错误的认为FAT文件系统的类型由此域来确认,他细点你就能发现此域并不是BPB的一部分,只是一个字符串而已,微软的操作系统并不使用此此域来确定FAT文件的类型,;因为它常常被写错或是根本就不存在。 下表为FAT32的内容 名称 offset(byte) 长度(byte) 描述 BPB_FATSz32 0x24 4 一个FAT表所占的扇区数,此域为FAT32特有,同时BPB_FATSz16必须为0 BPB_Flags 0x28 2 此域FAT32特有。 Bits0-3:不小于0的活动FAT(active FAT)数目,只有在镜像(mirrorig)禁止时才有效。 Bits 4-6:保留 Bits 7: 0表示FAT实时镜像到所有的FAT表中 1表示只有一个活动的FAT表。这个表就是Bits0-3所指定的那个 Bits8-15: 保留 BPB_FSVer 0x2A 2 此域为FAT32特有, 高位为FAT32的主版本号,低位为次版本号,这个版本号是为了以后更高级的FAT版本考虑,假设当前的操作系统只能支持的FAT32版本号为0.0。那么该操作系统检测到此域不为0时,它便会忽略FAT卷,因为它的版本号比系统能支持的版式本要高 BPB_RootClus 0x2C 4 根目录所在第一个簇的簇号,通常该数值为2,但不是必须为2 磁盘工具在改变根目录位置时,必须想 办法 鲁班奖评选办法下载鲁班奖评选办法下载鲁班奖评选办法下载企业年金办法下载企业年金办法下载 让磁盘上第一个非坏簇作为根目录的第一个簇(比如第2簇,除非它已经被标记为坏簇),这样的话,如果此域正好为0的话磁盘检测工具也能轻松的找到根目录所在簇的位置 BPB_FSIfo 0x30 2 保留区中FAT32卷FSINFO结构所占的扇区数,通常为1 在Backup Boot中会有一个FSINFO的备份,但该备份只是更新其中的指针,也就是说无论是主引导记录还是备份引导记录都是指向同一个FSINFO结构 BPB_BkBootSec 0x32 2 备份引导扇区的位置,如果不为0,表示在保留区中引导记录的备数据所占的扇区数,通常为6。同时不建议使用6以外的其他数值 BPB_Reserved 0x34 12 用于以后FAT扩展使用,对FAT32。此域用0填充 BS_DrvNum 0x40 1 与FAT12/16的定义相同,只不过两者位于启动扇区不同的位置而已 BS_Reserved1 0x41 1 与FAT12/16的定义相同,只不过两者位于启动扇区不同的位置而已 BS_BootSig 0x42 1 与FAT12/16的定义相同,只不过两者位于启动扇区不同的位置而已 BS_VolID 0x43 4 与FAT12/16的定义相同,只不过两者位于启动扇区不同的位置而已 BS_FilSysType 0x47 11 与FAT12/16的定义相同,只不过两者位于启动扇区不同的位置而已 BS_FilSysType 0x52 8 通常设置为“FAT32”,请参照FAT12/16此部分的陈述。 关于FAT启动扇区还有一点重要的 说明 关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书 ,我们假设里面的内容是按字节排序的,那么扇区[510]的内容一定0x55,扇区[511]的内容一定是0xAA 很多FAT资数文档会把0xAA55说成是“启动扇区最后两字节的内容”,这样的说法是正确的,但仅仅适用于BPB_BytsPerSec值为512的情况。若BPB_BytsSec的值大于512,该标记的位置并没有改变,虽然在启动扇区的最后两个字节写0xAA55并没有问题。 五、FAT类型识别 FAT的类型(FAT12/16/32)只能通过FAT卷中的簇(Cluster)数来判定,没有其他的办法。 数据区Cluster总数的计算过程: 5.1,计算根目录占据的Sector扇区数: RootDirSectors = (BPB_RootEntCnt*32) /BPB_BytsPerSec //根目录项数*32/每扇区字节数 // RootDirSectors 根目录占据的Sector数 ,32是每个目录项所占的字节数 // BPB_RootEntCnt根目录项数,FAT32为0;BPB_BytsPerSec 每扇区字节数 //注意,FAT32没有根目录,根目录占据的扇区数为0。BPB_RootEntCnt=0, RootDirSectors=0 5.2,下面计算出数据区中的扇区数 if(BPB_FATSz16 !=0) FATSz = BPB_FATSz16; else FATSz = BPB_FATSz32; //一个FAT表所占的扇区数 if(BPB_TotSec16 !=0) TotSec = BPB_TotSec16; else TotSec = BPB_TotSec32; //该卷总扇区数(32bit) DataSec= TotSec-(BPB_RsvdSecCnt +(BPB_NumFATs * FATSz) + RootDirSectors) 5.3,下面计算数据区总簇数: CountofClusters = DataSec / BPB_SecPerClus // BPB_SecPerClus每簇的扇区数 5.4,判断FAT类型 if(CountofClusters < 4085) { /*卷类型是 FAT12 */ } else if(CountofClusters < 65525) { /*卷类型是FAT16 */ } else { /*卷类型是 FAT32 */ } 这里的簇数(count of Cluster)是指数据区所占簇的数量(the count of the data cluster),从簇2算起,而“最大可用簇数”(Maximun valid cluster number for the volume)是CountofClusters +1,“包括保留簇的簇数”(count of cluster including the two reserved cluster)则为CountofClusters +2。 数据区(Cluster 2)的起始Sector扇区:(保留扇区的数目 + FAT表所占扇区数 + 根目录占据的扇区数) FirstDataSector = BPB_RsvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors //BPB_RsvdSecCnt保留扇区的数目;BPB_NumFATs分区中FAT表份数2;FATSz=1个FAT表所占扇区数 给一个合法的簇号N,该簇的第一个扇区号由下式计算: FirstSectorofCluster =((N -2) * BPB_SecPerClust) + FirstDataSecot; 因为BPB_SecPerClus总是2的整数次方,这意味着BPB_SecPerSlus的乘法运算可以通过移位来进行。 NOTE:这里所说的Sector号,指的是针对卷中包BPB的第一个扇区(DBR)的偏移量(DBR设为Sector 0)。 六、FAT各部分位置的计算 DBR_Base:从DPT中偏移8Bytes的地址读取4Bytes数据就可以直接看作是DBR所在的Sector扇区。 RsvSectors = BPB_RsvdSecCnt。保留扇区的数目 FAT_Base = DBR_Base + RsvSectors FATSize = BPB_NumFATs * FATSz 其中,FATSz = (FAT32?) BPB_FATSz32 : BPB_FATSz16 Root_Base: 如果是FAT12/FAT16,则 Root_Base = FAT_Base + FATSize 如果是FAT32,则 Root_Base = BPB_RootClus RootSize:如果是FAT32,则没有限制;否则 RootSize = (BPB_RootEntCnt*32) / BPB_BytsPerSec Data_Base:仅对于FAT12/FAT16, Data_Base = Root_Base + RootSize 七、FAT表结构 FAT表(File Alloacation Table)是一一对应于数据簇号的列表。 对于FAT文件系统来讲,FAT表有两个重要的作用:描述簇的分配状态及标明文件或目录的下一簇的簇号。 磁盘格式化后,用户文件是以簇为单位存放在数据区中,一个文件至少占用一个簇。当一个文件占用多个簇时,这些簇的簇号不一定是连续,但这些簇号间有由存储该文件时确定了的顺序,即每个文件都有其特定的“簇号链”。 设一个磁盘文件长度为4个簇,其首簇号为n1,簇号链为“n1->n4->n3->n2”。该文件在FAT中的簇号链,以及其逻辑空间和物理存放空间的对应关系如下图所示。 FAT表项: FAT表中的文件簇链对应关系示意图 在磁盘上的每一个可用的簇在FAT中就只有一个登记项,通过在对应簇号的登记项内填入“表项值”来表明数据区中的该簇是否占用、空闲或是已损坏的。损坏的簇是在格式化的过程中,通过FORMAT命令发现。在一个簇中,只要有一个扇区有问题,该簇就不能够使用。 磁盘上的簇在FAT中的表项占12、16或32位。在FAT16文件系统中,每簇在FAT中所取表项值是占12位还是16位与所用磁盘的容量有关,12位表项值可表示4096个簇,若磁盘的簇数大于4096,则用16位表项值。一般来说,软盘和小于20740个扇区(10MB)的硬盘DOS分区可用12位映射一个簇,如多于20740个扇区的硬盘分区,则采用16位的FAT。 3.FAT表的组成格式及功能 综上所述,现将FAT表的组成格式及功能 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf 如下: ·表明磁盘类型。FAT的第0簇和第1簇为保留簇,其中第0字节(首字节)表示磁盘类型,其值与BPB中磁介质说明符对应的磁盘类型相同。 ·表明一个文件所占用各簇的簇链分配情况。FAT从002簇开始分配给文件。表项值“001H--FEFH”、“0001H--FFEFH”或“00000001H--FFFFFFEFH”中的任一值表明文件的下一簇号。文件的起始簇号由文件目录表(FDT)中每个目录登记项的第26、27字节决定,作为FAT的入口,起始簇号在FAT中的表项值即文件的第2簇号,第二簇号的表项值即第3簇号,依此类推,直到表项值为FF8H--FFFH、FFF8H--FFFFH或FFFFFFF8H--FFFFFFFFH,表示该簇为文件的最后一簇。 ·标明坏簇和可用簇。若软盘格式化时发现坏扇区,即在相应簇的表项中写入FF7H(或FFF7H),表明该扇区所在簇不能使用,DOS就不会将它分配给用户文件。 磁盘上未用,但可用的“空簇”的表项值为000H(或0000H)。当需要存放新文件时,文件管理系统将它们按一定顺序分配给新文件。 虽然FAT表记录了文件所用的磁盘空间信息,但是DOS引导区、两个FAT表、文件目录区等并不由FAT表中的簇表示。 4.FAT表登记项与文件的簇链关系 以FAT16文件系统的16位登记项为例,文件寻找簇链的计算步骤为: ·假如我们已经从文件目录表(FDT)中查得该文件的起始簇号。 ·将该起始簇号换为10进制数a,a即为查找下一簇号的本簇号。 ·a*2(若是12位FAT项,则a*1.5的乘积取整),即得到FAT中的相对位移b该位置存放文件簇链的下一簇号。 ·从该相对位移b开始取一个字(低位在前,高位在后。如果是12位的FAT项,则按以下原则:若本簇号a为偶数,则保留该字低12位,否则保留高12位)。 ·重复以上簇链的查找过程,直至找到其值为FF8--FFF的簇号。 5.文件簇链的操作实例 下面用一个例子来说明文件簇链的查找过程: ·假如已经从FDT中知道一个在1.44MB软盘上文件11.TXT的起始簇号为02。 ·a=02即为查找下一簇号的本簇号。 用DEBUG调出第一个FAT的内容如下: A:\>DEBUG -L CS:0 0 1 7 (将A盘第1扇区开始的7个扇区的根目录FAT读入内存) -D CS:0 (显示FAT的部分内容) 0F74:0000 F0 FF FF 03 40 00 FF 5F-01 07 F0 FF FF FF FF FF ....@.._........ 0F74:0010 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ...............o ...... ·由文件起始簇号2*1.5=3.0,取整后得3,即0003开始的一个字中存放下一簇号。 ·从FAT的第3字节开始,取一个字4003。 ·由于本簇号2为偶数,则保留低12位,003(第3簇)。 ·重复以上的查找过程: 3*1.5=4.5,4.5取整后为4,即0004开始的一个字中存放下一簇号。 从FAT的第4字节开始,取一个字0040。 由于本簇号3为基数,则保留低12位,004(第4簇)。 ·再重复以上的查找过程: 4*1.5=6,即0006开始的饿一个字中存放下一簇号。 从FAT的第6字节开始,取一个字5FFFH。 由于本簇号4为偶数,则保留低12位,FFFH(表明第4簇为结束簇)。 由此得到该文件的簇号链为:2=>3=>4。 文件分配表结构如1(H表示16进制) 表1 第0字节 表头,表磁盘类型。FFH双面软盘,每次道8扇区FEH单面软盘,每磁道8扇区FDH双面软盘,每磁道9扇区FCCH单面软盘,每磁道9扇区FC8H硬盘 第1~2字节 (表项号1)表示第一簇状态,因第一簇被系统占据,故此两字节为FFFFH 第3~4字节 (表项号2)表示第二簇状态,若为FFFH表此簇为坏的,DOS已标记为不能用;0000H表示此簇为空,可以用;FFF8H表示该簇为文件的最后一簇;其余数字表示文件的下一个簇号,注意高字节在后,低字节在前。 第5~6字节 (表项号3)表示第三簇状态,同上。 注意: 不要把表项内的数字误认为表示当前簇号,而应是该文件的下一个簇的簇号。高字节在后,低字节在前是小端存储数字方式,读出时应对其进行调整。是如两字节12H,34H,应调整为3412H。 文件分配表与文件目录表(FDT)相配合,可以统一管理整个磁盘的文件。它告诉系统磁盘上哪些簇是坏的或已被使用,哪些簇可以用,并存储每个文件所使用的簇号。它是文件的“总调度师”。 (File Directory Table)即根目录区,又称为ROOT区: 紧跟在FAT2的下一个扇区,长度为32个扇区(256个表项)。如果支持长文件名,则每个表项为64个字节,其中,前32个字节为长文件链接说明;后32个字节为文件属性说明,包括文件长度、起始地址、日期、时间等。如不支持长文件名,则每个表项为32个字节的属性说明。, 值得注意的是: 1,FAT32没有储存目录的目录区,而 FAT16储存根目录并把子目录放到数据区。 2,表示目录的目录项指出根目录地址同时长度字节为0,表示文件的目录项指出数据地址。 当DOS写文件时,首先在文件目录中检查是否有相同文件名,若无则使用一个文件目录表项,然后依次检测FAT中的每个表项对应的簇中,同时将该簇号写入文件目录表项相的26-27字节,如文件长度不止一簇,则继续向后寻找可用簇,找到后将其簇号写入上一次找到的表项中,如此直到文件结束,在最后一簇的表项里填上FFF8H,形成单向链表。 DOS删除文件时只是把文件目录表中的该文件的表项第0个字节改为E5H,表此项已被删除,并在文件分配表中把该文件占用的各簇的表项清0,并释放空间。其文件的内容仍然在盘上,并没有被真正删除,文件分配表在系统中的地位十分重要,用户最好不要去修改它,以免误操作带来严重的后果。 文件系统分配磁盘空间按簇来分配。因此,文件占有磁盘空间时,基本单位不是字节而是簇,即使某个文件只有一个字节,操作系统也会给它分配一个最小单元:即一个簇。为了可以将磁盘空间有序地分配给相应的文件,而读取文件的时候又可以从相应的地址读出文件,我们可以把数据区空间分成BPB_BytsPerSec*BPB_SecPerClus(每扇区字节数*每簇的扇区数)字节长的簇(Cluster)来管理,FAT表项的大小与FAT表的类型有关,FAT12的表项为12bit,FAT16为16bit, 而FAT32则为32bit。对于大文件,需要分配多个簇。同一个文件的数据并不一定完整地存放在磁盘中一个连续地区域内,而往往会分若干段,像链子一样存放。这种存储方式称为文件的链式存储。为了实现文件的链式存储,文件系统必须准确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后继内空的下一个簇的簇号,对于文件的最后一簇,则要指明本簇无后继簇。这些都是由FAT表来保存的,FAT表的对应表项中记录着它所代表的簇的有关信息:诸如是空,是不是坏簇,是否是已经是某个文件的尾簇等。 以FAT16为例说明FAT的结构如下: 表项 示例代码 描述 0 FFF8 磁盘标识字,必须为FFF8 1 FFFF 第一簇已经被占用 2 0003 0000h:可用簇 3 0004 0002h ~ FFFEF:已用簇,表项中存放文件下个簇的簇号 …… …… N FFFF FFFF0h ~ FFFF6:保留簇 N+1 0000 FFFF7h:坏簇 …… …… FFFF8h ~ FFFFFh:文件的最后一簇 八、目录结构 目录所在的扇区,都是以32 Bytes划分为一个单位,每个单位称为一个目录项(Directory Entry),即每个目录项的长度都是32 Bytes。 日期格式:  ● Bits 0–4:日期,有效值为1-31。  ● Bits 5–8:月份,有效值为1–12。  ● Bits 9–15:1980后经过的年数有效值为0–127,可以表示的范围是1980–2107年。 时间格式:  ● Bits 0–4:秒,以2秒为一个单位,有效值为0–29,(实际表示0 – 58秒)。  ● Bits 5–10:分,有效值为0–59。  ● Bits 11–15:时,有效值为0–23。 有效的时间范围是00:00:00 - 23:59:58。 DIR_Name[0]: 文件名的第0 Byte(DIR_Name[0])比较特殊,要专门提出来注意一下:  如果DIR_Name[0]等于0xE5,则表示该目录项是空的,它曾经被使用,但是已经被删除了,现在没有被任何文件或文件夹占用。  如果DIR_Name[0]等于0x00,则表示该目录项是空的,并且没有任何目录项在这之后了(这之后的所有项DIR_Name[0]值都会是0x00)。如果FAT系统程序看到某一项DIR_Name[0]的值为0x00,就不用再往下读取目录项了,因为它们全都是空的了。  如果DIR_Name[0]等于0x05,则实际上完全等效为0xE5。因为0xE5在日语字符集中用特殊应用,所以使用0x05代替0xE5,不管日语系统能否处理该想文件名,都不会造成将该项看成是空的项。 如下字符不能出现在DIR_Name中的任何位置上: ●小于0x20的字符(0x05在DIR_Name[0]除外) ●0x22, 0x2A, 0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x5B, 0x5C, 0x5D, and 0x7C. 下面是一个FAT32的根目录: 00000000 54 45 53 54 34 20 20 20 54 58 54 20 18 1D 27 5D TEST4 TXT ..'] 00000010 6B 3B 6B 3B 00 00 28 5D 6B 3B 00 00 00 00 00 00 k;k;..(]k;...... 00000020 54 45 53 54 35 20 20 20 54 58 54 20 18 32 51 5D TEST5 TXT .2Q] 00000030 6B 3B 6B 3B 00 00 52 5D 6B 3B 00 00 00 00 00 00 k;k;..R]k;...... 00000040 54 45 53 54 20 20 20 20 54 58 54 20 18 5F 8B 5A TEST TXT ._媄 00000050 6B 3B 6C 3B 00 00 EB 5B 6B 3B 07 00 00 08 00 00 k;l;..隱k;...... 00000060 44 49 52 34 20 20 20 20 20 20 20 10 08 99 78 5D DIR4 ..檟] 00000070 6B 3B 6B 3B 00 00 79 5D 6B 3B 0F 00 00 00 00 00 k;k;..y]k;...... 00000080 44 49 52 35 20 20 20 20 20 20 20 10 08 0E BC 5D DIR5 ...糫 00000090 6B 3B 6B 3B 00 00 BD 5D 6B 3B 10 00 00 00 00 00 k;k;..絔k;...... 000000A0 54 45 53 54 32 20 20 20 54 58 54 20 18 2B 64 5B TEST2 TXT .+d[ 000000B0 6B 3B 6B 3B 00 00 D9 5B 6B 3B 05 00 00 04 00 00 k;k;..賉k;...... 000000C0 44 49 52 36 20 20 20 20 20 20 20 10 08 89 CB 5D DIR6 ..壦] 000000D0 6B 3B 6B 3B 00 00 CC 5D 6B 3B 11 00 00 00 00 00 k;k;..蘛k;...... 000000E0 44 49 52 37 20 20 20 20 20 20 20 10 08 1F D5 5D DIR7 ...誡 000000F0 6B 3B 6B 3B 00 00 D6 5D 6B 3B 12 00 00 00 00 00 k;k;..謁k;...... 00000100 44 49 52 38 20 20 20 20 20 20 20 10 08 9D D8 5D DIR8 ..澵] 00000110 6B 3B 6B 3B 00 00 D9 5D 6B 3B 13 00 00 00 00 00 k;k;..賋k;...... 00000120 54 45 53 54 33 20 20 20 54 58 54 20 18 8B 24 5C TEST3 TXT .?\ 00000130 6B 3B 6B 3B 00 00 3C 5C 6B 3B 0B 00 00 02 00 00 k;k;..<\k;...... 00000140 44 49 52 31 20 20 20 20 20 20 20 10 08 C6 11 5D DIR1 ..?] 00000150 6B 3B 6C 3B 00 00 12 5D 6B 3B 0C 00 00 00 00 00 k;l;...]k;...... 00000160 44 49 52 32 20 20 20 20 20 20 20 10 08 41 15 5D DIR2 ..A.] 00000170 6B 3B 6B 3B 00 00 16 5D 6B 3B 0D 00 00 00 00 00 k;k;...]k;...... 00000180 44 49 52 33 20 20 20 20 20 20 20 10 08 00 20 5D DIR3 ... ] 00000190 6B 3B 6B 3B 00 00 20 5D 6B 3B 0E 00 00 00 00 00 k;k;.. ]k;...... 000001A0 E5 49 52 39 20 20 20 20 20 20 20 10 08 33 EB 5D 錓R9 ..3隴 000001B0 6B 3B 6B 3B 00 00 EC 5D 6B 3B 14 00 00 02 00 00 k;k;..靅k;...... 000001C0 E5 49 52 31 30 20 20 20 20 20 20 10 08 76 F0 5D 錓R10 ..v餧 000001D0 6B 3B 6B 3B 00 00 F1 5D 6B 3B 15 00 00 02 00 00 k;k;..馷k;...... 000001E0 E5 49 52 31 31 20 20 20 20 20 20 10 08 2A F7 5D 錓R11 ..*鱙 000001F0 6B 3B 6B 3B 00 00 F8 5D 6B 3B 16 00 00 02 00 00 k;k;..鴀k;...... 看第一项(最前面32 Bytes) 00000000 54 45 53 54 34 20 20 20 54 58 54 20 18 1D 27 5D TEST4 TXT ..'] 00000010 6B 3B 6B 3B 00 00 28 5D 6B 3B 00 00 00 00 00 00 k;k;..(]k;...... 套入上表,偏移0x0A数据为0x20,是一个文件,文件名是TEST4.TXT,文件长度是0字节,空文件。 最后一项: 000001E0 E5 49 52 31 31 20 20 20 20 20 20 10 08 2A F7 5D 錓R11 ..*鱙 000001F0 6B 3B 6B 3B 00 00 F8 5D 6B 3B 16 00 00 02 00 00 k;k;..鴀k;...... 第0 Byte为0xE5,表示该项已经被删除。 再看第11项: 00000140 44 49 52 31 20 20 20 20 20 20 20 10 08 C6 11 5D DIR1 ..?] 00000150 6B 3B 6C 3B 00 00 12 5D 6B 3B 0C 00 00 00 00 00 k;l;...]k;...... 偏移0x0A数据为0x10,是一个子目录(文件夹),名字是DIR1,起始簇号是0x0C。想要看到DIR1的内容,就要跳转到簇0x0C的位置。 下面是簇0x0C的第一个Sector内容: 00000000 2E 20 20 20 20 20 20 20 20 20 20 10 00 C6 11 5D . ..?] 00000010 6B 3B 6B 3B 00 00 12 5D 6B 3B 0C 00 00 00 00 00 k;k;...]k;...... 00000020 2E 2E 20 20 20 20 20 20 20 20 20 10 00 C6 11 5D .. ..?] 00000030 6B 3B 6B 3B 00 00 12 5D 6B 3B 00 00 00 00 00 00 k;k;...]k;...... 00000040 E5 74 00 00 00 FF FF FF FF FF FF 0F 00 20 FF FF 錿.....  00000050 FF FF FF FF FF FF FF FF FF FF 00 00 FF FF FF FF .. 00000060 E5 B0 65 FA 5E 28 00 59 00 29 00 0F 00 20 20 00 灏e鷁(.Y.)... . 00000070 87 65 2C 67 87 65 63 68 2E 00 00 00 74 00 78 00 噀,g噀ch....t.x. 00000080 E5 C2 BD A8 28 59 7E 31 54 58 54 20 00 22 2E 4F 迓建(Y~1TXT .".O 00000090 6C 3B 6C 3B 00 00 2F 4F 6C 3B 00 00 00 00 00 00 l;l;../Ol;...... 000000A0 E5 31 46 31 20 20 20 20 54 58 54 20 18 22 2E 4F ?F1 TXT .".O 000000B0 6C 3B 6C 3B 00 00 51 4F 6C 3B 17 00 00 02 00 00 l;l;..QOl;...... 000000C0 42 74 00 78 00 74 00 00 00 FF FF 0F 00 52 FF FF Bt.x.t.....R 000000D0 FF FF FF FF FF FF FF FF FF FF 00 00 FF FF FF FF .. 000000E0 01 73 00 75 00 62 00 64 00 69 00 0F 00 52 72 00 .s.u.b.d.i...Rr. 000000F0 31 00 66 00 69 00 6C 00 65 00 00 00 31 00 2E 00 1.f.i.l.e...1... 00000100 53 55 42 44 49 52 7E 31 54 58 54 20 00 22 2E 4F SUBDIR~1TXT .".O 00000110 6C 3B 6D 3B 00 00 E9 84 6D 3B 14 00 00 0E 00 00 l;m;..閯m;...... 00000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 第1项: 00000000 2E 20 20 20 20 20 20 20 20 20 20 10 00 C6 11 5D . ..?] 00000010 6B 3B 6B 3B 00 00 12 5D 6B 3B 0C 00 00 00 00 00 k;k;...]k;...... 偏移0x0A为0x10,名字为0x2E(“.”),表示当前目录。 第2项: 00000020 2E 2E 20 20 20 20 20 20 20 20 20 10 00 C6 11 5D .. ..?] 00000030 6B 3B 6B 3B 00 00 12 5D 6B 3B 00 00 00 00 00 00 k;k;...]k;...... 偏移0x0A为0x10,名字为0x2E 0x2E(“..”),表示上一级目录。 00000100 53 55 42 44 49 52 7E 31 54 58 54 20 00 22 2E 4F SUBDIR~1TXT .".O 00000110 6C 3B 6D 3B 00 00 E9 84 6D 3B 14 00 00 0E 00 00 l;m;..閯m;...... 偏移0x0A为0x20,是一个文件,名字为“SUBDIR~1.TXT”,文件长度为0x00000E00,文件起始位置在簇0x00000014。 为了读取该文件,还需要参照FAT得到它的簇链。首先要解决一个问题,就是怎么知道一个簇在FAT表中的位置? 给定一个簇号N,确定它在表中的位置(下面是以FAT16/FAT32为例,FAT12稍微复杂些): 在FAT表中的Sector号为:N/(BPB_BytsPerSec/fact),如果是FAT16则fact取2,如果是FAT32则fact取4。 在Sector内的偏移地址为:N%(BPB_BytsPerSec/fact),即N除以(BPB_BytsPerSec/fact)取余数。 因此,簇0x00000014在FAT表中的Sector为0x14/(512/4)=0,Sector内偏移为0x14%(512/4)=0x50 下面是FAT1的第0个Sector: 00000000 F8 FF FF FF FF FF FF FF 03 00 00 00 FF FF FF 0F ?..... 00000010 00 00 00 00 06 00 00 00 FF FF FF 0F 08 00 00 00 ............. 00000020 09 00 00 00 0A 00 00 00 FF FF FF 0F FF FF FF 0F .......... 00000030 FF FF FF 0F FF FF FF 0F FF FF FF 0F FF FF FF 0F .... 00000040 FF FF FF 0F FF FF FF 0F FF FF FF 0F FF FF FF 0F .... 00000050 15 00 00 00 16 00 00 00 17 00 00 00 18 00 00 00 ................ 00000060 19 00 00 00 1A 00 00 00 FF FF FF 0F 00 00 00 00 ............. 00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000120 00 00 00 00 00 00 00
本文档为【FAT文件系统】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_601546
暂无简介~
格式:doc
大小:1MB
软件:Word
页数:33
分类:互联网
上传时间:2011-11-13
浏览量:34