全面剖析《自己动手写操作系统》第四章--FAT12文件系统

2023-11-14

一、 FAT12

FAT12是DOS时代就开始使用的文件系统(File System),直到现在仍然在软盘上使用,FAT12软盘的被格式化后为:有两个磁头,每个磁头80个柱面(磁道),每个柱面有18个扇区,每个扇区512个字节空间。所以标准软盘的总空间为:

2 * 80 *18 * 512=1474560B=1440K=1.44M

下面是FAT12的结构图:


1、引导扇区

操作系统之所以认识FAT12格式的磁盘,其秘密就在于逻辑0扇区这512B上。如果这512字节的最后两个字节的内容分别是55和AA(0xAA55低字节在前,高字节在后)的话,BIOS在启动时会将这个扇区读取到0:7C00h-0:7DFFh处,然后跳转到0:7C00h处继续执行指令,操作系统即用此来达到引导系统的目的,而这个磁盘就称为引导磁盘。

操作系统标识FAT12文件系统是因为在逻辑0扇区(即引导扇区)处还存储着一个特定的数据结构,此结构有固定的格式,在操作系统将此磁盘格式化时自动生成,具体数据结构如下表所示:

 

名称

开始字节

长度

内容

参考值

BS_jmpBOOT

0

3

一个短跳转指令

jmp short LABEL_START

nop

BS_OEMName

3

8

厂商名

'ZGH'

BPB_BytesPerSec

11

2

每扇区字节数(Bytes/Sector)

0x200

BPB_SecPerClus

13

1

每簇扇区数(Sector/Cluster)

0x1

BPB_ResvdSecCnt

14

2

Boot记录占用多少扇区

ox1

BPB_NumFATs

16

1

共有多少FAT表

0x2

BPB_RootEntCnt

17

2

根目录区文件最大数

0xE0

BPB_TotSec16

19

2

扇区总数

0xB40

BPB_Media

21

1

介质描述符

0xF0

BPB_FATSz16

22

2

每个FAT表所占扇区数

0x9

BPB_SecPerTrk

24

2

每磁道扇区数(Sector/track)

0x12

BPB_NumHeads

26

2

磁头数(面数)

0x2

BPB_HiddSec

28

4

隐藏扇区数

0

BPB_TotSec32

32

4

如果BPB_TotSec16=0,则由这里给出扇区数

0

BS_DrvNum

36

1

INT 13H的驱动器号

0

BS_Reserved1

37

1

保留,未使用

0

BS_BootSig

38

1

扩展引导标记(29h)

0x29

BS_VolID

39

4

卷序列号

0

BS_VolLab

43

11

卷标

'ZGH'

BS_FileSysType

54

8

文件系统类型

'FAT12'

引导代码及其他内容

62

448

引导代码及其他数据

引导代码(剩余空间用0填充)

结束标志0xAA55

510

2

第510字节为0x55,第511字节为0xAA

0xAA55


下面我们介绍其中的一些变量的含义:

BS_jmpBoot:是跳转指令,偏移0处的跳转指令必须是合法的可执行的基于x86的CPU指令,如:jmp start,这样可以生成3字节长的指令,(加关键字short的短跳转指令的长度是2字节),指向操作系统引导代码部分。Windows和MS-DOS生成的FAT12启动扇区中的跳转指令是短跳转,如:jmp short LABEL_START,然后加一个nop的空指令来保持3字节的长度。

BPB_BytsPerSec:每扇区的字节数,类型是双字节长,标准分区上的每扇区字节数一般是512B, FAT12的格式下设置为512(0x200h)。

BPB_SecPerClus:每簇扇区数,偏移13处,类型是字节,簇是数据存储的最小单位,在FAT12格式下一般为1,即每簇只有1个扇区(512字节)。

BPB_RsvdSecCnt:Boot记录占用多少扇区,即在FAT1之前的 引导扇区,一般情况下,引导扇区占用1个扇区。

BPB_NumFATs:共有多少个FAT表,默认情况下此字段的值为2,也就是有两个FAT表,FAT1和FAT2的内容相同,当FAT1表出错的时候可以使用FAT2来恢复文件分配表。

BPB_RootEntCnt:根目录文件数最大值,默认为224,每个目录条目占用32B的空间,因此根目录的大小为:224*32/512=14,即占用14个扇区。

BPB_TotSec16:扇区总数=0xB40=2880

