《Orange‘s》FAT12文件系统

时间:2022-01-01 00:20:01

FAT12

层次

  • 扇区(Sector):磁盘上的最小数据单元
  • 簇(Cluster):一个或多个扇区
  • 分区(Partition):通常指整个文件系统

引导扇区

引导扇区是整块软盘的第0个扇区,在这个扇区中有一个重要的数据结构叫BPB(BIOS Patameter Block)。格式如下表所示:

《Orange‘s》FAT12文件系统

其中以BPB_开头的域属于BPB,以BS_开头的不属于BPB,只是引导扇区的一部分。

紧跟着引导扇区的是两个完全相同的FAT表,每个占用9个扇区。第二个FAT表后是根目录区的第一个扇区。根目录区后面是数据区。如下图所示:

《Orange‘s》FAT12文件系统

根目录区放的是文件条目,每个条目占32字节,格式如下:

《Orange‘s》FAT12文件系统

根目录区和数据区

这部分来实操一下书中的一个小例子。

首先,使用bximage创建一个虚拟软盘x.img。

接着,在FreeDOS下创建文本文件RIVER.TXT,内容为riverriverriver。

TREE.TXT 内容为treetreetree。再添加一个HOUSE目录,在目录下添加两个文本文件CAT.TXT,DOG.TXT内容同上。 FreeDOS下可使用EDIT来创建文件。 刚开始我使用书中之前虚拟FreeDOS的bochsrc,发现EDIT不存在。和freedos自带的bochsrc比较了下,发现自带的启动的是c.img。另外,比较a.img和c.img,也会发现两者大小相差很大。于是我猜测c.img才是完整的freedos。于是直接在自带的bochsrc上修改,并拷贝了c.img。成功启动后果然可以使用edit了。如果懒得修改可以直接参考:

###############################################################
# Configuration file for Bochs
############################################################### # how much memory the emulated machine will have
megs: 32 # filename of ROM images
romimage: file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/share/vgabios/vgabios.bin # what disk images will be used
floppya: 1_44=x.img, status=inserted
ata0-master: type=disk, path=c.img, cylinders=306, heads=4, spt=17
boot: c # where do we send log messages?
# log: bochsout.txt # disable the mouse
mouse: enabled=0 # enable key mapping, using US layout as default.
keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.map

启动后,首先格式化x.img。

format A:

格式化后,进入A分区创建上述文件。(注:edit使用Alt键可切换至菜单)

接下来我们计算一下根目录的偏移量。由前面可知,根目录区从第19扇区开始,每个扇区为512字节,别忘记扇区从0开始计数,所以第一个字节位于偏移19×512=0x2600处。接着查看一下x.img偏移0x2600处是什么:

《Orange‘s》FAT12文件系统

看到了刚刚创建的几个文件和文件夹。以RIVER.TXT为例,它的各项值如下表所示:

《Orange‘s》FAT12文件系统

分别是:文件名、大小、时间、’日期、文件开始簇号和文件大小。

需要注意的是,数据区的第一个簇的簇号是2,不是0或1。

RIVER.TXT的开始簇号就是2,也就是说此文件的数据开始于数据区第一个簇。

想计算出第一个簇即第一个扇区,必须要知道根目录区所占的扇区数。

在本例中,每扇区字节数为200h,根目录文件数最大值E0h,由上文可知一个文件条目为32字节,所以根目录占用空间大小为32×E0h=1C00h,对应1C00h/200h=Eh=14个扇区。本例刚好整除,否则扇区数还要加1。

所以,数据区开始扇区号=根目录开始扇区号+14=19+14=33。偏移量为33×512=0x4200,接下来看一下内容:

《Orange‘s》FAT12文件系统

果然就是RIVER.TXT的内容。

FAT表区

FAT表有2个,FAT2可看作是FAT1的备份。先用xxd看下它的结构(FAT1的开始扇区号是1,偏移为512字节=0x200):

《Orange‘s》FAT12文件系统

其中,每12位称为一个FAT项(即FAT12),代表一个簇。第0个和第1个FAT项始终不使用,从第2个FAT项开始表示数据区的每一个簇。照应了前文所说的数据区第一个簇的簇号是2。

《Orange‘s》FAT12文件系统

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

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

要注意的是,一个FAT项可能会跨越两个扇区,这种情况在编码实现的过程中要考虑在内。

