瞥一眼 FAT32,手撸文件系统

FAT 32

FAT(File Allocation Table),最早在DOS v1.0 中被引入,是一种极简的文件系统,占用空间,是目前最常见的文件系统之一。

发展历程

FATX系列文件系统的不同版本都是针对不同的文件存储介质(storage media)规模设计的。

FAT12FAT 12 是专为软盘设计的,最大可管理 16 兆字节的大小,因为它使用 12 位来寻址磁盘组。

FAT16FAT 16 是为早期硬盘设计的,可处理的最大簇大小为 64K * 簇大小。硬盘越大,簇的大小就越大,这会导致磁盘上出现大量的 “闲置空间”(slack space)。

FAT32FAT 32 由 Windows95-B 和 Windows98 引入。FAT32 解决了 FAT 的一些问题。不再有最大 64K 的簇!虽然 FAT32 每个 FAT 条目使用 32 位,但实际上只有最下面的 28 位用于寻址磁盘上的磁簇(最上面的 4 位为保留位)。由于每个 FAT 条目有 28 位,文件系统在一个分区中最多可寻址约 2.7 亿个群集。这使得超大硬盘仍能保持相当小的簇大小,从而减少文件之间的空闲空间。

ExFATExFAT 是用于 SDXC 卡的文件系统,由微软创建。它是 FAT32,每个 FAT 条目实际上有 32 位,能指示文件在磁盘上是完全连续的(允许你跳过读取 FAT),还有一些更高级的功能和完全重新设计的文件输入系统。

VFATVFAT 是 FAT 文件系统的扩展,可以使用长文件名(最多 255 个字符)。它由 Windows 95 首次引入,使用了一种 “笨办法”,即用 "卷标 "属性标记长文件名,然后将文件名以 11 个字节的块存储在顺序目录条目中。

实现细节

FAT 文件系统将存储介质视为扁平的磁簇阵列。如果物理介质不是以扇区的平面列表来处理数据(如老式硬盘和软盘),那么在将簇号发送到磁盘之前就需要进行转换。

存储介质分为三个基本区域:

  • 启动记录 (The boot record)
  • 文件分配表 (FAT,The File Allocation Table)
  • 目录和数据区(The directory and data area)

如果物理介质不是以扇区的平面列表来处理数据

这段话的意思是,如果物理介质(例如老式硬盘和软盘)不是将数据作为扇区的线性列表来寻址的,那么在将簇号发送到磁盘之前,需要对簇号进行转换。

在现代硬盘中,数据通常被组织成线性的扇区列表,每个扇区都有一个唯一的扇区号。但是,在一些老式的硬盘和软盘中,数据可能被组织成不同的方式,例如使用簇(cluster)的概念来组织数据。簇是一组相邻的扇区,通常是2个或4个扇区的大小。在这种情况下,每个簇都有一个唯一的簇号,而不是每个扇区都有一个唯一的扇区号。这种组织方式可以提高磁盘的存储效率,但也需要进行簇号到扇区号的转换,以便正确地访问磁盘上的数据。

因此,如果文件系统使用簇号来寻址数据,而不是扇区号,那么在将簇号发送到磁盘之前,需要将簇号转换为对应的扇区号。这个过程称为簇号到扇区号的转换。这个转换过程通常由文件系统驱动程序来完成,以确保文件系统能够正确地访问磁盘上的数据。

Boot Record

“The boot record”(引导记录)是指存储在磁盘的第一个扇区的特殊区域。它也被称为引导扇区(boot sector)或主引导记录(master boot record,MBR)。

存储在磁盘的第一个扇区的特殊区域

指的是启动记录占一个扇区,始终位于 "分区 "的逻辑零号扇区。如果介质没有分区,那么这就是介质的起始位置。这是计算机加载时最容易找到的分区扇区。

引导记录是一个重要的数据结构,它包含了启动计算机所需的关键信息。当计算机启动时,BIOS(基本输入/输出系统)会读取磁盘的引导记录,并执行其中的引导代码。这段引导代码负责加载操作系统的核心部分,从而完成系统的启动过程。

