操作系统—简要分析FAT文件系统

文章目录

  • 简要分析FAT文件系统
    • 1.FAT的起源与发展历史
    • 2.FAT的基本结构与目录管理机制
      • (1).基本结构
      • (2).文件分配表
      • (3).根目录区
      • (4).数据区
    • 3.优点与缺点
    • 4.改进与替代方案
      • (1).exFAT
      • (2).ext2/3/4
      • (3).NTFS
    • 小结
    • 参考文献

简要分析FAT文件系统

1.FAT的起源与发展历史

  为了更好地管理磁盘,比尔盖茨发明了FAT文件系统,并且在后续的86-DOS中采用。

  最初使用的FAT现在也称为FAT12,它的每一个FAT条目只有12位来表示,因此FAT12最多只能管理4096个簇(也被成为块),假设每个簇的大小为4KB,则这个文件系统支持的最大存储容量则为16MB。

  从这里也可以看出,FAT12能管理的存储容量的确非常小,因此在1984年微软将FAT条目扩展到了16位,因此此时的FAT16可以管理65536个簇,并且簇的大小可以达到32KB,这样支持的最大存储容量就有了明显增长。

  当然,为了满足后续更大容量的需求,FAT条目又被扩展到了32位,形成了目前还有被少量使用的FAT32文件系统,FAT32只用了32位中的28位来标识簇,因此它可以管理最多268435438个簇,并且允许磁盘的容量达到8TB。

  当然,因为FAT的一些固有缺陷,后续微软还推出了exFAT格式,这就是后话了。

2.FAT的基本结构与目录管理机制

(1).基本结构

  FAT文件系统由引导扇区、保留区域、文件分配表、根目录区和数据区组成,它的一个基本架构是这样的:
在这里插入图片描述
  为什么要把引导扇区留在最开始的位置呢,其实很好理解,首先简单来说,计算机的启动流程是这样的:

  • 加电自检:按下电源按钮后,电源开始送电,BIOS或UEFI开始进行硬件初始化和自检,这一步会尽可能保证所有的关键硬件正常工作
  • BIOS/UEFI初始化:接下来会将BIOS或UEFI的固件程序从主板上的ROM中取出,加载到内存中开始运行,并且进行一些相应的启动设置检查等操作
  • 加载Bootloader:BIOS在这一步会依照已经设定好的启动顺序,尝试从启动设备的第一个扇区位置读取Bootloader并加载到内存中开始执行,从此,Bootloader程序会接管计算机的控制权
  • 操作系统加载:如果我们使用的是类似Linux的操作系统,那可能还会有GRUB这样的第二阶段Bootloader,这里不再赘述,在这一步,Bootloader会找到磁盘上的操作系统内核,加载到内存中开始执行,之后就是操作系统内核的正常初始化,由此,整个操作系统就顺利启动了

  所以说了这么多,为什么要把引导扇区放在最前面呢?其实已经很明确了,因为文件系统是一个逻辑上的架构,像是我们对内存抽象出的虚拟存储系统一样,文件系统也是为了更好地管理磁盘而抽象出的架构,这就带来一个问题:文件系统的相应代码应该是在操作系统启动的时候才能被加载的,假设我们将Bootloader的代码放在一个需要通过文件系统定位的位置,那BIOS在这一步就可能找不到Bootloader的位置了,所以,引导扇区是需要被放在最靠前的位置的,这样可以保证即便没有文件系统,操作系统也可以被正常加载,于是乎就有了0柱面,0磁头,1扇区,512字节的最后两个字节一定是0x55AA的传说。

(2).文件分配表

  之后比较重要的就是FAT(文件分配表)了,FAT是一种基于链式存储的文件系统,因此它会以链表的形式记录簇的一些信息。
  当然,磁盘中的FAT不会那么轻松的让簇记录在磁盘里乱跳(因为文件系统自己没有一个更底层的文件系统负责兜底,所以能更加有序的存储总是更好的),因此FAT记录区采用了数组模拟链表的方式实现,在这里就简单用FAT16举例,对于每一个簇,都有一个唯一的编号,因此数组的下标就是簇的编号,而数组中存储的条目就是对应条目的值,它的数值有几种选择:

  • 0x0000:空闲簇,代表当前簇是可用的
  • 0x0001:保留簇
  • 0x0002-0xFFEF:指向下一个簇,也就是模拟链表的部分
  • 0xFFF0-0xFFF6:保留值
  • 0xFFF7:坏簇
  • 0xFFF8-0xFFFF:文件的最后一个簇,也就是链表尾

  所以FAT的基本思想其实相当简单,对于一个文件存储,需要分配对应大小的簇,而采取链式管理的FAT只需要记录从第一个簇开始的整条链的信息就可以完成管理了,这是一个很简单的思路。

