zoukankan      html  css  js  c++  java
  • FAT32文件系统学习(2) —— FAT表

    1、题外话

           在继续本文学习FAT32文件系统之前,先来插入一点别的话题。我们都知道U盘有一个属性是容量,就拿笔者的U盘为例,笔者手上的U盘是金士顿的DataTraveler G3 4GB的一个U盘。电脑上显示的容量如图1所示为3.75GB。那么这个3.75GB是怎么计算出来的呢?

    图 1 系统显示U盘属性

           我们先来回顾一下上一篇BPB参数当中的Sectors(扇区总数)这个参数,这一参数代表了这个U盘在出厂时的总扇区数,笔者手上这个是7884672个,可以从图2中看到。其中每个扇区为512 B,也就是说总共可以容纳4036952064 B 约为 3.76GB 的数据。但是这其中一部分是要用来存放FAT32文件系统的相关信息参数的,比如FAT表,BPB等。我们这边来算一下,首先需要减去1016个保留扇区,还有两个FAT表总共是7684 * 2 = 15368个扇区,所示还剩下的字节数为4036952064 B - ( 1016 + 15368 ) * 512 B = 4028563456 B 正好是图中显示的容量。所以可以得出结论,系统显示的U盘容量 = ( 总扇区数 - 保留扇区数 - FAT表扇区数 * FAT表个数 ) * 512 B。经计算可得实际的使用率是99.79%。所以相对与整个U盘来说,FAT32文件系统用于存储相关信息部分的损耗是很小的。

    图 2 笔者用上一篇中写的工具查看了U盘的各项参数

           好了,接下来进入正题,继续学习FAT32文件系统的FAT表部分。

    2、本文目录

    1、题外话

    2、FAT表的读取

    3、FAT表项

    4、参考文献

    3、FAT表的读取

          首先FAT表一般来说有两张,另一张用于备份。两张表是前后紧挨在一起的,只要计算出了FAT1表的偏移之后加上FAT表的大小就可以得到FAT2表的偏移。FAT1表的偏移地址计算公式如下[4] :

    FAT1表偏移 = 保留扇区数 * 每扇区字节数

    图2可知,在本例中,FAT1表的偏移 = 1016 * 512 B = 520192 = 0x7F000。同理:

    FAT2表的偏移 = FAT1+FAT表的大小 = (保留扇区数 + FAT表扇区数) * 每扇区字节数

    在本例中,FAT2表的偏移 = (1016 + 7684) * 512 B = 4454400 = 0x43F800。用上一篇中讲到的程序可以读取出两张FAT表的内容,一般情况下两张表的内容应该是完全一样的。笔者读取了第一张FAT表起始部分的内容,如图3所示:

    图 3 FAT表起始部分内容

     4、FAT表项

           在分析FAT表之前先来说明一下FAT的构成。FAT表即文件分配表(File Allocation Table)。FAT32文件表是由一个个表项组成的一张表,其中每一个表项由一个32位的二进制组成,其值对应了相应簇的使用情况,如2号表项对应了2号簇的使用情况,3号表项对应了3号簇的使用情况,依此类推。(但是第0和第1项例外,下面会有说明)。每个表项对应数值的含义如表1所示[2]

    表项数值 对应含义
    0x00000000  空闲簇,即表示可用
    0x00000001 保留簇
    0x00000002 - 0x0FFFFFEF 被占用的簇,其值指向下一个簇号
    0x0FFFFFF0 - 0x0FFFFFF6 保留值
    0x0FFFFFF7  坏簇
    0x0FFFFFF8 - 0x0FFFFFFF  文件最后一个簇

    表 1 表项数值含义

           具体每一项填写的内容规则如下表所示:如果该簇是文件的最后一簇,填入的值为0x0FFFFFFF;如果该簇不是文件的最后一簇,则填入的值为该文件占用的下一簇号(所以我们可以看到在FAT32中文件是以簇链的形式保存起来的)。下面我们根据实际情况,图3来分析一下FAT表的含义。

           FAT表第0项(0x00000000~0x00000003): 0x0FFFFF8

           FAT表第1项(0x00000004~0x00000007): 0xFFFFFFFF

           这两项不代表任何簇的使用情况,而是FAT表的表头,表征了介质描述,是固定值,所以0x00和0x01这两个簇号是不用的,簇号的下标从2开始。其中1号表项可能被用于记录脏标志,以说明文件系统没有被正常卸载或者磁盘表面存在错误。接下来

           FAT表第2项(0x00000008~0x0000000B): 0x0FFFFFFF

           第2项存储的是第2簇的使用情况,通常第2簇存储的是文件系统的根目录。虽然在FAT32文件系统中,根目录的位置不再硬性地固定,可以存储在分区内可寻址的任意簇内,不过通常根目录是最早建立的(格式化就生成了)目录表。所以,我们看到的情况基本上都是根目录首簇紧邻FAT2,占簇区顺序上的第1个簇(即2号簇)。同时,FAT32文件系统将根目录当做普通的数据文件来看,所有没有了目录项数的限制,在需要的时候可以分配空簇,存储更多的目录项[1]

           这一项的值为0x0FFFFFFF ,说明根目录占用且只占用了1个簇。

           FAT表第3 ……

           这里再穿插一点题外话,FAT32格式文件分配的最小单位是簇。也就是说你存储了一个实际大小1kB的文件,那么它占用的存储空间还是1簇(在这里换算成大小即为8*512B = 4KB)。笔者以一个实际的例子来说明一下:在U盘中放入一个8B大小的temp.txt文件,然后查看文件属性的时候发现其占用空间是4KB,和我们上面讲的理论符合。

    图 4 temp.txt的大小和占用空间

           看了下篇幅也差不多了,那么本文关于FAT表的部分到此结束。其实本来也没多少内容,笔者想到哪就扯到哪,胡扯了些其他的东西。剩下的数据区部分就留到下一篇当中再讲好了。同样的,本文当中有一些内容是笔者自己思考理解甚至推测出来的,如果有错误的地方欢迎指正,以免误人子弟了(笑)。

    5、参考文献

    1、FAT32文件系统的存储组织结构(一) http://blog.chinaunix.net/uid-26913704-id-3213948.html

    2、FAT32  http://baike.baidu.com/view/45233.htm?fr=aladdin

    3、基​于​U​盘​F​A​T​3​2​文​件​系​统​的​分​析 http://wenku.baidu.com/link?url=cIKgrwV66y4CoyuOEB1-OhjRY9tnXtIAoZuYEwDCjxbyRomSIiJgBAXGxq6LudfwuopUpYhiVd8TjxrBFoVyPs0NX3OqbnoWjyn4ZAx60Wi

    4、FAT 32 文件格式 http://blog.csdn.net/shrekmu/article/details/5950414

  • 相关阅读:
    因打卡界面更新,稍修改主要代码【2021/1/16】
    Python爬虫:使用Selenium爬取指定上市公司(如浦发银行)的今年公告信息
    Python爬虫:爬取福州链家的不同区域的二手房成交信息
    蓝精灵小组第十三周学习总结
    2020-2021-1学期 20202417《网络空间安全专业导论》第十三周学习总结
    蓝精灵小组第十二周学习总结
    蓝精灵小组第十一周学习总结
    2020-2021-1学期 20202417《网络空间安全专业导论》第十二周学习总结
    2020-2021-1学期 20202417《网络空间安全专业导论》第十一周学习总结
    2020-2021-1学期 20202417《网络空间安全专业导论》第十周学习总结
  • 原文地址:https://www.cnblogs.com/fantacity/p/3897933.html
Copyright © 2011-2022 走看看