FAT文件系统原理(三)

FAT12文件系统C语言模拟实现及原理讲解 本文介绍了如何使用C语言模拟一个FAT12文件系统并且自制Shell进行交互,同时讲解了系统原理和代码实现。 阅读详情
4.3  FAT表和数据的存储原则。

FAT表(File Allocation Table 文件分配表),是Microsoft在FAT文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构。假如把磁盘比作一本书,FAT表可以认为相当于书中的目录,而文件就是各个章节的内容。但FAT表的表示方法却与目录有很大的不同。

在FAT文件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。

★存储过程假想:

我们模拟对一个分区存储数据的过程来说明FAT文件系统中数据的存储原则。

假定现在有一个空的完全没有存放数据的磁盘,大小为100KB,我们将其想象为线形的空间地址。为了存储管理上的便利,我们人为的将这100KB的空间均分成100份,每份1KB。我们来依次存储这样几个文件:A.TXT(大小10KB),B.TXT(大小53.6KB),C.TXT(大小20.5KB)。

最起码能够想到,我们可以顺序的在这100KB空间中存放这3个文件。同时不要忘了,我们还要记下他们的大小和开始的位置,这样下次要用时才能找的到,这就像是目录。为了便于查找,我们假定用第1K的空间来存储他们的特征(属性)。还有,我们设计的存储单位是1KB,所以,A.TXT我们需要10个存储单位(为了说明方便,我们把存储单位叫做“簇”吧。也能少打点字,呵呵。),B.TXT需要54个簇,C.TXT需要21个簇。可能有人会说B.TXT和C.TXT不是各自浪费了不到1簇的空间吗?干嘛不让他们紧挨着,不是省地方吗?我的回答是,如果按照这样的方式存储,目录中原本只需要记下簇号,现在还需要记下簇内的偏移,这样会增加目录的存储量,而且存取没有了规则,读取也不太方便,是得不偿失的。

根据上面所说的思想,我们设计了这样的图4.3.1所示的存储方式。


我们再考虑如何来写这三个文件的目录。对于每个文件而言,一定要记录的有:文件名,开始簇,大小,创建日期、时间,修改日期、时间,文件的读写属性等。这里大小能不能用结束簇来计算呢?一定不能,因为文件的大小不一定就是整数个簇的大小,否则的话像B.TXT的内容就是54KB的内容了,少了固然不行,可多了也是不行的。那么我们怎么记录呢?可以想象一下。为了管理上的方便,我们用数据库的管理方式来管理我们的目录。于是我把1KB再分成10份,假定开始簇号为0,定义每份100B的各个位置的代表含义如图4.3.2


这样设计的结构绝对可以对文件进行正确的读写了。接着让我们设计的文件系统工作吧。先改动个文件,比如A.TXT,增加点内容吧!咦?增加后往哪里放呀,虽然存储块的后面有很多空间,但紧随其后B.TXT的数据还顶着呢?要是把A.TXT移到后边太浪费处理资源,而且也不一定解决问题。这个问题看来暂时解决不了。

那我们换个操作,把B.txt删了,b.txt的空间随之释放。这时候空间如图4.3.3,目录如图4.3.4

这个操作看来还可以,我们接着做,在存入一个文件D.txt(大小为60.3KB),总共100簇的空间只用了31簇,还有68簇剩余,按说能放下。可是?往那里放呢?没有61个连续的空间了,目录行没办法写了,看来无连续块存储暂时也不行。

你一定能够想到我们可以在连续空间不够或增加文件长度的时候转移影响我们操作的其他文件,从而腾出空间来,但我要问你,那不是成天啥也不要干了,就是倒腾东西了吗?

看来我们设计的文件系统有致命的漏洞,怎么解决呢?。。。。

其实可以这样解决:

首先我们允许文件的不连续存储。目录中依然只记录开始簇和文件的大小。那么我们怎么记录文件占用那些簇呢,以文件映射簇不太方便,因为文件名是不固定的。我们换个思想,可以用簇来映射文件,在整个存储空间的前部留下几簇来记录数据区中数据与簇号的关系。对于上例因为总空间也不大,所以用前部的1Kb的空间来记录这种对应,假设3个文件都存储,空间分配如图4.3.5,同时修改一下目录,如图4.3.6


第一簇用来记录数据区中每一簇的被占用情况,暂时称其为文件分配表。结合文件分配表和文件目录就可以达到完全的文件读取了。我们想到,把文件分配表做成一个数据表,以图4.3.7的形式记录簇与数据的对应。

用图4.3.7的组织方式是完全可以实现对文件占有簇的记录的。但还不够效率。比如文件名在文件分配表中记录太多,浪费空间,而实际上在目录中已经记录了文件的开始簇了。所以可以改良一下,用链的方式来存放占有簇的关系,变成图4.3.8的组织方式。


参照图4.3.8来理解一下文件分配表的意义。如文件a.txt我们根据目录项中指定的a.txt的首簇为2,然后找到文件分配表的第2簇记录,上面登记的是3,我们就能确定下一簇是3。找到文件分配表的第3簇记录,上面登记的是4,我们就能确定下一簇是4......直到指到第11簇,发现下一个指向是FF,就是结束。文件便丝毫无误读取完毕。

