原链接:https://blog.csdn.net/qianjintianguo/article/details/712590?utm_source=blogxgwz6

文件分配表(FAT)是文件管理系统用来给每个文件分配磁盘物理空间的表格,它告诉操作系统,文件存放在磁盘的什么地方。
1.FAT表的大小及位置
FAT在磁盘上是安排在紧接DOS引导扇区(DBR)之后的。在FAT16系统中,它总是从DOS的逻辑1扇区开始。
在磁盘上共有FAT表的两个拷贝(一个是基本FAT表,另一个是FAT表的备份),两者在磁盘上前后紧排在一起,其大小根据分区的大小不同而变化,FAT16中的文件分配表情况可参见表6-3中的BPB信息项。
FAT表之后紧接着是根目录,根目录之后是数据区。
图6-1说明了常用磁盘上各数据区中DBR、FAT及根目录FDT的相对位置和大小。在硬盘中,FAT16的文件分配表(FAT)仍然是存放在逻辑1扇区开始的若干个扇区内,一个文件分配表占用多少个扇区根据硬盘分区和逻辑盘容量大小情况的不同而不同。
2.文件的簇号链
磁盘格式化后,用户文件是以簇为单位存放在数据区中,一个文件至少占用一个簇。当一个文件占用多个簇时,这些簇的簇号不一定是连续,但这些簇号间有由存储该文件时确定了的顺序,即每个文件都有其特定的“簇号链”。
设一个磁盘文件长度为4个簇,其首簇号为n1,簇号链为“n1->n4->n3->n2”。该文件在FAT中的簇号链,以及其逻辑空间和物理存放空间的对应关系如图6-4所示。
FAT表项:

第00簇
 
···
n4
···
FFF
···
n2
···
n3
···
该磁盘文件所占据的逻辑空间:
···
        ···
第n1簇 簇号:n1------------>n4------------>n3-------------->n2
···                                        文件所占据的物理空间
第n2簇                                             不一定连续
··· 该磁盘文件所占据的物理空间:
第n3簇
···   ···   ···   ···   ···
··· 簇号:    n1            n2             n3            n4 
第n4簇  
···  

图6-4FAT表中的文件簇链对应关系示意图
在磁盘上的每一个可用的簇在FAT中就只有一个登记项,通过在对应簇号的登记项内填入“表项值”来表明数据区中的该簇是否占用、空闲或是已损坏的。损坏的簇是在格式化的过程中,通过FORMAT命令发现。在一个簇中,只要有一个扇区有问题,该簇就不能够使用。
磁盘上的簇在FAT中的表项占12、16或32位。在FAT16文件系统中,每簇在FAT中所取表项值是占12位还是16位与所用磁盘的容量有关,12位表项值可表示4096个簇,若磁盘的簇数大于4096,则用16位表项值。一般来说,软盘和小于20740个扇区(10MB)的硬盘DOS分区可用12位映射一个簇,如多于20740个扇区的硬盘分区,则采用16位的FAT。FAT12和FAT16表项的组成如图6-5和6-6所示。
                   

图6-5 12位FAT表项的组成


                                    图6-6 16位FAT表项的组成
FAT文件系统是以簇为单位给文件分配磁盘空间的,每个簇在FAT表中占有一个登记项。所以,在FAT表中,簇编号也即为登记项的编号。每一个登记项作为一个簇的标志信息按照FAT12、FAT16和FAT32结构的不同分别为1.5个字节、2个字节和4个字节。该标志信息可取的表项值及其含义如表6-5所示。
表6-5文件分配表中的每个簇号可取的表项值及其含义

表项值(12位) 表项值(16位) 表项值(32位) 簇描述信息含义
000H 0000H 00000000H "0"值(未分配使用)
001H--FEFH 0001--FFEFH 00000001--FFFFFFEFH "一个簇号"(已占用)
FF0H--FF6H FFF0--FFF6H FFFFFFF0--FFFFFFF6H 保留
FF7H FFF7H FFFFFFF7H 坏簇
FF8H--FFFH FFF8H--FFFFH FFFFFFF8--FFFFFFFFH "EOF"(文件结束簇)

从表6-5中可看出,簇在FAT中的占用1.5个字节、2个字节或4个字节的登记项必须是下列值之一:
·一个“0”值,表示这个簇未被分配使用。
·一个“001H~FEFH”、“0001H~FFEFH”或“00000001H~FFFFFFEFH”之间的值,表示该簇已经被占用,且该值即是该簇所在文件中下一个簇号的指针。
·一个“BAD”(FF7H、FFF7H或FFFFFFF7H),表明该簇有坏扇区,不能使用。
一个“EOF”(FF8H~FFFH、FFF8H~FFFFH或FFFFFFF8H~FFFFFFFFH之间的任一值),表明该簇是文件中的最后一簇。
在FAT的簇登记项中,0号登记项和1号登记项是表头,簇的登记项从2号开始。系统隐含文件IO.SYS所在的首簇号总是0002。
3.FAT表的组成格式及功能
综上所述,现将FAT表的组成格式及功能总结如下:
·表明磁盘类型。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。

