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

news2024/7/6 18:21:45

文章目录

  • 简要分析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.coloradmin.cn/o/1711570.html

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

相关文章

柬埔寨语翻译通App,一款真正实现高棉语翻译、语音识别和中柬双语无障碍交流的应用程序。

柬埔寨语翻译通App,一款真正实现高棉语翻译、语音识别和中柬双语无障碍交流的应用程序。它不仅提供文字、语音、图片的翻译,还融入了柬埔寨文化元素,让你在每一次翻译中都能感受到柬埔寨的文化魅力。 这款App支持中文、高棉语双语互译&#x…

LeetCode //C - 143. Reorder List

143. Reorder List You are given the head of a singly linked-list. The list can be represented as: L0 → L1 → … → Ln - 1 → Ln Reorder the list to be on the following form: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … You may not modify the values i…

[图解]企业应用架构模式2024新译本讲解03-事务脚本+表数据入口

1 00:00:00,570 --> 00:00:06,290 这里先创建一个service的对象 2 00:00:07,000 --> 00:00:12,470 然后调用对象的方法、操作 3 00:00:12,480 --> 00:00:13,750 就是事务脚本 4 00:00:14,700 --> 00:00:15,900 然后参数是1 5 00:00:16,660 --> 00:00:19,490…

618有什么宠物空气净化器推荐?希喂FreAir Lite宠物空气净化器真实体验

一、宠物空气净化器的必要性 掉毛季又来了,猫咪的毛发满天飞,怎么办?我家里的猫咪一到换毛季就掉满地的毛发,尤其喜欢在家里奔跑打闹,结果整个房间都是毛。为了减少家里空气中的浮毛,你都做过哪些努力呢&a…

Shell编程用户注册及登录

需求: 用Shell编程完成用户的注册及登录 完成 注册用户 用户名首字母大写 密码需8个字符及以上且含“$”,“&”,“-”中的任意一个手机号需以139开头的11位号码邮箱需以数字开头的qq.com 2.检测重复注册 3.注册信息写入/etc/secfinfe 4.用户登录 5.检测是否存…

SQLI-labs-第二十七关和第二十七a关

目录 第二十七关 1、判断注入点 2、判断数据库 3、判断表名 第二十七a关 第二十七关 知识点:空格、select、union等过滤绕过 思路: 通过分析源码,我们可以知道对用户的输入进行过滤,对空格、select、union等进行了过滤&…

钡铼PLC集成BL121PO协议网关优化电子制造产线的生产效率

PLC转OPC UA协议转换网关BL121PO在电子制造产线中的优化应用,可以显著提高生产效率,促进生产线的智能化和信息化发展。本文将从以下几个方面进行阐述: 提高设备间通信效率:PLC转OPC UA协议转换网关BL121PO通过高效的协议转换&…

Docker-02-02 Docker离线下载安装与配置(linux)

一、Docker下载 官网下载地址:Index of linux/static/stable/x86_64/ (docker.com) 推荐下载最新的社区版: 二、将安装包上传至服务器并解压 将安装包上传至服务器的/usr/local目录并解压 cd /usr/local lstar -zxvf docker-18.06.3-ce.tgz三、将docker目录下的文件复制到…

ubuntu安全加固

知识背景&#xff1a; 项目背景&#xff1a; 常用命令&#xff1a; useradd: adduser: getent passwd: getent group: id username: adduser newname sudo: sudo userdel <username> sudo rm -rf /home/<username> userdel groupdel 修改shell为/bin…

防止自动化攻击的最佳实践

防止自动化攻击的最佳实践 在当今的网络安全环境中&#xff0c;保护用户账户免受自动化攻击已成为每个网站和应用程序的重要任务。攻击者可以利用多种不同类型的自动化攻击来尝试破坏用户账户。本文将详细介绍常见的攻击类型及其防御机制&#xff0c;帮助您更好地保护用户账户…

基于PHP+MySQL组合开发的720VR全景小程序源码系统 一键生成三维实景 前后端分离带网站的安装代码包以及搭建教程

