FAT32文件系统详细分析 (格式化SD nandSD卡)

FAT32 文件系统详细分析 (格式化 SD nand/SD 卡)

目录

  • FAT32 文件系统详细分析 (格式化 SD nand/SD 卡)
    • 1. 前言
    • 2.格式化 SD nand/SD 卡
    • 3.FAT32 文件系统分析
      • 3.1 保留区分析
        • 3.1.1 BPB(BIOS Parameter Block) 及 BS 区分析
        • 3.1.2 FSInfo 结构扇区分析
        • 3.1.3 引导扇区剩余扇区
        • 3.1.4 备份引导扇区
        • 3.1.5 保留区剩余区域
      • 3.2 分区偏移及大小计算
      • 3.3 FAT 区分析:
      • 3.4 数据区分析:
    • 4.总结

1. 前言

文件存储到存储芯片中,有 2 种形式。

1, 直接按照地址的方式进行存储。

2, 以文件系统的形式进行存储。

直接按照地址的方式进行存储,可以通过建立一张索引表,知道哪些地址存储哪些数据,或者按照固定的方式,进行顺序的存储。这种写入的方式好处是不需要复杂的文件系统管理,但是不方便数据的交互。因为这张索引表都是自己定义的,不是通用的标准。

文件系统形式进行存储,就会有一套标准,大家都按照这个标准来,不同的设备都可以对于这个数据进行读写操作。通过文件系统的方式来存储数据,好处是方便了数据的交互,但是也会提高复杂程度。并且如果数据是完整的保存到存储单元中,但是描述这个文件的相关文件参数损坏了,这个文件也就无法正确读取到了。每一个数据,都有描述文件起始地址,文件大小,格式等等很多参数,也也就提高了文件出错的概率。 文件系统的种类也有很多,比如 FAT,exfat,NTFS,ext4 等等。
今天我们就先了解下 fat32 的文件系统。

2.格式化 SD nand/SD 卡

申请到雷龙发展代理的 CS 创世 贴片 SD Card (SD NAND) 样品,做出测试,分享一下,该公司 SD NAND 二代产品介绍可以参考如下地址http://longsto.com/product/list-39.html,有1Gb,4Gb,32Gb,64Gb的容量可选,我这里申请到的是两片32Gb的芯片和测试板.

image-20240910121111975

2.1 格式化 SD nand / SD 卡,强制采用 FAT32 格式,分配每个簇大小为 2048Byte,同时为了避免其他原有数据干扰,我们此处取消快速格式化。

image-20240910121127205

2.2 使用 WinHex 打开分析

3.FAT32 文件系统分析

FAT 文件系统布局图如下,和 FAT16 上有些许差别:

3.1 保留区分析

保留区分为引导扇区、备份引导扇区及其他字段,具体数据段分析如下。

3.1.1 BPB(BIOS Parameter Block) 及 BS 区分析

BPB 及 BS 参数内容数据如下:

image-20240910121203005

EB 58 90 :BS*JmpBoot,跳转指令

4D 53 44 4F 53 35 2E 30:BS_OEMName,MSDOS 5.0,一个名字,指示创建此卷的操作系统,无其他作用

00 02:BPB_BytsPerSec,扇区大小 512 字节

04:BPB_SecPerClus,每次操作的最小扇区数,簇 Cluster,4 (与格式化时选择的大小匹配 2048 = 512 * 4)

16 11:BPB*RsvdSecCnt,保留区的扇区数,0x1116=4374 (通过此可计算,FAT 区起始地址为 4374 * 512 = 0x22 2C00)

02:BPB*NumFATs,FATs 的个数,2(一般此值为 2,多一个用来做冗余备份,解决系统异常导致第一个损坏时,增大恢复的可能性,表示 FAT 区有两个 FATs 备份)

00 00:BPB_RootEntCnt,0,在 FAT12/16 系统中,此字段表示根目录中 32 字节目录条目数量,设置此值时需注意对齐,为了最大的兼容性,FAT16 系统上此值应设置为 512,FAT32 系统上此值应设置为 0