(3).根目录区

  FAT12和FAT16保留了一个专门的区域用来保存根目录下每一个文件及目录的基本信息,而FAT32将目录记录保存在数据区,可以进行动态扩展。
  这里仍然以FAT16为例,每个目录项用32个字节保存:

  • 文件名(8字节):文件名称
  • 扩展名(3字节):扩展名,如TXT
  • 文件属性(1字节):例如只读、隐藏、系统文件之类的属性信息
  • 创建时间(2字节):文件被创建的时间
  • 修改时间(2字节):文件上次被已修改的时间
  • 起始簇号(2字节):与FAT16的16位簇号匹配,因为是链表,所以只需要保存链表头的簇号就可以找到整个文件
  • 文件大小(4字节):整个文件的大小,以字节为单位

  还有一些剩余的字节会用来保存注入最后访问日期等其他信息,最终为32字节,在这里就可以完成文件查找的所有操作了,当你打算访问下面这个文件的时候:

/DirA/DirB/a.txt

  首先从根目录开始,遍历根目录的目录项,找到DirA的目录项,然后读取DirA的簇号,接着开始去数据区取出DirA对应的数据,之后再去DirA的目录项中找到DirB的簇,之后再仿照读取DirA的方式,在DirB的目录项中找到a.txt的簇号,之后再查阅FAT表就可以完成整个文件访问的操作了。

  当然,还是要提一嘴,FAT32当中没有根目录区,根目录和一般目录项一起存在数据区,根目录的位置由最前面的保留区的一些字段决定。

(4).数据区

  数据区就是实际文件和目录数据存储的位置了,这里会占据整个卷的大部分空间,在此就不细究了。

3.优点与缺点

  先说优点,FAT的优点在于它的实现方式真的很简单(连我都可以轻松理解),它的基本框架就是:通过划分固定大小的簇+链式管理来完成所有数据的管理,目录一定从根目录开始,将下一级的目录和文件统统视为文件,每一个文件都具备一个目录项,目录项保存了文件的基本信息以及簇链表的头节点,簇链表由FAT表维护,每次可以根据查表来找到整个文件用到的所有簇,由此,就完成了整个磁盘的管理

  缺点当然也是显而易见,通过链式管理+固定大小分簇的方式的确可以避免产生外部碎片,但是随着磁盘逐渐使用,磁盘内部会产生越来越多的碎片,可利用的簇变得越来越零散,此时对于一个文件的读取就可能需要多次磁盘寻道,这可能会严重影响性能。

  二来是,FAT的可扩展性比较差,即便是FAT32,一个文件最大也只能为4GB,在目前看来这样的大小已经跟不上现在的单文件大小了,中大型人工智能模型的一个权重文件可能就有10~20GB,FAT完全无法支持这样的工作负载。

  三来也是最重要的一个问题:可靠性,能够让数据存下来当然是文件系统最重要的工作,但是存储下来能不能保证数据安全也是非常重要的,FAT仅有一个冗余FAT表副本的机制来提高容错率,但是假设所有FAT表都发生损坏,那就几乎无法回复数据了,目前比较成熟的NTFS文件系统就采用了日志记录的方式来保障安全,即便在断电或是系统崩溃的时候也能保障数据不发生丢失或损坏。

4.改进与替代方案

(1).exFAT

  为了让FAT支持更大的单一文件,微软推出了exFAT作为FAT32的取代方案,它具备更大的文件和分区支持,单个文件最大尺寸理论上为16EB,而一个分区最大的尺寸理论上可以达到128PB,但因为这个方案仍然只是在FAT的基础上进行的修改,安全性方面exFAT还是要逊于NTFS等文件系统。

  不过exFAT具有非常强的跨平台优势,exFAT被Windows、macOS和Linux三个平台支持,因此如果你有跨平台文件存储的需求,使用exFAT或许是一个不错的选择。

(2).ext2/3/4

  ext2是1993年Linux采取的默认文件系统,而ext3,ext4则是在ext2的基础上进行的迭代,最初的ext2没有日志功能,单个文件最大大小为2TB,最大分区大小为32TB。

  而ext3在ext2的基础上引入了日志系统,增强了对于数据安全的保障,并且完全兼容ext2,可以几乎无缝升级。

  而ext4则是目前Linux主要采用的文件系统,它将文件和分区的最大大小扩展至16TB以及1EB,并且通过一些方式减少了碎片化的问题。