系统概述 这款源码系统是专门为实现 720VR 全景展示而设计的。它结合了先进的技术和创新的理念&#xff0c;能够将真实场景以全景的形式呈现给用户&#xff0c;让用户仿佛身临其境。该系统采用 PHP 进行后端开发&#xff0c;MySQL 作为数据库管理系统&#xff0c;确保了系统的…

IC618 虚拟机 EDA Calibre2019 Hspice2018 Spectre19.1

虚拟机包含 CentOS 7.9 Cadence IC618 Calibre 2019 Hspice 2018 Spectre19.1 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1aMtPO2G5ad-x5BtIJjCDig?pwdxcii 提取码&#xff1a;xcii

K8s证书过期处理

问题描述 本地有一个1master2worker的k8s集群&#xff0c;今天启动VMware虚拟机之后发现api-server没有起来&#xff0c;docker一直退出&#xff0c;这个集群是使用kubeadm安装的。 于是kubectl logs查看了日志&#xff0c;发现证书过期了 解决方案&#xff1a; 查看证书 #…

希尔排序法

希尔排序为插入排序的优化&#xff0c;即将数组分组&#xff0c;将每一组进行插入排序&#xff0c;每一组排成有序后&#xff0c;最后整体就变有序了。 上面gap2&#xff0c;即5&#xff0c;14&#xff0c;18&#xff0c;27&#xff0c;68为一组&#xff1b;13&#xff0c;20&a…

FaceChain-FACT:开源10秒写真生成,复用海量LoRa风格,基模友好型写真应用

github开源地址&#xff1a;https://github.com/modelscope/facechain/tree/main/facechain_adapter 魔搭创空间应用体验&#xff1a;魔搭社区 一、效果演示 FaceChain FACT的代码和模型目前已经在github和modelscope创空间上同步开源。FaceChain FACT具有简单的交互式界面设…

Linux网络编程:应用层协议|HTTP

前言&#xff1a; 我们知道OSI模型上层分为应用层、会话层和表示层&#xff0c;我们接下来要讲的是主流的应用层协议HTTP&#xff0c;为什么需要这个协议呢&#xff0c;因为在应用层由于操作系统的不同、开发人员使用的语言类型不同&#xff0c;当我们在传输结构化数据时&…

Oracle dblink 发现Network 等待事件的分析 enq: KO - fast object checkpoint

所有的sql 通过dblink 查询全部等待中&#xff0c; 同一个SQL 20多个session 在跑&#xff0c;等待事件network&#xff0c;可能怀疑是不是网络断开了&#xff0c;导致没有返回 执行sql 如下&#xff1a; BEGIN Xdblink ; END; 去到dblink 所在的db&#xff0c;发现20多个sql在…

Unity SetParent第二个参数worldPositionStays的意义

初学Unity的小知识&#xff1a; 改变对象的父级有三种调用方式&#xff0c;如下&#xff1a; transMe.SetParent(transParent,true); transMe.SetParent(transParent,false); transMe.parent transParent;具体有什么区别呢&#xff0c;这里写一个测试例子来详细说明&#xff…

ROS2 Topics和Services

本文主要介绍ROS的Topics概念&#xff0c;如何创建Publisher和Subscriber&#xff0c;通过Topic在ROS程序间通信&#xff1b;介绍ROS的Services概念&#xff0c;如何创建Client和Server并建立通信。 更多内容&#xff0c;访问专栏目录获取实时更新。 ROS Topics Topics可以被视…

SQL数据库多层嵌套 json转sql建表语句,SQL数据库里数组里对象数据怎么创建

1. uniapp sqlite 一个数组包含对象嵌套对象通过主外键方式插入数据库&#xff1a; // 假设有一个对象数组&#xff0c;对象中包含嵌套对象 const objectsArray [{parentObject: {id: 1,name: Parent 1,// 其他父对象属性},childObject: {id: 11,parentId: 1,name: Child 1 o…