操作系统—简要分析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文件系统简介

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

买了份KFC,意外理解了5种 IO 模型

买了份KFC,意外理解了5种 IO 模型 前言一、基本概念1.1 简单介绍几个系统调用函数1.2 同步&异步1.3 阻塞&非阻塞 二、阻塞IO模型三、非阻塞IO模型四、IO多路复用模型五、信号驱动IO模型六、异步IO模型七、Java中的BIO,NIO,AIO7.1 BIO…

​LabVIEW超声波检测

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

考研经验总结——复试上岸(附通信原理)

上岸啦,一志愿拟录取,初试第5、复试4,总成绩第4 文章目录 一、复试流程二、注意事项三、简历模板3.1 基本信息3.2 报考情况3.3 校内实践3.4 荣誉奖励3.5 项目经验3.6 自我介绍 四、通信原理五、最后的总结 一、复试流程 1、 复试流程 准备复…

【机器学习聚类算法实战-5】机器学习聚类算法之DBSCAN聚类、K均值聚类算法、分层聚类和不同度量的聚集聚类实例分析

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

STM32建立工程问题汇总

老版本MDK,例如MDK4 工程内容如下: User文件夹中存放main.c文件,用户中断服务函数(stm32f1xx.it.c),用户配置文件(stm32f1xx_hal_conf.h)等用户程序文件,或者mdk启动程序…

彩光赋能中国智造 极简光3.X助力“数智”转型

蒸汽时代、电气时代、信息时代三大工业革命后 互联网和智能制造主导的工业4.0时代来临 大数据、云计算、人工智能等新兴技术 对企业园区的网络架构、负载能力等 提出了新要求,也使得光纤较于传统铜缆 在距离、性能、延时上的优势日益凸显 基于此 围绕未来园区网建设的企…

VB.net 进行CAD二次开发(二)

利用参考文献2,添加面板 执行treeControl New UCTreeView()时报一个错误: 用户代码未处理 System.ArgumentException HResult-2147024809 Message控件不支持透明的背景色。 SourceSystem.Windows.Forms StackTrace: 在 System.Windows…

界面组件Kendo UI for Angular教程 - 构建强大的PDF阅读器(二)

如今当用户需要处理PDF文件时,通常不得不下载应用程序或者浏览器插件,控制用户如何与PDF交互并不是一件容易的事。如果我们提供PDF作为内容,用户可以下载它并使用浏览器或PDF本身提供的控件进行交互。然而,一些企业可能希望控制用…

mysql去除重复数据

需求描述 doc表有很多重复的title,想去除掉重复的记录 表结构 CREATE TABLE doc (id INT PRIMARY KEY,title VARCHAR(255),content TEXT );去重SQL -- 创建临时表 CREATE TEMPORARY TABLE temp_doc AS SELECT * FROM doc WHERE 10;-- 插入唯一的记录(每个title最…

idea中快速找到当前git地址

idea中快速找到当前git地址 然后双击就可以看到地址了

哪有异地组网的工具?

不同地区的电脑与电脑、设备与设备、电脑与设备之间的信息远程通信,一直是企业和个人面临的难题。通过使用天联组网的解决方案,这个问题将迎刃而解。 天联组网解决方案 天联组网是一种可以实现不同地区之间电脑、设备及其之间的信息远程通信的解决方案。…

QT-demo:0轴分布图表

版本:5.9 第一种: 使用 PyQt5 和 Matplotlib 库 安装所需的库: pip install PyQt5 matplotlib创建和显示图表: import sys import numpy as np import matplotlib.pyplot as plt from PyQt5.QtWidgets import QApplication, QMainWindow f…

关于在子线程中获取不到HttpServletRequest对象的问题

这篇文章主要分享一下项目里遇到的获取request对象为null的问题,具体是在登录的时候触发的邮箱提醒,获取客户端ip地址,然后通过ip地址定位获取定位信息,从而提示账号在哪里登录。 但是登录却发现获取request对象的时候报错了。 具…

香橙派OrangePI AiPro测评

实物 为AI而生 打开盒子 截图电源开机进入 作为一个AI产品,必须有一个人机交互的界面才行。大家都在跑算法,于是我就开始进行整理着手整理搭建Qt的环境。 1、下载源码 wget https://download.qt.io/archive/qt/5.12/5.12.12/single/qt-everywhere-src-5.12.12.tar.xz待…

【哈希】闭散列的线性探测和开散列的哈希桶解决哈希冲突(C++两种方法模拟实现哈希表)(2)

🎉博主首页: 有趣的中国人 🎉专栏首页: C进阶 🎉其它专栏: C初阶 | Linux | 初阶数据结构 小伙伴们大家好,本片文章将会讲解 哈希函数与哈希 之 哈希桶解决哈希冲突 的相关内容。 如果看到最后…

使用 Python 和 jieba 实现中文文本中的人名和公司名提取

在处理中文文本时,经常需要从中提取出人名和公司名称。比如在文本分析、信息提取和自然语言处理(NLP)等领域,这些任务都非常常见。本文将介绍如何使用wxPython创建一个简单的桌面应用程序,从一段中文长文中提取人名和公…

150.二叉树:二叉树的后序遍历(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr, right(nullptr) {}* Tree…

电脑下载了caj却打不开文献?使用CAJ阅读器,支持caj转word

如果电脑下载了CAJ文件却打不开文献,这通常是因为没有安装合适的阅读器。CAJ文件是中国知网的一种专用全文阅读格式,需要使用专门的CAJ阅读器(CAJViewer)来打开和阅读。 首先:使用CAJ阅读器 请确保你已经正确安装了CA…

【机器学习】解锁AI密码:神经网络算法详解与前沿探索

👀传送门👀 🔍引言🍀神经网络的基本原理🚀神经网络的结构📕神经网络的训练过程🚆神经网络的应用实例💖未来发展趋势💖结语 🔍引言 随着人工智能技术的飞速发…

【python】生成对抗网络(GAN):理论与PlugLink实践

【python】生成对抗网络(GAN):理论与PlugLink实践 本文将介绍一种流行的图像生成技术——生成对抗网络(GAN),并结合PlugLink平台,展示如何将这一技术应用于实际项目中。简单来说,它…