(3).NTFS

  NTFS是微软为了NT架构的新系统准备的(我发现上个世纪的科技企业总是喜欢起一些非常简单的名字的缩写,比如NT,其实是New Technology的缩写),所以NTFS也就是NT File System的缩写了。
  1993年微软将NTFS引入Windows NT 3.1,从此成为了Windows的默认文件系统,它支持了以下新特性:

  • 日志功能:支持日志功能,能够更好地保障数据完整性,并且能够在数据出现损坏之后更快地恢复
  • 文件权限:支持更加复杂的目录和文件权限管理
  • 压缩和加密:就像我们在Windows对某个卷右键一样,总是能够看到压缩选项,NTFS原生支持对于分区的压缩

  NTFS还将单个文件和分区的最大尺寸提高到了16EB(理论值),相较于FAT有了巨大的优势。

  不过NTFS存在专利问题,因此基本上只有Windows能够原生支持,诸如Linux和macOS对于NTFS的支持都是基于逆向工程得到的驱动,它们的稳定性可能不如微软本身实现的驱动,不过这么做可以规避掉NTFS的专利问题,一个简单的例子,假设你有一个被格式化为NTFS文件系统的U盘以及一台Mac电脑,在没有安装一些第三方软件的情况下,Mac会一直提示这个U盘是只读的,你不能通过macOS向这个U盘内写入任何数据,当然通过一些第三方软件就可以实现这个过程了(这可能是另外的价格)。

小结

  所以FAT的确是一个非常简单的文件系统,通过一些非常简单的链式管理的方式完成了整个磁盘的管理,但是它的链式存储导致了碎片化等问题,没有日志系统导致其存在数据安全问题,因此后续出现了很多替代方案,如NTFS,ext4等等,当然这个世界上还存在非常多其他的文件系统,比如微软前些年推出的ReFS,苹果的HFSAPFS,它们都存在一些非常新的特性,旨在更好地解决目前文件系统存在的问题。

参考文献

  • 维基百科—文件分配表
  • 知乎—FAT12文件系统介绍
  • Microsoft Learn—FAT、HPFS和NTFS文件系统概述
  • 知乎—FATFS文件系统详解
  • 知乎—深入内核-文件系统的原理-EXT2/3/4
  • CSDN-FATFS基本入门教程(3)- FAT文件系统简介

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/18421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​LabVIEW超声波检测

LabVIEW超声波检测 在现代工业生产和科学研究中,超声检测技术因其无损性、高效率和可靠性而被广泛应用于材料和结构的缺陷检测。然而,传统的超声检测仪器往往依赖于操作者的经验和技能,其检测过程不够智能化,且检测结果的解读具有…

Milvus的内存索引

简介: 这篇文章主要介绍milvus支持的各种内存索引,以及它们最适用的场景,还有用户为了获得更好的搜索性能可以配置的参数。 索引是有效组织数据的过程,它的主要角色是在大的数据集中显著的加速耗时的查询从而有效的进行相似搜索…

