第十天、初识 FAT12

由于文件的大小不同和不停的增删操作,同一个文件的数据往往不能完整地存放在磁盘的一个连续的区域内,而会分成若干段,像一条链子一样存放,这种存储方式称为文件的链式存储。为了实现文件的链式存储,磁盘上必须准确地记录哪个文件占用了哪些扇区,哪些扇区还没有被占用等信息。用来记录磁盘中文件如何被分散存储在不同扇区的信息的表格就叫 FAT(File Allocation Table,文件分配表)。可以采用多种办法记录文件占用存储单元的信息,FAT 表响应的也有很多种格式,3.5 英寸软盘采用的是 FAT12 格式。那么这个 FAT12 格式是怎样的呢?它的 FAT 表放在哪里呢?

前面说过 3.5 英寸软盘的 0 柱面、0 磁头、1 扇区是为引导扇区,紧接着引导扇区的就是 FAT 了,而且是连续两个完全相同的 FAT(之所以要两个完全相同的 FAT,是出于系统冗余考虑)。那么 FAT 表是怎么起作用的呢?FAT 表中每个项的值代表的就是某文件占用的下一个扇区号,如果值是 4087,表示它是一个坏簇;如果值大于或等于 4088,则表示当前扇区已经是本文件的最后一个扇区(为什么是4087、4088 呢?看下去就知道了)。由于 3.5 英寸软盘有 2880 个扇区,需要 12 个位(bit)来计数(2^11 = 2047,小于2880),所以每个 FAT 表项占 12 bit(这就是 FAT12 名字的由来)。但是 2^12 = 4096,又远大于 2880,实际上 FAT 表还记录了一些别的信息:第 1 字节的值代表存储介质(0f0h代表软盘,0f8代表硬盘);第 2、3 两个字节都是 0ffh,代表了FAT文件分配表标识符;从第 4 个字节开始才真正与数据区所有的扇区一一对应。由于 FAT 表前面 3 个字节占用了2 个 序号(3 * 8 = 24 bit),所以数据区的第 1 个扇区的序号是 2,而不是 0 —— 不然就不是一一对应了。

那么到底是哪个文件呢?那个文件的第 1 个扇区号又是多少呢?数据区的第一个扇区又是第几号逻辑扇区呢?答案在磁盘结构的下一部分——根目录中。

根目录位于第二个 FAT 表之后。根目录由若干个条目组成(最多 224 个),每个条目对应一个文件,记录了该文件的文件名、文件属性和占用的第一个扇区号。根目录每个条目的格式是这样的:

名称 偏移 长度 描述
DIR_Name 0 0xB 文件名8字节,扩展名3字节
DIR_Attr 0xB 1 文件属性
0xC 10  保留
DIR_WrtTime 0x16 2 最后修改时间 
DIR_WrtDate  0x18 2 最后修改日期
DIR_FstClus 0x1A 2 此条目对应的开始扇区号 
DIR_FileSize  0x1C 4 文件大小

