FAT12是计算机文件系统,DOS时代就开始使用的文件系统(File System),直到2009年仍然在软盘上使用。

主磁盘结构

  • 引导扇区(Boot Sector)位于第一个扇区,在软盘上就是0柱面(磁道)0磁头1扇区。

  • 文件分配表(FAT)紧接着引导扇区的是两个完全相同的FAT表,每个FAT表占用9个扇区

  • 根目录区FAT表之后是根目录区,根目录区长度不固定

  • 数据区根目录后面就是数据区

FAT12文件系统引导扇区结构信息:

  • BS_jmpBoot:从上表可以看出,在引导程序的起始处,首先定义的是BS_jmpBoot字段。从字面意思可知,它是一句跳转代码,这是由于BS_jmpBoot字段后面的数据不是可执行程序,而是FAT12文件系统的组成结构信息,故此必须跳过这部分内容。字段长度为3,说明汇编代码jmp short Label_start;nop经过编译后,一共生成三个字节的机器码,其中nop会生成一个字节的机器码,jmp shortLabel_start会生成两个字节的机器码。
  • BS_OEMName:记录制造商的名字,亦可自行为文件系统命名。
  • BPB_SecPerClus:描述了每簇扇区数。由于每个扇区的容量只有512B,过小的扇区容量可能会导致软盘读写次数过于频繁,从而引入簇(Cluster)这个概念。簇将2的整数次方个扇区作为一个“原子”数据存储单元,也就是说簇是FAT类文件系统的最小数据存储单位。
  • BPB_RsvdsecCnt:指定保留扇区的数量,此域值不能为0。保留扇区起始于FAT12文件系统的第一个扇区,对于FAT12而言此位必须为1,也就意味着引导扇区包含在保留扇区内,所以FAT表从软盘的第二个扇区开始。
  • BPB_NumFATs:指定FAT12文件系统中FAT表的份数,任何FAT类文件系统都建议此域设置为2。设置为2主要是为了给FAT表准备一个备份表,因此FAT表1与FAT表2内的数据是一样的,FAT表2是FAT表1的数据备份表。
  • BPB_RootEntCnt:指定根目录可容纳的目录项数。对于FAT12文件系统而言,这个数值乘以32必须是BPB_BytesPersec的偶数倍。
  • BPB_Totsec16:记录着总扇区数。这里的总扇区数包括保留扇区(内含引导扇区)、FAT表、根目录区以及数据区占用的全部扇区数,如果此域值为0,那么BPB_Totsec32字段必须是非0值。
  • BPB_Media:描述存储介质类型。对于不可移动的存储介质而言,标准值是0xF8。对于可移动的存储介质,常用值为0xF0,此域的合法值是0xF0、0xF8、0xF9、0xFA、0xFB、0xFC、0xFD、0xFE、0xFF:另外提醒一点,无论该字段写入了什么数值,同时也必须向FAT[O]的低字节写入相同值。
  • BPB_FATSz16:记录着FAT表占用的扇区数。FAT表1和FAT表2拥有相同的容量,它们的容量均由此值记录。
  • Bs_volLab:指定卷标。它就是Windows或Linux系统中显示的磁盘名。
  • BS_FilesysType:描述文件系统类型。此处的文件系统类型值为'FAT12 ',这个类型值只是一个字符串而已,操作系统并不使用该字段来鉴别FAT类文件系统的类型。

FAT12文件系统分配图:

FAT表

FAT12文件系统以簇为单位来分配数据区的存储空间(扇区),每个簇的长度为BPB_BytesPerSec *BPB_SecPerclus字节,数据区的簇号与FAT表的表项是一一对应关系。因此,文件在FAT类文件系统的存储单位是簇,而非字节或扇区,即使文件的长度只有一个字节,FAT12文件系统也会为它分配一个簇的磁盘存储空间。此种设计方法可以将磁盘存储空间按固定存储片(页)有效管理起来,进而可以按照文件偏移,分片段访问文件内的数据,就不必一次将文件里的数据全部读取出来。

FAT表中的表项位宽与FAT类型有关,例如,FAT12文件系统的表项位宽为12 bit、FAT16文件系统的表项位宽为16 bit、FAT32文件系统的表项位宽为32 bit。当一个文件的体积增大时,其所需的磁盘存储空间也会增加,随着时间的推移,文件系统将无法确保文件中的数据存储在连续的磁盘扇区内,文件往往被分成若干个片段。借助FAT表项,可将这些不连续的文件片段按簇号链接起来,这个链接原理与C语言的单向链表极为相似。

其中,FAT[O](FAT表项0)的低8位在数值上与BPB_Media字段保持一致,剩余位全部设置为1。由于之前表中的BPB_Media字段数值是F0h,故此FAT[0]的值是FF0h。在文件系统初始化期间,已经明确地将FAT[1]赋值为FFFh,想必这是为了防止文件系统误分配该表项。
        现在,大部分操作系统的FAT类文件系统驱动程序都直接跳过这两个FAT表项的检索,使它们不再参与计算。因此,FAT[0]和FAT[1]的数值已经不再那么重要了,有时候这两个值为0也是没问题的。

根目录区和数据区