00 00:BPB_TotSec16,16 位大小区域描述 FAT 卷扇区总数,0。当 FAT12/16 系统扇区数 ≥0x10000(65536)时,此字段应设置为 0,真实值存放在 BPB_TotSec32 字段;对于 FAT32 系统,此值必须为 0。(此处由于我们的总扇区数=118.510241024/512 = 242688 > 65536,所以此字段为 0)

F8:BPB_Media 媒体类型

00 00:BPB_FATSz16,00,一个 FAT 占用的扇区数,此字段仅在 FAT12/16 系统使用;FAT32 系统,此字段必须为 0,使用 BPB_FATSz32 字段替代。

3F 00:BPB_SecPerTrk,每个磁道的扇区数,此字段仅与具有几何形状且仅用于 IBM PC 的磁盘 BIOS 的介质相关,不用管。

FF 00:BPB_NumHeads,头数量,此字段仅与具有几何形状且仅用于 IBM PC 的磁盘 BIOS 的介质相关,不用管。

00 00 00 00:BPB_HiddSec,0,FAT 卷之前的隐藏物理扇区数(当磁盘被分区之后,当前分区并不一定是从扇区头开始的)

00 08 0F 00:BPB_TotSec32,0x0F0800 = 985088(整个卷空间大小),32 位大小区域描述 FAT 卷扇区总数。 FAT12/16 系统,扇区总数小于 0x10000 时,此字段必须为 0,真实值存放在 BPB_FATSz16;FAT32 系统,此字段一直有效。(481M = 512 * 985088)

以上是 FAT12/16/32 公共字段,接下来是 FAT32 独有字段

75 07 00 00:BPBFATSz32,1909,一个 FAT 占用的扇区数,FAT 区总大小等于 BPB_FATSz?? * BPBNumFATs 扇区。(由此可计算 FAT 区总大小:1909 * 2 = 3818 扇区 = 3818 _ 512Byte = 0x1D D400 Byte)

00 00: BPB_ExtFlags,扩展标识字段,bit7=0,表示所有 FAT 都是镜像的和活跃的;bit7=1,表示只有 bit3-0 表示的 FAT 是有效的。

00 00:BPB_FSVer:FAT32 版本,高字节是主版本号,低字节是次版本号。

02 00 00 00:BPB_RootClus,2, 根目录的第一个簇号,此值通常为 2,因为前两个簇一般用于保留。

01 00:BPB_FSInfo,1,FSInfo 结构扇区与 FAT32 卷顶部的偏移扇区值。此值通常为 1,因为其通常位于引导扇区旁边。

06 00:BPB_BkBootSec,6, 备份引导扇区与 FAT32 卷顶部的偏移扇区值。此值通常为 6,考虑最大的兼容性,此值不建议为其他值。

00 00 00 00 00 00 00 00 00 00 00 00:BPB_Reserved,0,保留

80:BS_DrvNum,IBM PC 的磁盘 BIOS 使用的驱动器号,00h 代表软盘,80h 代表固定磁盘

00:BS_Reserved,保留字段,0

29:BS_BootSig,扩展引导签名,表示以下存在三个字段

30 D1 B5 78:BS_VolID,与 BS_VolLab 一起构成卷序列号,一般在格式化的时候结合时间生成