引导记录通常包含以下内容:

  • 引导代码:这是一段特定的机器代码,用于初始化计算机硬件、加载操作系统的核心部分,并将控制权转交给操作系统。

  • 分区表:引导记录还包含一个分区表,用于描述磁盘上的分区布局。分区表记录了每个分区的起始位置、大小和文件系统类型等信息。

  • 引导标志:引导记录中还包含一个引导标志,用于指示该扇区是否为引导扇区。

File Allocation Table

文件分配表 (FAT) 是存储在存储介质上的一个表,用于显示磁盘上所有数据集群的状态和位置。它可以被视为磁盘的 “目录”。簇可能可供使用,可能被操作系统保留,可能因磁盘上的坏扇区而不可用,也可能被文件使用。文件的簇不一定在磁盘上紧挨在一起。事实上,它们很可能分散在磁盘的各个角落。FAT 允许操作系统跟踪文件中的簇 “链”。

FAT 32 使用 28 位来寻址磁盘上的群集。最高 4 位为保留位。exFAT 使用完整的 32 位来编码扇区号。

unsigned char FAT_table[sector_size];
unsigned int fat_offset = active_cluster * 4;
unsigned int fat_sector = first_fat_sector + (fat_offset / sector_size);
unsigned int ent_offset = fat_offset % sector_size;//at this point you need to read from sector "fat_sector" on the disk into "FAT_table".//remember to ignore the high 4 bits.
unsigned int table_value = *(unsigned int*)&FAT_table[ent_offset];
if (fat32) table_value &= 0x0FFFFFFF;//the variable "table_value" now has the information you need about the next cluster in the chain

如果 "table_value "大于或等于 (>=) 0x0FFFFFF8(或 exFAT 的 0xFFFFFFF8),则链中不再有任何簇。这意味着整个文件已被读取。如果 "table_value "等于(==)0x0FFFFFF7(或 exFAT 为 0xFFFFFFF7),则该簇被标记为 "坏 "簇。坏 "簇容易出错,应避免使用。如果 "table_value "不属于上述情况,那么它就是文件中下一个簇的簇号。

索引 0 和 1 下的条目被保留。保留第 0 个条目是因为索引 0 被用作其他条目的值,表示给定的簇是空闲的。第 0 个条目必须保留 BPB_Media 字段低 8 位的值,其余位必须置 0。例如,如果 BPB_Media 为 0xF8,则第 0 个条目应为 0xFFFFFFF8。第一个条目是为将来保留的,其值必须为 0xFFFFFFFF。

Programming Guide

读取引导扇区

引导扇区始终位于逻辑扇区编号 0 处。你可以将引导扇区读入一个数组并访问其中的成员,也可以将其读入一个结构并通过结构访问。无论哪种方式,引导扇区中的值都需要随时可用,这样才能在 FAT 文件系统中做很多事情。


