zoukankan      html  css  js  c++  java
  • FAT32文件系统的存储组织结构(二) 分类: VC++ 2014-08-27 09:15 467人阅读 评论(0) 收藏

      前面已经基于一个格式化的空U盘分析了一下FAT32文件系统存储的组织结构,下面我们从文件操作的角度来分析一下文件系统的运作机制。由于换了个U盘,所以仍然贴出刚格式化的空U盘的几个重要的数据区如下:

    DBR FDT_DN

    根目录_DN

    我们可以看出,在分区格式化的时候,系统将卷标TEST_FAT32存储在2号簇,即跟目录区,如上面根目录贴图所示。同时,在FDT区2号簇标记位置写入了文件结束符FF FF FF 0F。显然,FAT32文件系统将目录当做普通文件来处理的。

    下面我们在根目录下新建一个文件夹TEST1,看会有什么变化:

    建立了TEST1文件夹后,FDT变成如下:

    FDT_TEST1

    根目录变成如下:

    根目录2

    重新分配了3号簇:

    3号簇_NEW

    从上面的变化可以直观的看出,系统在新建文件夹时完成了如下动作:

         a.在父目录所在簇上建立新的目录项,存储当前所建文件夹信息。

         b.分配一个新簇,给新建的文件夹建立两个目录项:父目录和当前目录。

         c.在FDT表中新分配的簇对应的位置上写下文件结束符。

         d.建立各部分的链路关系:新建文件夹所对应的目录项的文件起始簇号字段写上新分配簇的簇号,新簇上的两个目录项的文件起始簇号字段分配写上父目录所在簇号(此处是0,本来我以为是2,即根目录所在簇,不知道为什么,可能特地用0指示根目录吧)和当前簇号(此处是3)。

    为了验证我们上面分析的正确性,我们再在TEST1文件夹下建立新文件夹TEST11,看是否做了如下操作:

          a.在父目录(即TEST1)所在簇(即3号簇)上建立新的目录项,存储TEST11文件夹信息。

         b.分配一个新簇(应该是4号簇),给新建的文件夹(即TEST11)建立两个目录项:父目录和当前目录。

         c.在FDT表中新分配的簇(应该是4号簇)对应的位置上写下文件结束符。

         d.建立各部分的链路关系:新建文件夹(即TEST11)所对应的目录项的文件起始簇号字段写上新分配簇的簇号(应该是4号簇),,新簇上的两个目录项的文件起始簇号字段分配写上父目录所在簇号(3号簇)和当前簇号(应该是4号簇)。

    新建TEST11文件夹后FDT变成:

    FDT_TEST11

    根目录没有变化:

    根目录2

    3号簇变成:

    3号簇

    新分配4号簇:

    4号簇

    显然我们的估计没有错的,也进一步证明我们前面的分析是正确的。

    下面我们再分析建立文件的情况

    我们先建立一个100字节的文件TEST.TXT,然后把这个文件拷贝到U盘的根目录下,FDT变成如下:

    FDT

    根目录变成:

    根目录

    新分配5号簇保存文件内容:

    5号簇

    从上面的变化可以直观的看出,系统新建文件和新建文件夹所完成的操作是一样一样的:

         a.在父目录所在簇上建立新的目录项,存储当前所建文件信息。

         b.分配一个新簇,存储新建的文件的内容。

         c.在FDT表中新分配的簇对应的位置上写下文件结束符。

         d.建立链路关系:新建文件所对应的目录项的文件起始簇号字段写上新分配簇的簇号。

    结束总结:

          1.在FAT32文件系统中,目录和文件的存储采用统一的方式。

          2.文件系统的操作的单位是簇,每新建立一个文件或文件夹,至少会重新分配一个簇号。

          3.如果一个文件或目录的内容要多个簇才能存储得下,则系统会分配多个簇来存储文件或目录的内容

          4.当需要多个簇时,这些簇可能连续也可能不连续,但无论是连续或是不连续,系统都是采用FDT链表的形式来组织的。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    hystrix 源码分析以及属性的配置
    golang官方包限流器使用和原理(golang.org/x/time/rate)
    pip通过指定分支和子目录从git仓库中拉取python包
    cgo使用示例总结
    python装饰器原理和用法总结
    centos7编译安装clang8(同时还会编译llvm的不少东西, 文中附带编译好的二进制压缩包)
    prometheus+alertmanager+granafa监控总结,安装基于docker-compose(长期更新)
    go条件变量的使用和原理
    canal+kafka订阅Mysql binlog将数据异构到elasticsearch(或其他存储方式)
    go对elasticsearch的增删改查
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706527.html
Copyright © 2011-2022 走看看