BPB_FATSz16:每个FAT占用的扇区数=0x9=9,即FAT1占用1—9逻辑扇区,FAT2占用10—18逻辑扇区。

BPB_SecPerTrk:每磁道扇区数=0x12=18,即标准FAT12文件系统中,每个磁道的扇区数就是为18。

BPB_NumHeads:磁头数=0x2=2,该磁盘包括2个磁头,也就是面数是2。

2、FAT表

         FAT1和FAT2是两个完全相同的FAT表,每个FAT占用9个扇区。其中FAT1占用1—9扇区,FAT2占用10—18扇区。具体详细介绍看下面4。

3、根目录区

根目录区的开始扇区号是19,它是由若干个目录条目(Directory Entry)组成,条目最多有BPB_RootEntCnt个,由于根目录区的大小是依赖于BPB_RootEntCnt的,所以长度不固定。

         在本FAT12中,因为BPB_RootEntCnt=0xE0=14*16+0=244,即条目最多为244个,又因为每个条目占用32个字节,故244*32/512=14,即该根目录区占14个扇区,即19—32。

         根目录区中的每个条目占用32字节,它的格式如下图:


这里主要定义了文件的名字,属性,最后写入的时间和日期,文件的开始簇数以及文件大小。

下面我们通过实例来认识这些内容,

1、 首先创建一个虚拟软盘,在这里我们使用WinImage,具体下载地址在我的下载资源中。

打开WinImage:

选择文件—》新建


新建一个虚拟软盘之后,需要向里面添加文件,我们需要提前写好下面几个文件

RIVER.TXT,内容为riverriverriver

FLOWER.TXT,内容为flowerflower………flower,至少要100个flower,使得数据空间大于512个字节,这样该文件将占用两个连续的扇区。

TREE.TXT,内容为treetreetree

再添加一个HOUSE目录,然后在目录\HOUSE下添加两个文本文件:

CAT.TXT,内容为catcatcat

DOG.TXT,内容为dogdogdog

选择映像—》加入,依次加入RIVER.TXT,FLOWER.TXT,TREE.TXT三个文件


映像—》创建文件夹  HOUSE


添加HOUSE目录


双击house,进入house的文件夹内,然后添加CAT.TXT,DOG.TXT两个文件



添加文件完成,然后保存,其中注意事项,保存类型为:虚拟软盘映像(*.vfd),我不知道这个类型与IMG有什么区别,但是我知道这个类型得到的结果是对的。呵呵!文件名为FLOOPY,这样我们就创建了一个虚拟软盘FLOOPY.vfd


然后使用UltraEdit打开FLOOPY.vfd,由于根目录区是从第19扇区开始的,每个扇区512个字节,所以其第一个字节位于偏移19*512=9278=0x2600处,好的,现在就让我们去定位到0x2600处看看到底Directory Entry为何物?


RIVER.TXT的各项值:


在这里,我们只需要关心RIVER.TXT的DIR_FstClus,即文件的开始簇号,由于本FAT12中的BPB_SecPerClus=1,故一个簇为一个扇区,DIR_FstClus=2,意味着该文件的在数据区的起始扇区号为2。在这里需要注意的是,数据区的第一个簇的簇号是2,而不是0或者1,故该文件的数据开始于数据区的第一个簇,也就是第一个扇区。

那么数据区的第一个扇区在哪里呢?

首先计算根目录区所占有的扇区数:

RootDirSectors =((BPB_RootEntCnt*32)+(BPB_BytsPerSec-1))/BPB_BytsPerSec。

之所以分子要加上(BPB_BytsPerSec-1),是为了保证此公式在根目录区无法填满整数扇区时仍然成立。

在本例中,因为BPB_RootEntCnt=224,计算得到根目录区所占有的扇区为14个。所以

数据区开始的扇区号=根目录区开始的扇区号+14=19+14=33。

现在就让我们跳入到第33扇区的偏移量是512*33=16896=0x00004200,让我们看看这里的内容:


果然是riverriverriver。

4、FAT表

在这里,由于RIVER.TXT小于512字节,所以我们不需要FAT表就在数据区中找到了RIVER.TXT的内容,但是对于大于512字节的文件来说,就没有这么简单了,需要使用FAT表来寻找到该文件占用的所有数据区扇区。

下面让我们跳入FAT1的内容,FAT1的开始扇区号是1,故偏移为1*512=512=0x200。