我们再看上面提到的第三种情况,就是将b.txt删除以后,存入一个大小为60.3KB的d.txt。利用簇链可以很容易的实现。实现后的磁盘如图4.3.9  4.3.10  4.3.11

上面是我们对文件存储的一种假设,也该揭开谜底的时候了。上面的思想其实就是fat文件系统的思想的精髓(但并不是,尤其像具体的参数的意义与我们所举的例子是完全不同的。请忘掉上边细节,努力记忆下边)。
【FatFs】FAT32文件系统协议总结(理论+实践) 1.前言 本篇文章主要是介绍FAT 格式分区内数据是如何存储的。FAT 分区格式是Microsoft 最早支持的分区格式,依据 FAT 表中每个簇链的所占位数(有关概念,后面会讲到)分为 FAT12、 FAT16、 FAT32 三种格式"变种",但其基本存储方式是相似的。我们在嵌入式系统中使用的最多的是FAT32,所以后面主要介绍的是FAT32。 在介绍 FAT32文件系统前,我们需要先了解一下硬盘基本知识:磁头、磁道、扇区、柱面等,方便后面对FAT32文件系统的理解。 NOTE:本文介绍的很多概念都是 阅读详情

相关推荐

Fatfs详解

文件系统 文件系统的实质是一种高效的管理方式。它是为了存储和管理数据,而在存储介质建立的一种组织结构,这些结构包括操作系统引导区、目录和文件。 原理 在使用文件系统前,要先对存储介质进行格式化。格式化先擦除原来内容,在存储介质上新建一个文件分配表和目录。这样,文件系统就可以记录数据存放的物理地址,剩余空间。 使用文件系统时, 数据都以文件的形式存储。写入新文件时,先在目录中创建一个文件索引,它指示了文件存放的物理地址,再把数据存储到该地址中。当需要读取数据时,可以从目录中找到该文件的索引,进而在

xiaoluoshan的专栏 1382

【STM32-FatFs】FAT文件系统原理

一、硬盘的物理结构: 硬盘存储数据是根据电、磁转换原理实现的。硬盘由一个或几个表面镀有磁性物质的金属或玻璃等物质盘片以及盘片两面所安装的磁头和相应的控制电路组成(图1),其中盘片和磁头密封在无尘的金属壳中。 硬盘工作时,盘片以设计转速高速旋转,设置在盘片表面的磁头则在电路控制下径向移动到指定位置然后将数据存储或读取出来。当系统向硬盘写入数据时,磁头中“写数据”电流产生磁场使盘片表...

好习惯成就伟大 5049

FATFS嵌入式文件写操作原理与健壮实现

FATFS是嵌入式系统中最常用的轻量级文件系统,其核心机制基于扇区对齐的块设备访问,依赖读-改-写(Read-Modify-Write)流程应对Flash存储器不可覆写的物理特性。理解FAT表更新、目录项刷新、缓存刷写(f_sync)及文件指针(fptr)管理,是保障数据一致性的底层基础。在STM32等资源受限平台,高频小写入易引发性能瓶颈与磨损放大,需结合缓冲策略、批量写入与追加模式优化。典型API如f_write、f_lseek、f_puts等各司其职,但必须配合返回值校验、br长度比对、显式f_clo

weixin_42453228的博客 66

Fatfs文件系统挂载