typedef struct fat_extBS_32
{//extended fat32 stuffunsigned int		table_size_32;unsigned short		extended_flags;unsigned short		fat_version;unsigned int		root_cluster;unsigned short		fat_info;unsigned short		backup_BS_sector;unsigned char 		reserved_0[12];unsigned char		drive_number;unsigned char 		reserved_1;unsigned char		boot_signature;unsigned int 		volume_id;unsigned char		volume_label[11];unsigned char		fat_type_label[8];}__attribute__((packed)) fat_extBS_32_t;typedef struct fat_extBS_16
{//extended fat12 and fat16 stuffunsigned char		bios_drive_num;unsigned char		reserved1;unsigned char		boot_signature;unsigned int		volume_id;unsigned char		volume_label[11];unsigned char		fat_type_label[8];}__attribute__((packed)) fat_extBS_16_t;typedef struct fat_BS
{unsigned char 		bootjmp[3];unsigned char 		oem_name[8];unsigned short 	        bytes_per_sector;unsigned char		sectors_per_cluster;unsigned short		reserved_sector_count;unsigned char		table_count;unsigned short		root_entry_count;unsigned short		total_sectors_16;unsigned char		media_type;unsigned short		table_size_16;unsigned short		sectors_per_track;unsigned short		head_side_count;unsigned int 		hidden_sector_count;unsigned int 		total_sectors_32;//this will be cast to it's specific type once the driver actually knows what type of FAT this is.unsigned char		extended_section[54];}__attribute__((packed)) fat_BS_t;

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

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

相关文章

Fisher信息理论与应用

一、概念介绍 Fisher信息量,是一次观测值所能提供的关于未知参数θ的信息量期望值的一种度量。 Fisher信息矩阵,是用利用最大似然函数估计来计算方差矩阵,表示随机变量的一个样本所能提供的关于状态参数在某种意义下的平均信息量。 Fisher…

node.js express路由和中间件

目录 路由 解释 使用方式 中间件 解释 使用方式 中间件类型 路由注册和中间件注册 代码 app全局路由接口请求以及代码解析 示例1 示例2 示例3 示例4 中间件req继承 嵌套子路由 解释 代码 示例1 路由 解释 在 Express 中,路由(Route&…

【Qt开发流程】之事件系统3:键盘事件

序章 以下链接是拖放事件介绍和使用示例: 【Qt开发流程】之拖放操作1:介绍链接: https://blog.csdn.net/MrHHHHHH/article/details/134626484 【Qt开发流程】之拖放操作2:使用链接: https://blog.csdn.net/MrHHHHHH/article/details/134632006 以下链接是事件系统…

百度智能云推出“千帆AI原生应用开发工作台” 助力开发者创新

在这个智能互联的世界,每一次技术的飞跃都预示着无限可能。你是否曾梦想,一款产品能够打破创新的边界,让开发不再是高门槛的技术挑战?12月20日,百度云智大会智算大会将为你揭开这幕神秘面纱——“千帆AI原生应用开发工…

orvibo旗下的VS30ZW网关分析之一

概述 从官网的APP支持的智能中枢来看,一共就两种大类: MixPad系列和网关系列 排除MixPad带屏网关外,剩余的设备如下图: 目前在市场上这四种网关已经下市,官方已经宣布停产。所以市场上流通的也几乎绝迹。 从闲鱼市场上可以淘到几个,拿来分析一下,这里我手头有如下的两…

配置typroa上传图片到gitee

在typora这个位置下载插件 在picgo.exe文件夹下输入cmd 打开命令行输入如下命令安装相关插件 .\picgo install gitee-uploader .\picgo install super-prefix 之后按照官方文档更改相关配置 官方文档参考 https://picgo.github.io/PicGo-Core-Doc 博客参考:…

抑郁症中西医治疗对比?

抑郁症是一种常见的心理障碍,治疗方法包括中医和西医两种。下面就抑郁症中西医治疗进行对比: 治疗方法:中医治疗抑郁症强调整体观念和辨证论治,通过调理身体各部分的功能,达到治疗抑郁症的目的。中医治疗抑郁症多采用天…

矩阵的条件数及病态方程组的处理

对 A x b Axb Axb,如果A或者b有轻微的变动,会使得求解出的 x x x发生巨变,这种矩阵就是病态的 A x b Axb Axb 真实情况 A ( Δ x x ) Δ b b A(\Delta xx)\Delta bb A(Δxx)Δbb 代入误差的扰动情况 Δ x A − 1 Δ b \Delta xA^{-1}\Delta b ΔxA−1Δb 取范数后有 ∣…

人体姿态估计算法

人体姿态估计算法 1 什么是人体姿态估计2 基于经典传统和基于深度学习的方法2.1 基于经典传统的人体姿态估计算法2.2 基于深度学习的人体姿态估计算法OpenPoseAlphaPose (RMPE) 3 算法应用4 Paper 人体姿态估计在现实中的应用场景很丰富,如下 动作捕捉:三…

Android String.xml 设置加粗字体/修改字体颜色/动态设置修改文案

之前经常使用Spannable 这次主要在String.xml使用&#xff1a;<![CDATA[和]]> 效果&#xff1a; <resources><string name"str_bianse"><![CDATA[变色 <font color"#ff0000">曲项向天歌</font> 白毛浮绿水]]></st…

idea新建spring boot starter

什么是spring boot starter Spring Boot Starter 是一种 Maven 或 Gradle 依赖&#xff0c;它能够轻松地将相关库和框架集成到 Spring Boot 应用程序中。Starter 是一种对常见依赖项和设置的易于复用的封装&#xff0c;它们通常被开发人员用于创建可插拔的 Spring Boot 应用程序…

信息学奥赛一本通1190:上台阶

1190&#xff1a;上台阶 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 69016 通过数: 23589 【题目描述】 楼梯有n(0<n<71)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶&#xff0c;编程计算共有多少种不同的走法。 【输入】 输入的每一行…

SCAU:各位数字

各位数字 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: G;GCC 描述 从键盘输入一个3位数的正整数&#xff0c;要求先后输出该数的百位数字与个位数字&#xff0c;各占一行输入格式 一个三位整数输出格式 输出该数的百位数字与个位数字输入样例 123输出…

报考公务员简历(精选8篇)

想要成功进入公务员队伍&#xff0c;一份出色的个人简历是必不可少的。本文为大家精选了8篇报考公务员的个人简历案例&#xff0c;无论是应届毕业生还是有工作经验的求职者&#xff0c;都能从中汲取灵感&#xff0c;提升简历质量。找到心仪的公务员岗位。 报考公务员简历模板下…

迭代器模式-C++实现

题外话&#xff1a; 设计模式是在1994年提出的&#xff0c;当时还没有C的STL库和泛型编程&#xff0c;所以人们为了提供一种有效的方法来访问一个聚合对象&#xff08;例如列表、集合、数组等&#xff09;中的元素&#xff0c;而又不暴露该对象的内部表示&#xff0c;于是想到了…

Pandas在Excel同一个sheet里插入多个Dataframe和行

Pandas默认的to_excel是直接把完成的Datafrme写入一个sheet里,这并不能满足我们在一个sheet里插入多个Dataframe或多行的需求。为了实现插入多行或多Dataframe的目的,我们需要新建一个ExcelWriter对象,然后依次插入数据。 这里我们以插入2个Dataframe和三行单元格为例。 新…

大华技术GIS开发工程师24届秋招三场面试Offer面经

本文介绍2024届秋招中&#xff0c;大华技术股份有限公司的GIS开发工程师岗位的3场面试基本情况、提问问题等。 10月投递了大华技术股份有限公司的GIS开发工程师岗位&#xff0c;所在部门为研发中心。目前完成了一面、二面与三面等全部流程&#xff0c;并有幸获得Offer&#xff…

vite脚手架,手写实现配置动态生成路由

参考文档 vite的glob-import vue路由配置基本都是重复的代码&#xff0c;每次都写一遍挺难受&#xff0c;加个页面就带配置下路由 那就利用 vite 的 文件系统处理啊 先看实现效果 1. 考虑怎么约定路由&#xff0c;即一个文件夹下&#xff0c;又有组件&#xff0c;又有页面&am…

[数据结构]HashSet与LinkedHashSet的底层原理学习心得

我们区分list和set集合的标准是三个&#xff1a;有无顺序&#xff0c;可否重复&#xff0c;有无索引。 list的答案是&#xff1a;有顺序&#xff0c;可重复&#xff0c;有索引。这也就是ArrayList和LinkedList的共性 set的答案是&#xff1a;顺序内部再区分,不可以重复&#xf…

【数电笔记】11-最小项(逻辑函数的表示方法及其转换)

目录 说明&#xff1a; 逻辑函数的建立 1. 分析逻辑问题&#xff0c;建立逻辑函数的真值表 2. 根据真值表写出逻辑式 3. 画逻辑图 逻辑函数的表示 1. 逻辑表达式的常见表示形式与转换 2. 逻辑函数的标准表达式 &#xff08;1&#xff09;最小项的定义 &#xff08;2&am…