一堆看不懂的符号,好像很多F。其实并不复杂,它有点像是一个位图,其中,每12位成为一个FAT项(FAT Entry),代表一个数据区中的簇。第0个和第1个FAT项始终不使用,第2个FAT项开始表示数据区的每一个簇,也就是说,第2个FAT项表示数据区第一个簇,依次类推。前文说过,数据区的第一个簇的簇号是2,和这里相呼应。

要注意,由于每一个FAT项占12位,包含一个字节和另一个字节的一般,所以觉得特别别扭。具体情况是这样的,假设连续3个字节分别是如图所示:


通常,FAT项的值代表的是文件的下一个簇号,但如果值大于或等于0xFF8,则表示当前簇已经是文件的最后一个簇了。如果值为0xFF7,表示它是一个坏簇。

文件RIVER.TXT的开始簇号为2,对应的FAT表中的值为0xFFF,表示这个簇已经是最后一个。

文件FLOWER.TXT的开始簇号为3,对应的FAT表中的值为0x004,表示文件还没有结束,下一个簇号是0x004,然后我们再看FAT表中第4个簇相对应的FAT值为0xFFF,则表示该是最后一个簇,则文件FLOWER.TXT占用第3、4簇。

如果想使文件内容分存在不连续的扇区内,有一个方法可以做到,就是先将该文件加入到软盘驱动中,然后在进行添加相同的文件,进行覆盖。当然该文件的大小必须大于512个字节。

《自己动手写操作系统》读后感                    http://blog.csdn.net/zgh1988/article/details/7059936

全面剖析《自己动手写操作系统》第一章       http://blog.csdn.net/zgh1988/article/details/7060032

全面剖析《自己动手写操作系统》第二章       http://blog.csdn.net/zgh1988/article/details/7062065

全面剖析《自己动手写操作系统》第三章1     http://blog.csdn.net/zgh1988/article/details/7098981

全面剖析《自己动手写操作系统》--“实模式--保护模式--实模式”       http://write.blog.csdn.net/postedit/7256254

全面剖析《自己动手写操作系统》--堆栈段的工作方式   http://blog.csdn.net/zgh1988/article/details/7256254

全面剖析《自己动手写操作系统》---特权级 以及 不同特权级代码段之间的跳转规则     http://blog.csdn.net/zgh1988/article/details/7262901

全面剖析《自己动手写操作系统》--分页机制     http://blog.csdn.net/zgh1988/article/details/7270748

全面剖析《自己动手写操作系统》--中断机制    http://blog.csdn.net/zgh1988/article/details/7276259












本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

全面剖析《自己动手写操作系统》第四章--FAT12文件系统 的相关文章

