交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
4 fat32文件格式
分享
未结
0
1231
李延
LV6
2022-06-24
悬赏:20积分
# 1 FAT32 前面我们介绍了MBR分区说明,在本章我们继续介绍FAT32格式的文件分配表,具体看一下我们的文件与文件目录到底在硬盘中是如何存储的。 # 2 基本概念 首先我们需要明确几个基本的概念 - 块:这里我们不关注磁盘的磁盘的扇区、磁道等相关概念。而是把磁盘看作一个整体,每512字节为一个块,从0开始编号。也就是说磁盘前512个字节为第0个块,接下来的512字节为第1个块,以此类推。(也就是说采用LBA寻址方式,不适用CHS寻址方式) - 簇:磁盘容量是比较大的,如果以块为单位粒度还是太细了,所以我们一般把 8个块 称为一个簇。簇的大小不是固定的,它在FAT头中进行定义,一般为8个块。 # 3 整体结构  虽然图中看着相对比较复杂,但我们可以把它粗略的分为主要的3个区域 - FAT头:也就是上图中的 主启动区+文件系统信息扇区+额外保留空间。主要保存文件系统信息,包括:FAT空间大小、文件分配表位置、数据区位置等相关信息。 - 文件分配表:记录每个簇的分配情况。 - 数据区:上图中的根目录+其他所有数据。这里记录了文件系统的目录信息、文件信息以及具体文件内容。 我们也将从这3方面详细介绍: # 4 FAT头 FAT头占用512字节,具体内容如下: <img src="image-20220624143740322.png" alt="image-20220624143740322" style="zoom:200%;" />  这里我们主要关注的内容是关于文件分配表位置、数据区位置等相关的几个数据,他们分别是: - 位置: 0x0b,长度:2,说明: 每个扇区的字节数。*基本输入输出系统参数块*从这里开始。 - 位置:0x0d,长度:1,说明: 每簇扇区数 - 位置:0x0e,长度:2,说明: 保留扇区数(包括启动扇区) - 位置:0x10,长度:1,说明: 文件分配表数目 - 位置:0x1c,长度:4,说明: 隐藏扇区 - 位置:0x24,长度:4,说明: 每个文件分配表的扇区(FAT32)。*扩展基本输入输出系统参数块*从这里开始。 通过上面的信息,我们可以确定:文件分配表与数据区位置: 文件分配表位置 = 隐藏扇区+保留扇区数 数据区位置 = 隐藏扇区+保留扇区数+文件分配表数目*每个文件分配表的扇区 其中上面的单位都是扇区,计算字节需要在乘以512. # 5 数据区 我们先跳过文件分配表 直接解析数据区内容。 数据区所有数据都是以簇为单位进行存储,也就是说一个文件大小如果小于一个簇也将会被分配一个簇的大小。 数据区内容我们可以将他们分为两种类型:文件信息与文件内容。 - 文件信息就是指:文件夹或者一个文件的基本信息,如:文件名称、文件类型、文件创建事件等相关内容。 - 文件内容:就是指文件具体存储的内容。 # 5.1 文件信息 同一级的文件可以被看作一个文件,每32个字节记录一个文件或者文件夹的基本信息,数据区最开始的簇将记录根目录下的文件信息,具体格式如下:  这里我们看到记录了 文件名称、文件创建修改时间、文件大小(单位字节)等形象。 我们看到上面有2个字节记录:FAT12和FAT16中的第一个簇。也就是说我们可以通过它找到文件的具体内容。 这里只记录了一个簇号,但文件的内容可能不是连续的,比如: - 我们先创建了一个a.txt文件。 - 之后我们再创建了其他文件,那么a.txt 文件后面的簇内容就会被分配给其他新创建的文件。 - 如果这时候我们在回退修改了a.txt 文件,它超过了之前簇的内容,需要分配新的簇。 这种情况我们就会发现,一个文件的簇不一定是连续的,只记录第一个簇的位置是不够的。所有我们需要有一个位置记录每个文件下一个簇位置的地方,而它就是文件分配表。 # 6 文件分配表 文件分配表 其实维护的类似一个单向链表的结构,我们把文件分配表每4个字节看做一个元素,把它看着一个数组结构。 这个数组的下标就代表数据区具体的哪个簇,而具体的只则表示下一个簇的位置。这样就可以维护为单向链表,记录一个完整的文件系统。 其中有几个特殊的值,具体如下:  # 7 参考 https://blog.csdn.net/csdn66_2016/article/details/88066637 https://zh.wikipedia.org/wiki/%E6%AA%94%E6%A1%88%E9%85%8D%E7%BD%AE%E8%A1%A8#FAT32
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号