4E 4F 20 4E 41 4D 45 20 20 20 20:(解析为:"NO NAME “),BS_VolLab,11byte 卷标,当卷标不存在时,此值应设置为"NO NAME”

46 41 54 33 32 20 20 20:BS_FilSysType,始终为"FAT32 ",对 FAT 类型的确定没有任何影响。

33 C9 … B9 01 00 00:BS_BootCode32,引导启动程序,与平台有关,不使用时填充为 0

BS_BootSign:0xAA55,引导签名,指示这是一个有效的引导扇区

当扇区大小大于 512 字节时,剩余的字段应全部使用 0x0 填充。

3.1.2 FSInfo 结构扇区分析

FSInfo 数据结构为 FAT32 系统所特有,其目的是记录 FAT32 系统上剩余的簇数量以及下一个空闲簇数据;以避免扫描整个磁盘搜索导致的时间浪费。

FSInfo 数据偏移可从引导扇区内的 BPB_FSInfo 参数获取,此处为 1,因此 FSInfo 数据偏移为 1 个扇区,对应 512Byte,0x200 地址处。FSInfo 数据结构如下:

image-20240910121423476

内容如下:

image-20240910121434881

3.1.3 引导扇区剩余扇区

FAT32 引导扇区总共有三个 512Byte 的扇区构成。BPB、BS、FSInfo 字段已使用了 2 个扇区,还剩有一个扇区未使用,字段为 0,如下图所示,需要注意的是,此扇区在偏移值 510 处依旧存在尾部签名 0xAA55。

image-20240910121549200

引导扇区剩余字段,为非有效字段,采用 0x00 填充。

3.1.4 备份引导扇区

相比 FAT12/16,FAT32 系统上存在引导扇区的备份,此块区域偏移参考引导扇区内 BPBBkBootSec 字段,当前引导扇区内此参数值为 6, 因此在当前文件系统内,备份引导扇区的偏移为 6 号扇区,对应偏移地址为 BPB_BkBootSec * BPBBytsPerSec = 6 * 512Byte = 3072Byte = 0xC00

image-20240910121601476

image-20240910121615836

3.1.5 保留区剩余区域

在 FAT32 系统中,保留区除了 BPB 区域、FSInfo 区域以及这两个区域的备份区域外,还有一部分区域,目前我没找到此区域的作用,我理解为此块区域是作为某种引导程序,数据内容如下:

image-20240910121627412

关于此块区域,欢迎大家在评论区讨论!
此外,还有一处区域的存在也欢迎大家讨论,即 FSInfo 扇区后面的一个扇区,只有看到尾部签名,其他数据为空,目前也未找到此处有关说明,后续清楚后会在此补充,亦欢迎大家在评论区讨论!

image-20240910121646715

3.2 分区偏移及大小计算

知道 BPB 参数内容之后,便可以进行分区偏移及大小计算了!
各分区偏移地址及大小如下:

image-20240910121659538

关于 FAT 区,通常存在一个以上的 FAT,如此处所格式化的 sd 卡便存在两个 FAT,对应的偏移地址和大小如下:

image-20240910121707342

注意:在 FAT32 系统中,根目录区不存在,但依旧存在根目录,不过是根目录作为数据区的一部分!

3.3 FAT 区分析:

FAT32 系统与 FAT12/16 系统在 FAT 区数据一个显著差别是:FAT32 每条 FAT 条目占 32bit,FAT16 占 16 个 bit,FAT12 占 12bit。关于此部分更详细描述,可参考上一篇:FAT 文件系统详解(点击跳转!) 的 4.3 章节!

3.3.1 FAT1
FAT1 偏移地址:0x22 2C00
数据内容如下:

image-20240910121722036

3.3.2 FAT2
FAT2 是 FAT1 的备份,偏移地址:0x31 1600
数据内容与 FAT1 一致,如下:

image-20240910121735133

3.4 数据区分析:

偏移地址:0x40 0000
由参数 BPB_RootClus 可知,数据区第一个簇是 2 号簇。
打开数据区的第一个簇,里面存放的内容便是根目录的内容!这也就是为什么 FAT32 没有根目录区,但依旧存在根目录的实现方式。数据内容如下:

image-20240910121757411
之后我们看到 3 号簇的内容:
数据字段如下图所示,由于在上一篇博文中已对长短文件名每个字段进行过细致分析,此处不再做过度分析,仅抽取关键字段进行分析,如下图所示:

image-20240910121804847

之后切换到 4 号簇和 5 号簇,可以查看到对应数据:

image-20240910121809787

image-20240910121816191

从 6 号簇开始便没有在使用,均为空闲簇,对应上 FSInfo 结构内 FSI_Nxt_Free 字段的内容。

4.总结

相比 FAT16 系统,FAT32 文件系统在保留区有了更多的设计:
1)增加了引导扇区的备份,异常掉电等情况下可恢复性更强;
2)增加了 FSInfo 结构,对于大容量 flash 访问将更加高效;