HTML静态网页成品作业(HTML+CSS)——动漫熊出没介绍网页(3个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有3个页面。 二、作品演示 三、代…

重构2:重构的原则

最近在看重构2:改善既有代码的设计这本书,对于代码重构指导非常有帮助,然后也是做个笔记记录下,以下是我阅读本书的前两章的时候整理的思维导图:

Python-3.12.0文档解读-内置函数ord()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 概述 语法 参数 返回值 示例 注意事项 应用场景 记忆策略 常用场景…

【测试SQLite】测试SQLite支持的SQL语句分类

测试SQLite支持的SQL语句分类 为了全面测试SQLite支持的SQL语句,需要设计一个包含多种类型的表结构,并编写各种SQL语句来测试这些功能。目前按照以下分类进行测试: 数据定义语言(DDL)数据操作语言(DML&am…

haproxy+keepalived搭建jeesns论坛

集群实现 软件层分为负载均衡层 Web 层、 数据库和共享存储层。 数据库: ​ keepalivedhaproxypxc(MariaDB Galera Cluster) 共享存储: ​ ceph分布式集群,cephfs web层: ​ tomcat 负载均衡&#x…

离线deb安装下载及安装实例

1、使用apt download下载deb安装包(不包括依赖包) 1.1仅下载deb安装包 sudo apt download lrzsz 1.2安装载deb安装包 sudo dpkg -i lrzsz_0.12.21-10kylin0k2_arm64.deb 注:dpkg安装deb包,部分存在depends关系,需要使用apt-get -f instal…

Linux 删除SSH密钥(id_ed25519),重新生成

在Linux系统中,重新生成SSH密钥(比如id_ed25519)的过程包括删除现有的密钥文件并生成一个新的。 以下是具体的步骤: 0. 查看下是否有密钥 1. 删除原有的id_ed25519密钥 默认情况下,SSH密钥存储在用户的主目录下的 .…

想让企业“火力全开”?找六西格玛培训公司就对了!

在如今的市场环境中,企业面临着不断变化的挑战和无限的可能。要在这场竞争中独领风骚,实现稳健的增长,六西格玛作为一种以数据驱动的管理理论,提供了实际可行的解决方案。六西格玛培训公司,作为这一领域的专家&#xf…

身为UI设计老鸟,不学点3D,好像要被潮流抛弃啦,卷起来吧。

当前3D原则在UI设计中运用的越来越多,在UI设计中,使用3D元素可以为界面带来以下几个价值: 增强视觉冲击力:3D元素可以通过立体感和逼真的效果,为界面增添视觉冲击力,使得设计更加生动、吸引人,并…

AI PC 的曙光:微软大胆出击与苹果竞争

AI PC 的曙光:微软大胆出击与苹果竞争 AI PC 的曙光:微软大胆出击与苹果竞争 概述 微软已正式进入 AI PC 时代,并且毫不避讳地直接向苹果的 MacBook 发起攻击。随着代号为“Copilot”的笔记本电脑的推出,微软准备彻底改变我们与…

AI大模型如何“开窍”?算法、数据与架构的三重奏

一、算法创新 1. 探索新的学习范式 自监督学习:利用未标注数据让模型自我学习,提高模型的泛化能力。元学习:让模型学会如何学习,以便在不同任务之间快速迁移。强化学习:通过试错与奖励机制,使模型在与环境…

012、哈希_应用场景

图为关系型数据表记录的两条用户信息,用户的属性作为表的列,每条用户信息作为行。 如果将其用哈希类型存储,如图所示。 相比于使用字符串序列化缓存用户信息,哈希类型变得更加直观,并且在更新操作上会更加便捷。可以将每个用户的id定义为键后缀,多对field-value对应每…

Springboot 开发 -- 集成 JWT 构建安全的API接口服务

一、JWT简介 JSON Web Token(JWT)是一种基于JSON的开放标准(RFC 7519),用于在各方之间以JSON对象的形式安全地传输信息。JWT可以被签名,确保信息在传输过程中的完整性和可信度。JWT通常用于身份验证和信息…

12-常用类

1. 包装类 针对八种基本数据类型封装的相应的引用类型。 有了类的特点,就可以调用类中的方法。(为什么要封装) 基本数据类型包装类booleanBooleanchar CharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDouble 1.1 …

C# Sdcb.PaddleInference 中文分词、词性标注

C# Sdcb.PaddleInference 中文分词、词性标注 目录 效果 项目 代码 下载 参考 效果 项目 代码 using Sdcb.PaddleNLP.Lac; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Windows.Forms; namespace C__Sdcb.Pad…

kafka-消费者组-点对点测试

文章目录 1、点对点测试1.1、获取 kafka-consumer-groups.sh 的帮助信息1.2、列出所有的 消费者组1.3、创建消费者1并指定组 my_group11.4、创建消费者2并指定组 my_group11.5、创建消费者3并指定组 my_group11.6、创建生产者发送消息到 my_topic1 主题1.6.1、发送第一条消息ro…

华为WLAN无线组网技术与解决方案

WLAN无线组网技术与解决方案 网络拓扑采用AP和AC旁挂式无线组网 配置思路: 1.让AP上线 1.1,使得AP能够获得IP地址 配置步骤: 1.把AC当作一个一个有管理功能的三层交换机 sys Enter system view, return user view with CtrlZ. [AC6605]vlan …

【Qt】Qt框架文件处理精要:API解析与应用实例:QFile

文章目录 前言:1. Qt 文件概述2. 输入输出设备类3. 文件读写类3.1. 打开open3.2. 读read / readline/ readAll3.3. 写write3.4. 关闭close 4. 读写文件示例5. 文件件和目录信息类总结: 前言: 在现代软件开发中,文件操作是应用程序…