《Orange‘s》FAT12文件系统的更多相关文章

  1. 【转载】FAT12文件系统之引导扇区结构

    FAT12文件系统之引导扇区结构 文件系统即文件管理系统,是操作系统的重要组成部分之一,如果需要开发底层磁盘驱动或编写自己的操作系统,就必须详细了解文件系统. FAT12是Microsoft公司DOS ...

  2. Windows文件系统

    微软在Dos/Windows系列操作系统*使用了6种不同的文件系统(包括即将在windows的下一个版本中使用的Winfs).它们分别是:FAt12.FAT16.FAT32.NTFS.NTFS5.0 ...

  3. FAT12格式的引导区实现

    org 07c00h ;================================================ jmp short START nop ; 这个 nop 不可少 ;这个结构将 ...

  4. 制作FAT12软盘以查看软盘的根目录条目+文件属性+文件内容

    [-1]Before for specific info , please visit http://wiki.osdev.org/Loopback_Device [0]我们先上干货,看到效果后,我们 ...

  5. FAT12中,如何定位大于一个扇区(512B)的文件内容

    [0]README 0.1)本文旨在于 演示在FAT12中, 如何取定位大于 512B 的文件内容,和查看它: 0.2)如何制作FAT12文件系统,以及如何向文件中添加temp.txt文件,参见: { ...

  6. 《30天自制操作系统》笔记3 --- (Day2 上节)完全解析文件系统

    Day2 汇编语言学习与Makefile入门 本文仅带着思路,研究源码里关于文件系统的参数 关于day2主程序部分及更多内容,请看<30天自制操作系统>笔记 导航 发现学习中的变化 源码差 ...

  7. 操作系统内核Hack:&lpar;二&rpar;底层编程基础

    操作系统内核Hack:(二)底层编程基础 在<操作系统内核Hack:(一)实验环境搭建>中,我们看到了一个迷你操作系统引导程序.尽管只有不到二十行,然而要完全看懂还是需要不少底层软硬件知识 ...

  8. os引导程序boot从扇区拷贝os加载程序loader文件到内存(boot copy kernel to mem in the same method)

    [0]README 0.1) 本代码旨在演示 在boot 代码中,如何 通过 loader文件所在根目录条目 找出该文件的 在 软盘所有全局扇区号(簇号),并执行内存中的 loader 代码: 0.2 ...

  9. 自己写操作系统---bootsector篇

    其实博主本来想在寒假自己写一个OSkernal的,高高兴兴的影印了本<一个操作系统的实现>. 然后又去图书馆借来<30天自制操作系统>和<X86/X64体系探索编程&gt ...

随机推荐

  1. 以最简单方式学习Linux

    有很多关于Linux的书籍,博客.大多数都会比较"粗暴"的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在 ...

  2. server and client

    server: using System;using System.Collections.Generic;using System.Linq;using System.Text;using Syst ...

  3. android 入门-Service实时向Activity通过BroadcastReceiver传递数据

    引文: http://www.cnblogs.com/linjiqin/p/3147764.html <RelativeLayout xmlns:android="http://sch ...

  4. Java 8 VM GC Tuning Guide Charter3-4

    第三章 Generations One strength of the Java SE platform is that it shields the developer from the compl ...

  5. MATLAB——PLOT绘图

    MATLAB——PLOT绘图 格式化绘图: 1.color: b g  r c m y k w blue green red  cyan magenta yellow black white 2.ty ...

  6. import和require

    es6 的 import 语法跟 require 不同,而且 import 必须放在文件的最开始,且前面不允许有其他逻辑代码,这和其他所有编程语言风格一致. import不同与require,它是编译 ...

  7. 豹哥嵌入式讲堂:ARM知识概要杂辑(1)- 内核架构编年史

    众所周知,ARM公司是一家微处理器行业的知名企业,ARM公司本身并不靠自有的设计来制造或出售CPU,而是将处理器架构授权给有兴趣的厂家.这些厂家基本涵盖了全球领先的知名半导体企业.软件和OEM厂商:T ...

  8. windows下Jmeter压力测试工具的安装

    JMeter是Apache软件基金会的产品,用于对静态的和动态的资源(文件,Servlet,Perl脚本,Java 对象,数据库和查询,FTP服务器等等)的性能进行测试.是一款很方便的测试软件. 系统 ...

  9. 谷歌AI涉足艺术、太空、外科手术,再强调AI七原则

    谷歌AI涉足艺术.太空.外科手术,再强调AI七原则 https://mp.weixin.qq.com/s/MJG_SvKCEBKRvL3IWpL0bA 9月18日上午,Google在上海的2018世界 ...

  10. xen 基础命令学习

    # 查看创建的虚拟机的uuid xe vm-list # 开启虚拟机启动顺序功能 xe vm-param-set HVM-boot-policy="BIOS order" uuid ...