此外 FAT32 系统取消了根目录区,将根目录移至数据区,根目录与普通目录本来就没有什么区别,确实也不用单独分一个区存放,提高了一致性。

关于数据的存储思想,依旧保持不变:FAT 区内的 FAT 条目通过簇链记录扇区使用情况及文件占用的扇区情况;数据区内目录和文件都作为文件,通过目录这一类特殊文件,描述文件属性以及实际文件内容存放的簇的方式,将整个文件管理起来。

综上,便是 FAT32 格式文件系统的详细解析,欢迎大家评论区进行积极讨论与反馈!!!

亲爱的卡友们,欢迎光临雷龙官网,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,深圳市雷龙发展专注存储行业 13 年,专业提供小容量存储解决方案。

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

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

相关文章

828华为云征文 | Flexus X 实例服务器网络性能深度评测

引言 随着互联网应用的快速发展,网络带宽和性能对云服务器的表现至关重要。在不同的云服务平台上,即便配置相同的带宽,实际的网络表现也可能有所差异。因此,了解并测试服务器的网络性能变得尤为重要。本文将以华为云X实例服务器为…

【vue-media-upload】一个好用的上传图片的组件,注意事项

一、问题 media 的saved 数组中的图片使用的是location 相对路径&#xff0c;但是我的业务需要直接根据图片链接展示图片&#xff0c;而且用的也不是location 相关源代码 <div v-for"(image, index) in savedMedia" :key"index" class"mu-image-…

Hadoop林子雨安装

文章目录 hadoop安装教程注意事项&#xff1a; hadoop安装教程 链接: 安装教程 注意事项&#xff1a; 可以先安装ububtu增强功能&#xff0c;完成共享粘贴板和共享文件夹 ubuntu增强功能 2.这里就可以使用共享文件夹 或者在虚拟机浏览器&#xff0c;用 微信文件传输助手 传文…

[网络]TCP/IP五层协议之应用层,传输层(1)

文章目录 一. 应用层二. 传输层端口号传输层的协议UDPTCPTCP报头TCP协议的核心机制 一. 应用层 应用层是和应用程序直接相关, 和程序猿打交道最多的一层 应用层协议, 里面描述的内容, 就是你写的程序, 通过网络具体按照啥样的形式来传输数据 不同的应用程序, 就可以用不同的应…

心觉:以终为始,帮你精准实现目标

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作169/1000天 假设你的目标是 一年内赚到150万。我们可以通过“以终为始”和“以始为终”的结合来帮助你实现这个目标 以下是完整的…

写论文还在卡壳?教你用ChatGPT轻松搞定过渡段落!

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 在写论文的路上&#xff0c;最让人头疼的除了查重率飙升&#xff0c;估计就是文献综述了吧&#xff01; 想想看&#xff0c;文献一篇接着一篇&#xff0c;脑子都快炸了&#xff0c;还得想办法把它们连接得…

vue2实践:el-table实现由用户自己添加删除行数的动态表格

需求 项目中需要提供一个动态表单&#xff0c;如图&#xff1a; 当我点击添加时&#xff0c;便添加一行&#xff1b;点击右边的删除时&#xff0c;便删除这一行。 至少要有一行数据&#xff0c;但是没有上限。 思路 这种每一行的数据固定&#xff0c;但是不定行数的&#x…

2024.9.14(RC和RS)

一、replicationcontroller &#xff08;RC&#xff09; 1、更改镜像站 [rootk8s-master ~]# vim /etc/docker/daemon.json {"registry-mirrors": ["https://do.nark.eu.org","https://dc.j8.work","https://docker.m.daocloud.io",&…

【Kubernetes】linux centos安装部署Kubernetes集群

【Kubernetes】centos安装Kubernetes集群 1、环境准备 系统centos7 配置yum源参考文章 Centos系统换yum源 yum -y update 步骤1-3是所有主机都要配置&#xff0c;主机名和hosts配置完后可以使用工具命令同步 1.1 主机 一主二从 主机名ipk8smaster192.168.59.148k8snode11…