随机推荐

  • 软工实践2019——第二次作业评分

    第二次作业评分 第二次作业原文 写在前面的话 看了大家陆续提交的第一次作业 感慨良多 初心 勇气和信心 回顾初心 回想自己当初为什么报这个专业 不知你们是否看过电影 无问西东 其中有一句台词 如果提前了解了你们要面对的人生 不知你们是否还会
  • VirtualBox中安装Android-x86详解

    1 下载安装VirtualBox 官网 http www virtualbox org wiki Downloads 2 下载Android x86 官网 http www android x86 org download 这里我们下载5
  • 19. 第三方库的管理和虚拟环境

    Hi 大家好 我是茶桁 在我们之前的课程中 讲解了数据 函数 类 模块以及包 这些基本上已经构成了Python的全部了 那么 我们在学习Python的包之后 有没有思考过 既然Python有内置模块 我们也可以自己写一些模块来使用 那一定有
  • 3D游戏设计作业10:AR/MR 技术

    AR MR 技术 游戏截图 1 作业要求 1 图片识别与建模 2 虚拟按键小游戏 2 设计思路 1 首先是要安装Vuforia 这里直接在file build settings player settings里勾选Vuforia Augme
  • 【漏洞复现】CVE-2021-32682 elFinder ZIP 参数与任意命令注入

    1 Vulhub启动环境 2 查看端口号 3 输入网址 ip 8080 打开网页 4 先创建一个普通的文本文件1 txt 5 然后右键这个文件 对其进行打包 打包后的文件命名为2 zip 并同时进行抓包 获取1 txt的base64编码 6
  • 成员变量与局部变量

    一 成员变量 在类中定义 用来描述对象将要有什么 二 局部变量 在类的方法中定义 在方法中临时保存数据 三 成员变量和局部变量的区别 1 作用域不同 局部变量的作用域仅限于定义它的方法 成员变量的作用域在整个类内部都是可见的 2 初始值不同
  • 【总结】爬虫流程

    爬虫流程 根据所需数据确定爬虫网页 首先考虑resquests 需要提前导入 1 若是文本数据 用response text 2 若是下载视频 图片 音频 用response content 3 若是json接口 用response jso
  • CSS整体界面设计

  • RBAC简介

    RBAC BAC基于角色的访问控制 RBAC认为权限授权的过程可以抽象地概括为 Who是否可以对What进行How的访问操作 RBAC简介 基于角色的权限访问控制模型 在RBAC模型里面 有3个基础组成部分 分别是 用户 角色和权限 RBA
  • Java多线程异常处理

    文章目录 一 线程中出现异常的处理 1 线程出现异常的默认行为 2 setUncaoughtExceptionHandler 方法处理异常 3 setDefaultUncaoughtExceptionHandler 方法进行异常处理 二 线
  • vue3.0的安装配置(含node和npm的配置)

    文章目录 一 下载Node js 二 配置环境变量 三 配置NPM下载存放目录 文件不用事先创建 四 NPM设置镜像仓库 淘宝镜像仓库 五 vue cli脚手架创建Vue3 0项目 一 下载Node js 下载地址 二 配置环境变量 在CM
  • SpringBoot自定义错误页面 与 全局异常处理

    Springboot中需要自定义错误页面 一 使用Springboot默认的配置 1 在templates下穿件一个目录 error 2 在error目录下创建相应的对应的文件即可 如 400 html 500 html 二 自定义错误页面
  • 南大和中大“合体”拯救手残党:基于GAN的PI-REC重构网络,终于有救了

    对于喜欢画画的你来说 总是画得七零八落 不堪入目 但现在 有一种方法可以让你像专业人士那样 让你的糟糕画作变成一副完美的作品 南京大学和中山大学的三位研究人员发布的最新论文中 提出了一种具有边缘和色域的渐进式图像重构网络 PI REC 这是
  • 系统辨识——最小二乘法

    基本原理 数学推导 最小二乘法是通过输入数据与输出数据来拟合已知结构的函数关系 也就是说已知二者的函数关系 通过最小二乘法估计函数的相关参数 假设 x y x y x y存在以下函数关系 但是在实际中 测量数据时存在测量误差或者噪声影响 故
  • pthread 的几个结构体

    Copyright C 2002 2003 2004 2005 2006 2007 Free Software Foundation Inc This file is part of the GNU C Library Contribute
  • Google人机认证解决方法

    针对Chrome浏览器 下载gooreplacer 下载地址1 下载地址2 安装 gooreplacer crx Chrome无法从该网站添加应用 扩展程序和用户脚本 将 crx后缀改为 rar 之后开发者模式安装 重定向网址 重定向 将网
  • cad添加自己线性_创建cad线型的两种方法(线型文件和linetype) - CAD自学网

    作图过程中 我们最常见的线型是实线 虚线 点划线 有的时候这些基本线型可能满足不了你的需求 CAD也有自带的特殊线型 比如 HW 这种自带文字的线型 但你想要的确实 X 那么这便涉及到新线型的建立 建立新线型有两种方法 直接修改线型文档和通
  • CSTrack: Rethinking the competition between detection and ReID in Multi-Object Tracking

    CSTrack Rethinking the competition between detection and ReID in Multi Object Tracking 论文链接 https arxiv org abs 2010 121
  • 什么是标称属性?什么是二元属性?什么是序数属性?

    什么是属性 属性是一个数据字段 表示数据对象的一个特征 一个属性的类型由该属性可能具有的值的集合决定 标称属性 标称意味着 与名称有关 标称属性的值是一些符号或者是事物的名称 每个值代表某种类别 编码或者状态 尽管标称属性有数值 但是不能把
  • 全面剖析《自己动手写操作系统》第四章--FAT12文件系统

    一 FAT12 FAT12是DOS时代就开始使用的文件系统 File System 直到现在仍然在软盘上使用 FAT12软盘的被格式化后为 有两个磁头 每个磁头80个柱面 磁道 每个柱面有18个扇区 每个扇区512个字节空间 所以标准软盘的