从本质上讲,根目录区和数据区都保存着与文件相关的数据,只不过根目录区只能保存目录项信息,而数据区不但可以保存目录项信息,还可以保存文件内的数据。
        此处提及的目录项是一个由32 B组成的结构体,它既可以表示成一个目录,又可以表示成一个文件,其中记录着名字、长度以及数据起始簇号等信息,下表是目录项的完整结构。对于树状的目录结构而言,树的层级结构自然是通过代表着目录的目录项结构建立起来,从根目录开始经过目录项的逐层嵌套渐渐地形成了树状结构。

摘自《一个64位操作系统的设计与实现》

FAT12文件系统详解相关推荐

  1. FATFS文件系统详解

    一.文件系统 负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统.即在磁盘上组织文件的方法. 常用的文件系统: FAT / FATFS NTFS: 基于安全性的文件系统,是Windows ...

  2. NTFS文件系统详解(二)MBR\EBR基本信息

    NTFS文件系统详解(二)MBR\EBR基本信息 一.MBR结构分析 1. 第一个分区表项 2. 第二个分区表项 3. 第三个分区表项 4. 第四个分区表项 二.EBR结构分析 1. 第一个分区表项 ...

  3. NTFS文件系统详解(三)NTFS元文件解析

    NTFS文件系统详解(三)NTFS元文件解析 一. 分析$Boot文件 二.分析文件记录 1. MFT偏移地址计算 2. 文件记录的结构 3. 属性的属性头分析 4. 属性的属性体分析 NTFS文件系 ...

  4. linux根文件系统配置,Linux学习笔记__ Linux根文件系统详解

    Linux根文件系统详解 文件系统: rootfs:根文件系统 FHS:Linux boot:系统启动相关的文件,如内核.initrd.以及grub(bootloader) /dev: 设备文件 块 ...

  5. NTFS文件系统详解(一)硬盘基本信息

    NTFS文件系统详解(一)硬盘基本信息 一.硬盘的内部结构 1. 盘面号 2. 磁道 3. 柱面 4. 扇区 二.硬盘的分区结构 NTFS文件系统详解系列 一般硬盘正面贴有产品标签,主要包括厂家信息和 ...

  6. [自制操作系统] JOS文件系统详解支持工作路径MSH

    本文分为两部分: 第一部分将详细分析JOS的文件系统及文件描述符的实现方法. 第二部分将实现工作路径,提供新的系统调用,完善用户空间工具. 本文中支持的新特性: 支持进程工作目录 提供getcwd与c ...

  7. FastDFS 分布式文件系统详解

    FastDFS 分布式文件系统详解 什么是文件系统 文件系统是操作系统用于在磁盘或分区上组织文件的方法和数据结构.磁盘空间是什么样的我们并不清楚,但文件系统可以给我们呈现一个非常清晰的表象,我们可以创 ...

  8. Linux的proc文件系统详解

    引用自:http://bbs.chinaunix.net/thread-2002769-1-1.html Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它常见的文件系统不同的 ...

  9. Linux操作系统之文件系统详解

    目录 Linux内核中的五大子系统 1.文件系统的基本组成 2.常见文件系统的类型 1.硬盘的文件系统:file system 2.网络文件系统 3.交换分区的文件系统:swap Linux文件系统经 ...

  10. Linux驱动开发_设备文件系统详解

    目录 何为设备管理器? Linux下dev的作用 Devfs sysfs kobject udev proc 何为设备管理器? 设备管理器就是负责管理这台电脑上的外设,当我们通过电脑提供的USB口插入 ...

最新文章

  1. 构建聊天机器人:检索、seq2seq、RL、SeqGAN
  2. 整理第十六届全国大学智能车竞赛比赛数据
  3. Mac OS Mountain Lion 下的Wireshark
  4. 中国厂商加速5G前瞻性部署
  5. android app 集成 信鸽推送
  6. 使用swipecard实现卡片视图左右滑动监听以及点击监听
  7. response对象的使用
  8. windows下hadoop的单机伪分布式部署(3)
  9. python中使用“if __name__ == '__main__'”语句的作用
  10. ACCESS数据库C#操作类(SQLHELPER修改版)——转自网上
  11. centos安装最新的visual studio code并设置中文
  12. myeclipse-10.7-offline-installer-windows安装图解及注意事项
  13. Displaytag的使用四
  14. 软件项目活动图 关键路径
  15. 一个英文字母,一个中文各占多少字节
  16. undefind_undefined
  17. sata7p 定义_SATA接口定义
  18. API平台都有的Appid、Appkey、Appsecret分别是什么意思?
  19. 如何使IE地址栏里显示自己的小图片?
  20. 团队管理22-团队文化

热门文章

  1. 安卓平板usb变显示器_三星DeX—安卓生产力之巅
  2. google 浏览器下载历史版本的方法
  3. 第61篇:合并多个工作薄的所有工作表
  4. Android应用逆向——最好用的两个无源码调试器
  5. 微软拼音输入法调整状态栏水平/垂直选项失效解决办法
  6. 对标苹果开“旧机发布会”?罗永浩出任转转品牌推广大使
  7. winform打印html文件,c# 如何实现web打印插件
  8. c语言中文网GUI,golang gui介绍
  9. 奖学金——信息学奥赛一本通1179题解
  10. 如何从任意页开始设置页码