git 更新LingDongGui问题解决

今天重新更新灵动gui的代码&#xff0c;以便使用最新的arm-2d&#xff0c;本来以为是比较简单的一件事情&#xff08;因为以前已经更新过一次&#xff09;&#xff0c;却搞了大半天&#xff0c;折腾不易啊&#xff0c;简单记录下来&#xff0c;有同样遇到问题的同学参考&#x…

Maven私服Nexus安装及使用

前言 周末在家闲着无聊&#xff0c;不知道做点啥&#xff0c;就想着自己搭建一个Maven私服来玩玩。刚好使用自己之前在电脑上搭建的虚拟机服务器来操作体验了一把。搭建好私服后&#xff0c;以后自己写的一些小模块啊&#xff0c;工具包啥的就可以发布到自己的私服上了&#xf…

时序预测 | Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测

时序预测 | Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测 目录 时序预测 | Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测&#xff08;完整源码和数…

yml在线格式转换工具(properties)

网站地址&#xff1a; 在线yaml转properties-在线properties转yaml-ToYaml.com yml&#xff0c;即yaml文本格式文件的后缀名&#xff0c;yaml可以用来替代properties&#xff0c;配置文件短的情况下可读性更好一些。 但是Spring Boot项目配置项多&#xff0c;yml文件看起来不…

LabVIEW编程语言出于什么原因开发的?

LabVIEW最初由美国国家仪器公司&#xff08;NI&#xff09;于1986年开发&#xff0c;目的是为工程师和科学家提供一种图形化编程环境&#xff0c;简化数据采集、仪器控制、自动化测试和测量系统开发等工作。开发LabVIEW的主要原因包括以下几点&#xff1a; 简化复杂系统开发&am…

哈工大“计算机设计与实践”(cpu)处理器实验设计报告

哈工大“计算机设计与实践”&#xff08;cpu&#xff09;处理器实验设计报告 【哈工大“计算机设计与实践”&#xff08;cpu&#xff09;处理器实验设计报告】 在计算机科学领域&#xff0c;CPU&#xff08;中央处理器&#xff09;是计算机系统的核心部件&#xff0c;负责执行指…

91、K8s之ingress上集

一、Ingress service模式&#xff1a; loadbalance NodePort&#xff1a;每个节点都会有一个指定的端口 30000-32767 内网 clusterip&#xff1a;默认模式&#xff0c;只能pod内部访问 externalName&#xff1a;需要dns提供域名 1.1、对外提供服务的ingress service&…

SQL Server小技巧之遍历日期

使用背景 一般项目中会遇到&#xff0c;求每日的日报这种&#xff0c;以及计算2个日期内的工作日&#xff0c;或者休息日可能会用到&#xff0c;计算休息日可以用额外的一个字段用来标记当前日期是否是休息日 遍历方式一 DECLARE StartDate DATE 2023-01-01, EndDate DATE …

jmeter之TPS计算公式

需求&#xff1a; 如何确定环境当中的TPS指标 PV:&#xff08;Page View&#xff09;即页面访问量&#xff0c;每打开一次页面PV计数1&#xff0c;刷新页面也是。PV只统计页面访问次 数。 UV(Unique Visitor),唯一访问用户数&#xff0c;用来衡量真实访问网站的用户数量。 一般…

携手鲲鹏,长亮科技加速银行核心系统升级

新经济周期下&#xff0c;银行净息差持续收窄、盈利压力加大、市场竞争日趋加剧。同时&#xff0c;国家相关政策不断出台&#xff0c;对金融科技的自主创新与安全可控提出了更高要求。 在这样的大背景下&#xff0c;银行业的数字化转型已经步入深水区。其中&#xff0c;核心系统…

appium server gui详细按照步骤

1.安装appium server desktop Appium安装提供两种方式:桌面版和命令行版。其中桌面版又分为 Appium GuI 和 Appium Desktop 。作为初学者&#xff0c;用桌面版&#xff0c;对初学者比较友好。 官网下载地址&#xff1a;Releases appium/appium-desktop GitHubTags appium/…