先来看一张在fatfs截取的一张图,文件系统就是中间这个带颜色一层,它贯通连接着底层硬件和上层软。上层软件不用太关系你底层使用的flash、磁盘、u盘、sd卡、、、,底层呢也不需要上层写了什么文件,读了什么文件,只需要把数据在硬件上大小烙印就可以了。 挂载文件系统使用的接口函数如下,接下来就分析一下函数的基本流程。 /*-----------------------------------------------------------------------*/ /* Mount/Unmoun.

kuaileguyue的专栏 3649

scannet数据集下载文件

scannet数据集下载文件 由于大家会申请scannet数据集,审批比较慢,我将下载的文件里面的内容贴出来,大家可以复制放进py文件中,运行就可以下载 ps:别再私信要数据集了,这个自己下载,如果光三维数据的话,还是很快的,当然如果路由器翻了墙的话,下载会更快。 #!/usr/bin/env python # Downloads ScanNet public data release # Run with ./download-scannet.py (or python download-scannet.

weixin_40766438的博客 9234

【UOJ170】Picks loves segment tree VIII

【题目链接】 点击打开链接 【前置阅读】 【BZOJ4695】最假女选手 【BZOJ3064】【TYVJ1518】CPU监控【UOJ169】【UR #11】元旦老人与数列 【思路要点】 前置阅读中的前两题中,我们分别对线段树的区间取最大/最小值和线段树的历史最大/最小值进行了研究。本题中,两类问题同时出现,因此我们

cz_xuyixuan的博客 1263

【FatFs】FAT32文件系统协议原理讲解(以U盘为例)

了解FAT32文件系统的具体工作原理

bfkjabfkjab的博客 4546

【WSL2+Ubuntu+Docker Desktop】迁移到D盘

该篇文章包含将WSL2+ubuntu+Docker Desktop从C盘迁移到D盘

哈茶的博客 3931

FatFs 之三 FAT文件系统基础、FAT 数据格式、引导、编码

注意:本文章主要是翻译自 FatFs 官网的 The basics of FAT filesystem。但是,原文大多都是文字说明,因此在翻译时,添加了大量的图片示例以及一些额外的章节。因此,以下翻译与原文有些差别。具体表现为下文中的英文部分全部是原文,没有任何更改;中文部分添加了一些额外内容!

技术干货 1万+

gtsam官方文档: The new IMU Factor学习笔记

gtsam官方文档:The new IMU Factor 本文为gtsam imu预积分文档学习笔记,为gtsam基于切向量实现的imu预积分的理论基础。 导航状态 定义导航状态为 Xbn={Rbn,Pbn,Vbn}X^n_b=\{R^n_b,P^n_b,V^n_b\}Xbn​={Rbn​,Pbn​,Vbn​} 上角标n:导航(navigation)坐标系 下角标b:载体(body)坐标系 下文均省略上下标 矢量场与微分方程 对于导航问题我们用如下微分方程描述 X˙(t)=F(t,X)\dot X(t)

南柯一梦的博客 1612

DeepL Pro免费使用技巧与API调用优化方案

机器翻译技术通过神经网络模型实现跨语言语义转换,其核心价值在于保持专业术语准确性的同时实现自然语言流畅度。现代翻译工具如DeepL采用注意力机制等深度学习技术,在医疗、法律等专业领域展现出接近人工翻译的质量。针对API调用场景,开发者可通过请求模拟实现小批量自动化处理,而文档预处理和术语库优化则能显著提升免费额度使用效率。本文重点解析如何通过字符计算优化、临时接口调用等工程实践方法,在合规前提下最大化利用免费翻译资源。

weixin_29038303的博客 266

FATFS系统学习笔记——stm32学习

文件系统定义: 文件系统是为了存储和管理数据,而在存储介质(存储数据的载体如Flash芯片、SD卡等等)建立的一种组织结构(包括系统引导区、目录和文件); 文件系统的工作过程: 在使用文件系统前,要先对存储介质进行格式化。先擦除原来内容,在存储介质上新建一个文件分配表和目录, 以便于文件系统可以记录数据存储的状态信息,如物理地址、空间等。 使用文件系统时,数据都以文件的形式存储; 写入新文件时,先在目录中创建一个文件索引,它指示了文件存放的物理地址,再把数据存储到该地址中; 当需要读取数据时,可以从目录中找

weixin_43901499的博客 2085

Meta DINOv3实战指南:如何用7B参数ViT模型搞定图像分割与检测(附Hugging Face配置)

本文提供了Meta DINOv3模型的实战应用指南,重点介绍了如何利用这个7B参数的视觉Transformer模型进行图像分割与目标检测。通过详细的Hugging Face配置步骤、环境搭建、模型加载与推理优化,帮助开发者快速上手这一强大的自监督视觉模型,并高效应用于实际计算机视觉任务中。

s3t4u的博客 907

解密启动盘UD分区的技术原理 | FBinst 理论+实操手搓全能三分区启动盘

创建UD分区。

hOsdkD9Qz的博客 259

中移物联ML307C模组OPENCPU笔记2

本文介绍了如何编译和运行一个DEMO程序,以官方SDK为例。

weixin_43700831的博客 1888

Design Compiler时序约束实战:如何用set_clock_uncertainty解决时钟抖动问题?

本文深入探讨了在Design Compiler时序约束实战中,如何精准运用set_clock_uncertainty命令解决时钟抖动等非理想性问题。文章详细解析了该命令在时钟树综合前后的不同应用策略、建立时间与保持时间的差异化设置,并对比了其与set_clock_jitter的适用场景,旨在帮助数字IC设计工程师制定稳健的时序约束,为后端物理实现预留合理的安全裕量,从而高效达成时序收敛。

weixin_29196891的博客 303

嵌入式开发中文件列表生成的3种方法:从FatFs API到缓存优化

在嵌入式系统开发中,文件系统操作是基础且关键的技术环节,尤其在资源受限的MCU环境下。其核心原理是通过文件系统中间件(如FatFs)提供的标准API,实现对存储设备(如SD卡、SPI Flash)中目录结构的遍历与信息提取。掌握高效的文件列表生成技术,不仅能提升系统调试与维护效率,更是实现固件升级、日志管理、USB大容量存储等高级功能的工程基石。本文聚焦嵌入式场景,深入解析三种主流实现路径:一是直接调用FatFs等成熟库的API,快速可靠;二是结合轻量级缓存策略,平衡性能与资源消耗;三是浅析手动解析文件系统

weixin_29171087的博客 329

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: FAT文件系统原理(二)
下一篇: vmware softice
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值