FAT12

层次

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

引导扇区

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

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

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

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

根目录区和数据区

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

首先,使用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处是什么:

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

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

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

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

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

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

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

果然就是RIVER.TXT的内容。

FAT表区

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

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

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

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

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

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

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. centos 后台挂起运行python

    用Xshell连接服务器运行python文件,当关闭终端或连接断开后相应的python文件也就不会继续运行了,要达到后台挂起运行就要使用 nohup 命令了. 用法如下: # -u 表示禁止缓存,将结 ...

  2. CentOS下puppet安装

    简介 Puppet是开源的基于Ruby的系统配置管理工具,puppet是一个C/S结构, 当然,这里的C可以有很多,因此,也可以说是一个星型结构. 所有的puppet客户端同一个服务器端的puppet ...

  3. mac中更改xampp的根目录

    方法一: 1 打开 应用程序->XAMPP->xamppfiles->etc->httpd.conf 文档 2 commond+f搜索htdocs,搜到如下结果 # Docum ...

  4. node-js:文摘

    ES6相关 1.module.exports与exports,export与export default之间的关系和区别 nodejs基础 1.NodeJs安装与全局配置(不建议修改包的全局安装路径, ...

  5. VS2017报错 未能加载文件或程序集”Oracle.DataAccess, Version=2.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"或它的某一个依赖项。试图加载格式不正确的程序

    1.VS2017调用Oracle数据库报错:(采取Oracle.DataAccess.Client.dll方法调用) 2.解决方案:(将架构由anycpu转成x86或者x64) 3.具体步骤:anyc ...

  6. navicat 导入execl失败

    在使用navicat导入execl是遇到了如下图的错误 在更换多个版本的navicat后问题依然如故. 解决办法; 1.打开需要导入的execl 2.安装一个AccessDatabaseEngine_ ...

  7. 自定义项目启动初始化信息的listener报错

    自定义初始化组件代码如下: @Component public class InitComponent implements ServletContextListener, ApplicationCo ...

  8. SpringMVC Controller接收前台ajax的GET或POST请求返回各种参数

    这几天写新项目遇到这个问题,看这位博主总结得不错,懒得写了,直接转!原文:http://blog.csdn.net/yixiaoping/article/details/45281721原文有些小错误 ...

  9. 整理Xen理论知识

    XEN 简介 XEN 是一个基于X86架构.发展最快.性能最稳定.占用资源最少的开源虚拟化技术.Xen可以在一套物理硬件上安全的执行多个虚拟机,与 Linux 是一个完美的开源组合,Novell SU ...

  10. Python多线程实例

    前言 感觉理解python多线程用“切换”和“共享”就差不多了.这里就贴上一个抢车票的小小实例,还有自己在编程过程中遇到的坑..... 实例:抢车票 抢车票有三类人:会员.弄了加速包.普通人. 说说区 ...