可以算出来,根目录占用 14 个扇区(最多有 224 个条目,每个条目占用 32 字节,224 * 32 / 512 = 14),每个 FAT 表占用 9 个扇区(假设每个 FAT 表占用 X 个扇区,2 个 FAT 表共占用 2 * X 个扇区,则((总扇区数 2880 - (引导扇区数 1 + FAT表占用扇区数 2 * X + 根目录占用扇区数 14)) * 每项占用位数 12 / 每字节位数 8 + 存储其他信息占用字节数 3 = FAT 表占用扇区数2 * X * 每扇区字节数 512,解方程 x = 8.35,取整就是 9),根目录从 19 号逻辑扇区开始(前面有 1 个引到扇区 + 2个 FAT * 每个 FAT 占用 9 个扇区 = 19 个扇区) 。

根目录后面就是数据区了,显然数据区从 33 号逻辑扇区开始( 引到扇区 1 + FAT表 18 + 根目录 14 = 33)。

现在好办了,用前两天写的读写扇区的那个函数,直接通过根目录条目找到文件的第 1 个扇区,再从 FAT 表中找到其他的扇区,文件就能被读写了!

那么,操作系统又是怎么知道 FAT12 有 2 个FAT,每个 FAT 占用 9 扇区,根目录最多有 224 个条目的呢?——因为这些信息都记录在磁盘第一个扇区里了!第一个扇区的 512 字节,每个都有明确的用途,百度一下 FAT12 就能找到下面这个表格:

名称 偏移 长度 内容 软盘参考值
BS_jmpBoot 0 3 跳转指令,指向程序入口
jmp _main

nop

BS_OEMName 3 8  厂商名 自己定义
BPB_BytsPerSec 11 2 每扇区字节数 512
BPB_SecPerClus 13  1 每簇扇区数 1
BPB_RsvdSecCnt 14 2 保留扇区数(用作引导) 1
BPB_NumFATs 16 1 FAT 表数 2
BPB_RootEntCnt 17 2 根目录中能容纳文件的最大数量 224
BPB_TotSec16 19 2 扇区总数(FAT12、16 用) 2880
BPB_Media 21 1 介质描述符
0xF0

BPB_FATSz16 22 2 每 FAT 表占用扇区数 9
BPB_SecPerTrk 24 2 每磁道扇区数 18
BPB_NumHeads 26 2 磁头数 2
BPB_HiddSec 28 4 隐藏扇区数 0
BPB_TotSec32 32 4 扇区总数(FAT32 用)  2880
BS_DrvNum 36 1 驱动器号 0
BS_Reserved1 37 1 未使用 0
BS_BootSig 38 1
扩展引导标记

0x29
BS_VolD 39 4 卷标序列号 0
BS_VolLab 43 11 卷标 自己定义
BS_FileSysType 54 8 文件系统类型 ‘FAT12‘
引导代码 62 448 引导代码、数据及其他填充字符
结束标志  510  2  0xAA55
时间: 2024-10-07 09:01:05

第十天、初识 FAT12的相关文章

十、初识基本数据类型

十.初识基本数据类型1.数字2 是一个整数的例子.长整数 不过是大一些的整数.3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示52.3 * 10-4.(-5+4j)和(2.3-4.6j)是复数的例子.int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值范围为-2**63-2**63-1,即-9223372036854775808-9

Python进阶(四十九)-初识Flask Blueprint

Python进阶(四十九)-初识Flask Blueprint 前言   在进行Python Web开发时选择Flask框架.项目模块划分阶段,使用Blueprint(这里暂且称之为“蓝本”).Blueprint通过把实现不同功能的module分开,从而把一个大的application分割成各自实现不同功能的module.在一个Blueprint中可以调用另一个blueprint的view function, 但要加相应的blueprint名.   Blueprint还有其他好处,其本质上来说就

第十二天、可以读 FAT12 了

搞了三天,总算把那个虫子找到了,可以写出来了. 引导扇区只有 512 字节,太小,基本啥也干不了,我们只能利用引倒扇区把我们的操作系统内核载入内存.但是一下子把内核全部载入进来也不靠谱,还有很多事情没做呢--起码就还没转到安全模式,内核大的话,实模式可装不下.所以正确的姿势是:引导扇区载入一个装载程序,装载程序负责做好准备工作后,再载入真正的内核. 那么引导扇区的任务就很明确了:找到装载程序(Loader.bin),然后把它载入内存.第十天初识FAT12时提到了:通过根目录表项找到文件的第 1

数据库 - 初识MySQL - 介绍/安装

一.介绍: mysql数据库管理软件: 套接字:服务端,客户端:客户端可访问服务端得数据 1.支持并发:操作得是共享得数据 2.处理锁,数据安全,性能 3.用别人得软件,得照着别人得规范,组织自己得语法规则 本章学得内容: 1.mysql基本管理 2.sql语句得学习 二.概述: 1.数据库服务器:运行数据库管理软件的计算机 2.数据库管理软件:mysql,oracle,db2,slqserver mysql被oracle 收购了 3.库:文件夹 4.表:文件 5.记录:事物一系列典型的特征:e

python之路---16 初识面向对象

三十五.初识面向对象 一 .面向对象和面向过程比较 ①面向过程:一切以事物的发展流程为核心    优点:负责的问题流程化,编写相对简单 缺点:可扩展性差 ②面向对象:一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 优点:可扩展性强 缺点:编程的复杂度高于面向过程 二.类和对象 ①类:就是图纸,创建对象的第一步     对象:通过类造出来的具体事物, ②基本格式 class  类名:            #创建类    类名用驼峰格式 def __init__(self,参数): 

Python前世今生

Python前世今生 Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOBE排行榜,Python赶超PHP占据第五!!! 由上图可见,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到业内的认可!!! Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.

简单网站优化

一.为什么要网站优化 1.1.大型网站的特点 高访问量 同时在线人数多 数据量庞大 数据操作频繁 1.2.网站性能测试指标(用户角度) 日访问量 同时在线人数 最大并发连接数 访问响应时间 1.3.网站性能个体体现 首屏时间:一个网站被浏览器上部,800*600区域充满所需要的时间 网页访问可用性:用户访问网页的成功率. DNS时间:浏览器将地址发送给DNS服务器,DNS服务器根据地址返回IP到浏览器,浏览器得到IP地址,此为DNS时间 建立连接时间:包含DNS时间后,浏览器重到IP地址后,再将

Python学习之路——day01

一.Python介绍 1.Python的诞生 Python的作者叫Guido Van Rossum(吉多 范 罗苏姆),是在1989年圣诞节的时候老婆孩子不在家,他为了打发时候写的一个程序,作为ABC语言的一种继承,太牛奔了! 2.和其他语言的比较 Python属于高级语言,和C#.Java一样,编译的顺序都是从代码==>内存==>解释器编译成字节码==>机器码,所以速度上会比C语言差一些,因为C语言是直接将代码编译成机器码的. 3.自己对Python的理解 Python用途很广泛,现在

day1 python简介和入门

Linux的yum依赖自带Python,为防止错误,此处更新其实就是再安装一个Python: 安装Python 1.下载安装包     https://www.python.org/downloads/ 2.安装    默认安装路径:C:\python27 3.配置环境变量     [右键计算机]-->[属性]-->[高级系统设置]-->[高级]-->[环境变量]-->[在第二个内容框中找到 变量名为Path 的一行,双击] --> [Python安装目录追加到变值值中