文件分配表(FAT)及其结构的更多相关文章

  1. 硬盘结构介绍--mbr及分区

    硬盘刚买来使用时需要经过分区然后格式化才能够使用,硬盘经过分区后,分区软件便会写一个主引导扇区,这个扇区位于硬盘的 0 磁道 0 柱面第1扇区(即0区)(注意:该扇区为隐含扇区,0道0面的全部扇区均为 ...

  2. FAT和EXFAT文件系统

    文件系统 文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构:即在磁盘上组织文件的方法.在移动存储设备上比较常用的有FAT文件系统和ExFAT文件系统. FAT分区依据FAT表中每个簇链的所 ...

  3. 硬盘的结构和介绍,硬盘MBR详细介绍(超详细彩图)

    一.物理结构 1.磁道,扇区,柱面和磁头数 硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等.每个盘片有两面,都可记录信息.盘片被分成许多扇形的区域,每个区域叫一 ...

  4. U盘FAT32文件系统

    一.FAT文件系统分为四个部分 参考别人的博客 1.http://blog.163.com/ourhappines@126/blog/static/121363154201311811495492/ ...

  5. 基于stm32f103zet6的FAT16文件系统学习1(初识FAT16)

    有了之前读写block的基础之后,准备弄个文件系统,之前没有接触过这东西,所以有很多都晕晕的,但是看到fat的源代码之后还是挺有信心的,因为之前一直过uboot,所以这个文件当然是小巫见大巫了.首先来 ...

  6. FAT32文件系统的存储组织结构(一)

    对磁盘的物理结构,逻辑结构和存储结构有了比较深入的了解后,我们来仔细探讨FAT32文件系统的存储组织结构.说到文件系统的组织结构,我们应该马上意识到,这指的是文件系统在同一个分区内的组织结构,在这个话 ...

  7. [OS] 操作系统常考知识点

    转自:http://jennica.space/2017/03/21/os-principle/ 大纲如下: 1.操作系统概述2.操作系统运行环境3.进程线程模型4.处理器调度5.同步机制6.存储模型 ...

  8. 手机SD卡损坏补救措施

    现在的应用程序越来越重,比如微信.来往之类的,稍微用一段时间,就会占用几十MB甚至上百MB的空间.而有时候甚至手机会出现"无响应"的现象,需要你选择"继续等待" ...

  9. 制作FAT12软盘以查看软盘的根目录条目+文件属性+文件内容

    [-1]Before for specific info , please visit http://wiki.osdev.org/Loopback_Device [0]我们先上干货,看到效果后,我们 ...

随机推荐

  1. Windows安装node环境,部署静态网站

    1.进入官网,下载nodejs https://nodejs.org/zh-cn/ 2.安装nodejs win10怎么安装nodejs和npm https://jingyan.baidu.com/a ...

  2. C++ 常用编程--Swap函数有几种写法?

    C++ 常用编程--Swap函数有几种写法? 在说C++模板的方法前,我们先想想C语言里面是怎么做交换的. 举个例子,要将两个int数值交换,是不是想到下面的代码: void swap(int& ...

  3. C++ substr 截取子串

    1. substr() 方法使用 string substr (size_t pos = 0, size_t len = npos) const;pos: 截取初始位置(从头开始截取pos=0)len ...

  4. Android中实现照片滑动时左右进出的动画的xml代码

    场景 Android中通过ImageSwitcher实现相册滑动查看照片功能(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...

  5. 常量, char[], const char[], char*, const char*, char* const以及const char* const的详解

    注意,这里用char类型只是举了一个例子,其他的int之类的也通用. 1: 常量: 例子: char str[] = "Hello world!"; char ch = 'a'; ...

  6. cf877D

    题意简述:矩阵中有的点不能走,你每次可从四个方向走,至少走一步,最多走k步(不能横跨那些不能走的格子),问从(sx,sy)走到(tx,ty)的最短时间是多少? 题意:利用set来加速bfs的过程,原理 ...

  7. Linux高性能服务器编程:Linux服务器程序规范

    Linux服务器程序一般以后台进程形式运行,后台进程又称守护进程.它没有控制终端,不会接收到用户输入.守护进程的父进程通常是init进程(PID为1). Linux服务器程序有一套日志系统 Linux ...

  8. VAE

    Waiting list: basic knowledge: http://adamlineberry.ai/vae-series/vae-code-experiments

  9. rxjs简单的Observable用例

    import React from 'react'; import { Observable } from 'rxjs'; const FlowPage = () => { const onSu ...

  10. SQL Server数据库、表、数据类型基本概念

    一.SQL Server的数据存储结构 SQL Server是一个数据库管理系统,需要以有效方式存储高容量数据.要更好地理解SQL Server处理数据的方式,就需要了解数据的存储结构. 1.文件类型 ...