资源描述
FAT文件系统与文件装载
在建立自己的文件系统之前,为了进行操作系统装载程序的实验,我们选择使用DOS简单的FAT12文件系统,作为存储数据和文件的组织方式。
1 文件系统
文件系统是操作系统在(磁/U/光)盘上组织文件的方法和存储数据的结构;也指用于存储文件的磁盘分区、或文件系统的种类;还是操作系统中负责管理和存储文件信息的软件模块(文件管理系统)的简称。文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户创建文件,存入、读出、修改、转储文件,控制对文件的访问,当用户不再使用时撤销和删除文件等。
1.1 操作系统与文件系统
每种操作系统都有自己的文件系统,而且往往一种操作系统有多种文件系统类型,并且每种类型又有若干具体格式和多个升级版本。有的操作系统还支持多种文件系统类型,如Windows支持NTFS和FAT,Linux通过VFS(Virtual File Systems,虚拟文件系统)机制支持多种文件系统,如ext2、ext3、ReiserFS、Minix、FAT32、NTFS等。
DOS操作系统的文件系统为FAT(File Allocation Table,文件分配表),包括FAT12、FAT16、FAT32和exFAT等多种具体格式,老式Windows是DOS的外壳,当然也支持FAT文件系统。
Windows NT系列(包括NT/2000/XP/Vista/7/8)的文件系统为NTFS(New Technology File System,新技术文件系统),版本有v1.0(NT 3.1)、v1.1(NT 3.5)、v1.2(NT 3.51和NT 4.0)、v3.0(NTFS 5.0/Win2000)、v3.1(NTFS 5.1/WinXP、NTFS 5.2/WinServer2003、NTFS 6.0/Vista、NTFS 6.1/WinServer2008和Win7)。Windows NT系列操作系统也支持老式的FAT文件系统。
Linux最初使用的是Minix文件系统。为了突破Minix文件系统的局限,Rémy Card于1992年4月在传统的UFS(Unix File System,Unix文件系统)的启发下设计出了ext(extended file system,扩展文件系统)。后来Rémy Card于1993年1月又推出了改进的ext2(second extended filesystem),成为Linux的标准文件系统。Stephen Tweedie设计的带有日志功能的ext3(third extended filesystem)于2001年11月被引入Linux 2.4.15内核,现在也被许多Linux发行版广泛使用。2006年10月10日西奥多·周(Theodore Ts'o)和Mingming Cao(曹明明?)等人又开发出了ext4(fourth extended filesystem),引进了盘区(extent)文件储存方式,以取代ext2/3使用的块映射(block mapping)方式,提高了大型文件的操作效率,2008年10月21日推出的Linux 2.6.28开始提供对ext4文件系统的支持。ReiserFS是Linux的另一种日志型文件系统格式,由Hans Reiser及其公司Namesys于1997年7月23日推出,Linux内核从2.4.1版本(2001年1月30日)开始支持ReiserFS。
1.2 磁盘分区
磁盘分区(disk partitioning)将硬盘分割成若干逻辑部分(分区,partition),可安装多个操作系统和使用不同的文件系统。在DOS和Windows中,硬盘的分区对应于文件系统中不同的卷(volume),如C:、D:、E:等。由于软盘的容量小,没有分区结构。
1.引导扇区的构成
引导扇区(Boot Sector)是磁盘的第一个物理扇区,由主引导记录(MBR = Master Boot Record)、磁盘分区表(DPT = Disk Partition Table)和引导记录标识符(BRID = Boot Record IDentifier)三部分组成。
0
1BD
主引导记录
MBR(446B)
1BE
1CD
分区项1(16B)
DPT(64B)
1CE
1DD
分区项2(16B)
1DE
1ED
分区项3(16B)
1EE
1FD
分区项4(16B)
1FE
1FF
55 AA
BRID(2B)
引导扇区结构图
2.分区表项的结构
DPT含4个分区表项,每一项占16B,参见下表:
分区表项的字段结构
偏移量
长度
含义(值)
0x00
1B
分区是否激活(0x80或0)
0x01
1B
开始磁头号
0x02
2B
开始扇区号(低字节的低6位)和柱面号(其余10位,其中低位字节的高2位为其第9、10位)
0x04
1B
分区类型(如:0x06/0x0E = FAT16、0x0B/0x0C = FAT32、0x07 = NTFS、0x05/0x0F = 扩展、0x83 = Linux)
0x05
1B
结束磁头号
0x06
2B
结束扇区号(低字节的低6位)和柱面号(其余10位,其中低位字节的高2位为其第9、10位)
0x08
4B
分区起始地址(相对扇区数)
0x0C
4B
分区大小 (总扇区数)
3.分区类型
PC的分区类型标志
数值
开发者
分区类型
数值
开发者
分区类型
0x00
IBM
空分区
3C
PowerQuest
PqRP(PartitionMagic)
0x01
微软
FAT12
64
Novell
NetWare File System 286
0x02
微软
Xenix root
65
Novell
NetWare File System 386
0x03
微软
Xenix user
78
Geurt Vos
XOSL引导装入文件系统
0x04
微软
FAT16 <32MB
80
Andrew Tanenbaum
老Minix文件系统
0x05
IBM
扩展分区(CHS)
81
Minix文件系统
0x06
Compaq
FAT16B
82
GNU/Sun
Linux交换空间/Solaris
0x07
微软
HPFS/NTFS/exFAT
83
GNU/Linux
Linux文件系统
0x08
IBM
Aix
84
微软
休眠
0x09
IBM
Aix bootable
85
GNU/Linux
Linux扩展
0x0A
微软&IBM
OS/2 Boot Manager
86
微软
Legacy FT FAT16
0x0B
微软
FAT32(CHS)
87
微软
Legacy FT NTFS
0x0C
微软
FAT32(LBA)
88
GNU/Linux
Linux无格式文本
0x0E
微软
FAT16(LBA)
89
GNU/Linux
Linux LVM
0x0F
微软
扩展分区(LBA)
8B
微软
Legacy FT FAT32
0x11
微软
隐藏FAT12
8C
微软
Legacy FT FAT32 with LBA
0x12
Compaq
康柏诊断(FAT)
A0
HP
HP膝上型电脑诊断分区
0x14
微软
隐藏FAT16 <32MB
A5
FreeBSD
BSD slice
0x17
微软
隐藏HPFS/NTFS
DE
Dell
Dell诊断分区
0x1B
微软
隐藏FAT32
EB
Be公司
BFS(BeOS或Haiku)
0x1C
微软
隐藏FAT32(LBA)
EE
微软
EFI保护分区
0x1D
微软
隐藏FAT16(LBA)
EF
Intel
EFI系统分区(可为FAT文件系统)
0x20
微软
Windows Mobile update XIP
FB
VMware
VMware VMFS
0x23
微软
Windows Mobile boot XIP
FC
VMware
VMware VMKCORE
0x25
微软
Windows Mobile IMGFS
FD
GNU/Linux
Linux RAID auto
0x27
微软
Windows恢复分区(隐藏NTFS)
FE
IBM
IBM IML分区
其中:
l Xenix是微软公司于1980年为微机推出的一种Unix系统(最后的版本是1989年推出的2.3.4),1987年转让给了SCO公司,后者在其基础上推出了SCO Unix(即现在的SCO OpenServer)。
l HPFS(High Performance File System,高性能文件系统)是微软公司于1989年为IBM的操作系统OS/2 1.2推出的一种文件系统,Windows NT 3.1~3.51支持,但是从Windows NT 4.0后不再支持。
l AIX(Advanced Interactive Executive,高级交互执行体/先进交互执行程序)是IBM于1986年推出的一种Unix系统,现在最新的版本是2010年9月推出的7.1。
l CHS(Cylinder/Head/Sector,柱面/磁头/扇区)磁盘的一种传统寻址方式。
l LBA(Logical Block Addressing,逻辑块寻址)磁盘的一种线性寻址方式,有22b(ATA,1986)、28b(ATA-1,1994)和48b(ATA-6,2003)三种版本。1996年以后推出的硬盘一般都采用了LBA。下面是LBA与CHS的转换公式:
LBA = ((C*HPC)+H)*SPT+S-1
C = LBA/(SPT*HPC)
H = (LBA/SPT) % HPC
S = (LBA % SPT)+1
其中:
n HPC = Heads Per Cylinder,柱面磁头数(对28位的LBA一般为16)
n SPT = Sectors Per Track,磁道扇区数(对28位的LBA一般为63)
l OS/2(Operating System/2,操作系统/第二代)微软与IBM于1987年为IBM的第二代个人计算机系统PS/2(Personal System/2)开发的一种操作系统,最后的版本为2001年12月推出的4.52。
4.磁盘寻址方式
用这种CHS(Cylinder柱面/Head磁头/Sector扇区)方式表示的分区容量是有限的,因为柱面和磁头从0开始编号,扇区 从1开始编号,所以最多只能表示1024个柱面×63个扇区×256个磁头×512B = 8 455 716 864B(8.4GB[实际上应该是7.8GB左右])。对容量超过8.4GB的分区,分区结束的CHS一般用其最大值FE FF FF填充,有时也用柱面与1024的模来填充。
用4B存储的分区大小,最大为232*512B = 2 147 483 648KB = 2048GB = 2TB。即使使用NTFS文件系统,也不能创建大于2TB的分区,但可以使用动态卷或GPT来创建超过2TB的NTFS卷。
由于分区不允许跨柱面(分区粒度,分区的扇区总数加上与前一分区之间的保留扇区数必须是柱面容量[= 磁头数*每个柱面的扇区数]的整数倍),所以用操作系统进行分区时所得到的分区容量往往不是我们所指定的整数值。
为了增加容量,现代硬盘一般使用等密度结构(即外圈磁道的扇区数比内圈磁道的多),大容量磁盘一般采用线性寻址(可突破CHS寻址方式下容量<8.4GB限制,硬盘控制器内部的地址翻译器可将老式的CHS参数转换成线性参数)。硬盘的扇区总数不一定是(所设)柱面容量的整数倍,所以磁盘的末尾处常会出现未被分配使用的剩余空间。
5.GPT
GPT(GUID Partition Table,全局唯一标识符分区表)一种新的磁盘分区表标准,最初由Intel公司开发,2010年作为UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)规范的子集而推出,可突破传统MBR的2TB限制,最大可支持9.4ZB的硬盘和分区。
字节的十进制/二进制次方单位
缩写
英文名
中文名
次方
KB
kilobyte / kibibyte
千字节
103 / 210
MB
megabyte / mebibyte
兆字节
106 / 220
GB
gigabyte / gibibyte
吉字节
109 / 230
TB
terabyte / tebibyte
太字节
1012 / 240
PB
petabyte / pebibyte
拍字节
1015 / 250
EB
exabyte / exbibyte
艾字节
1018 / 260
ZB
zettabyte / zebibyte
泽字节
1021 / 270
YB
yottabyte / yobibyte
尧字节
1024 / 280
GPT方案
(LBA的大小为512B,LBA 0=MBR,LBA -1为磁盘的最后一个512B大小的块)
支持GPT的操作系统平台
类别
OS
起始版本
平台
类Unix
FreeBSD
7.0
x86/x64
Linux
2.5.8
Mac OS X
10.4.0
Windows
Vista
SP1
x64
Server
2008
7
1.2 扩展分区与逻辑驱动器
在主引导扇区的DPT中,最多可以定义4个(基本)分区(卷)。为了引入和管理更多的逻辑驱动器(分区/卷),微软定义了扩展分区(类型值一般为0x0F)。在Windows操作系统中,一般将主引导扇区里DPT的第一个表项作为磁盘的主(基本)分区,第二个表项作为扩展分区。
在一个扩展分区中,可包含多个逻辑驱动器。每个逻辑驱动器都有自己的引导扇区和引导记录,分别叫做扩展引导扇区和扩展引导记录(EBR = Extended Boot Record),逻辑驱动器还有自己的扩展分区表。在扩展分区表的4个分区表项中,第1个指向自己的引导扇区,第2个指向下一个逻辑驱动器的EBR,后两个分区表项没有使用。最后一个逻辑驱动器的第2个分区表项的值,必须全为0。
DOS/Windows硬盘的分区结构
1.3 FAT分区
FAT(File Allocation Table,文件分配表)是微软公司为其操作系统DOS和老式Windows所定义的一套文件系统,包括FAT12、FAT16、FAT32和exFAT等多种具体格式。
FAT12可支持的最大容量为32MB,用于早期的1.2MB/1.44MB软盘和小容量硬盘,现在已被淘汰。FAT16则可支持<4GB的盘,现在一般用于中小容量的U盘。FAT32虽然在理论上最多可以支持128TB的盘,但是由于目前只使用了大小为32位簇字段中的28位,所以允许的最大容量是8TB,但Windows 2000/XP最多只能格式化32GB的盘,如小容量硬盘和较大容量U盘。exFAT(也叫FAT64)支持现代的大容量硬盘、移动硬盘和固态盘,但出现的晚,支持的系统少,而且由于exTAT采用了与NTFS一样的分区类型值(7),造成了一些兼容性问题。
Windows NT系列操作系统,一般都采用性能更好的NTFS格式。NTFS支持的最大卷为264-1个簇(WinXP的为232-1簇),若采用默认/最大的簇大小4KB / 64KB,则最大卷为64ZB-4KB / 1YB-64KB(WinXP的为16TB-4KB / 256TB-64KB)。NTFS支持的最大文件的理论值为16EB-1KB,实现值为16TB-64KB。
不同版本FAT的比较
FAT
开发商
微软(Compaq)
全名
文件分配表
12位版
16位版
32位版
64位版
发布时间
1980年8月
1984年8月
1987年11月
1996年8月
2006年11月
OS版本
QDOS 0.11
MS DOS 3.0
Compaq DOS 3.31
Windows 95 OSR2
Windows Embedded CE 6.0
分区标识
0x01
0x04、0x0E
0x06
0x0B、0x0C
0x07
结构
FAT12
FAT16
FAT16B
FAT32
exFAT
目录内容
表格
文件配置
链表
坏块
对含损坏磁区的簇加以标识
最大文件大小
32MB
32MB
2GB
4GB
64ZB(推荐512TB)
最大文件数量
4,077(212-21)
65,517(216-19)
65,517(216-19)
268,435,437(228-19)
每个目录2,796,202
最长文件名
8.3、长文件名(255个字符)
最大卷大小
32 MB(64KB簇时256MB)
32MB(64KB簇时256MB)
2 GB(64KB簇时4GB)
2TB(32KB簇时8TB)
64ZB(推荐512TB)
记录日期
创建、修改、访问
日期范围
1980年1月1日至2107年12月31日
日期分辨率
2 秒、10秒
属性
只读、隐藏、系统、卷标、子目录、归档
访问许可权
无
1.分区结构
下面以FAT16和FAT32为例,讨论FAT文件系统的基本内容。
FAT16分区结构
区域
扇区数
内容
说明
保留扇区
1
分区引导扇区
r-1
其余保留扇区
可选
FAT区
k
FAT#1
主FAT
k
FAT#2
备份FAT
根目录区
m
根目录
固定大小
数据区
n
数据
FAT32分区结构
区域
扇区数
内容
说明
保留扇区
1
分区引导扇区
1
FS信息扇区
r-2
其余保留扇区
可选
FAT区
k
FAT#1
主FAT
k
FAT#2
备份FAT
数据区
n
数据
根目录表一般位于其第1个簇
2.分区引导扇区
分区引导扇区也叫VBR(Volume Boot Record,卷引导记录)区或PBR(Partition Boot Record,分区引导记录)区,是分区的第一个扇区(一般是512B)。
FAT12/16分区引导扇区的结构
偏移
长度
内容
0x0000
3B
跳转指令
0x0003
8B
OEM名串(厂商标志与操作系统版本,剩余字节用空格符填充)
如“MSDOS5.0”、“MSWIN4.1”、“NTFS ”、“EXFAT ”。
0x000B
25B
BPB
0x0024
26B
扩展BPB
0x005A
448B
引导程序代码
0x01FE
2B
有效结束标志(55 AA)
FAT32分区引导扇区的结构
偏移
长度
内容
0x0000
3B
跳转指令
0x0003
8B
OEM名串(厂商标志与操作系统版本,剩余字节用空格符填充)
如“MSDOS5.0”、“MSWIN4.1”、“NTFS ”、“EXFAT ”。
0x000B
53B
BPB
0x0040
26B
扩展BPB
0x005A
420B
引导程序代码
0x01FE
2B
有效结束标志(55 AA)
3.BPB与EPBP
BPB(BIOS Parameter Block,BIOS参数块)是一种数据结构,用于描述数据存储卷(如硬盘的卷分区)的物理布局。EBPB(Extended BIOS Parameter Block,扩展BPB)是BPB的补充。
BPB结构(25B)
偏移
长度
内容
0x0B
2B
每扇区字节数(一般为512)
0x0D
1B
每簇扇区数
0x0E
2B
保留扇区数[含本扇区](≥1,FAT32一般为32)
0x10
1B
FAT数(一般为2)
0x11
2B
最大根目录项数(FAT32必须为0)
0x13
2B
总扇区数(为0时使用偏移0x20处的4字节值)(<64K,容量<32MB)
0x15
1B
介质描述符(盘类型,高密度3.5寸软盘为0xF0、硬盘和U盘为0xF8)
0x16
2B
FAT占扇区数(FAT32为0,参见偏移0x24)
0x18
2B
每道扇区数
0x1A
2B
磁头数
0x1C
4B
隐藏扇区数
0x20
4B
总扇区数(≥64K,容量≥32MB)
FAT32的补充BPB结构(28B)
偏移
长度
内容
0x24
4B
每个FAT占用的扇区数
0x28
2B
镜像标志(位7为1时位0~3为活动FAT数-1、位7为0时运行的FAT被映射到所有的FAT、其余位保留)
0x2A
2B
文件系统版本(定义为0)
0x2C
4B
根目录首簇号(一般为2,即第一个簇)
0x30
2B
FS信息扇区号(一般为1,即三个FAT32引导扇区的第二个)
0x32
2B
备份的三个FAT32引导扇区的首个扇区号(一般为6)
0x34
12B
保留(必须为0)
EBPB结构(26B)
FAT12/16偏移
FAT32偏移
长度
内容
0x24
0x40
1B
物理驱动器编号(可移动介质为0x00、硬盘为0x80)
0x25
0x41
1B
保留(一般为0)
0x26
0x42
1B
扩展引导标签(为0x29时表明下面有三项存在,为0x28时表明有下面只有序列号一项存在[EPBP的早期格式])
0x27
0x43
4B
卷ID(序列号,在系统格式化分区时所产生的一个随机数)
0x2B
0x47
11B
卷标(剩余字节用空格符填充,如“NO NAME ”)
0x36
0x52
8B
文件系统类型(剩余字节用空格符填充,如“FAT16 ”)
4.FS信息扇区
FS(Free Space?,空闲空间)信息扇区(Information Sector)是FAT32引进的,用于加速获取空闲空间等操作。该扇区的位值由FAT32补充BPB结构中偏移0x30处的值决定,一般为1,即是三个FAT32引导扇区的第二个。
FAT32的FS信息扇区结构(512B)
偏移
长度
内容
0x000
4
签名标识(=RRaA)
0x004
480
保留(全=0)
0x1E4
4
签名标识(=rrAa)
0x1E8
4
卷中的空闲数据簇数
0x1EC
4
最近分配的数据簇数
0x1F0
12
保留(全=0)
0x1FC
4
签名标识(=0x00、0x00、0x55、0xAA)
2 FreeDOS与Bochs虚拟机的配置
为了使用FAT12文件系统,我们需要一个有现成DOS操作系统的虚拟机环境。为了同时也可以使用软盘映像来制作我们的操作系统,还需要支持双软盘映像的虚拟机。Virtual PC显然不能满足这些要求,而小巧的Bochs虚拟机则完全符合我们的需要。
2.1 DLX Linux Demo
如果大家在安装Bochs虚拟机时,选择了完全安装(包含DLX Linux Demo),则会自动生成dlxlinux子目录及一系列文件,并会在桌面上生成批处理文件run.bat对应的图标。双击该图标,运行结果如下:
Linux Demo in Bochs显示窗口
run.bat文件的内容为(改变当前目录、启动bochs):
cd "C:\Program Files\Bochs-2.5.1\dlxlinux"
..\bochs -q -f bochsrc.bxrc
2.2 FreeDOS
FreeDOS是一种自由开源的兼容DOS操作系统,由Jim Hall领导一个团队于1994年中开始开发,1998年1月12日推出最初的0.05版,2006年9月3日推出1.0版,2012年1月2日推出1.1版。官方网站(http://www.freedos.org/)提供可安装的光盘映像文件fd11src.iso(38.9MB)下载,也可以从我的个人网页上下载。
安装完整的FreeDOS 1.1,需要100MB的硬盘空间,可以将其安装到在Virtual PC中新创建的FreeDOS虚拟机中。具体细节我这里就不介绍了,因为我们准备改用Bochs虚拟机,来进行我们下一步的实验。
可以从我的个人网页上,下载我自己制作的1.1版的系统软盘映像FDOS11.img,到Bochs虚拟机安装目录的dlxlinux子目录中。
2.3 Bochs配置文件
与Virtual PC通过对话框来设置虚拟机参数不同,Bochs是通过配置文件来设置虚拟机的各种参数,包括安装软盘和设置启动盘。
在Windows平台下的Bochs虚拟机的配置文件为bochsrc.bxrc,例如DLX Linux Demo的bochsrc.bxrc内容为:
###############################################################
# bochsrc.txt file for DLX Linux disk image.
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=../BIOS-bochs-latest
vgaromimage: file=../VGABIOS-lgpl-latest
# what disk images will be used
floppya: 1_44=floppya.img, status=inserted
floppyb: 1_44=floppyb.img, status=inserted
# hard disk
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17
# choose the boot disk.
boot: c
# default config interface is textconfig.
#config_interface: textconfig
#config_interface: wx
#display_library: x
# other choices: win32 sdl wx carbon amigaos beos macintosh nogui rfb term svga
# where do we send log messages?
log: bochsout.txt
# disable the mouse, since DLX is text only
mouse: enabled=0
# enable key mapping, using US layout as default.
#
# NOTE: In Bochs 1.4, keyboard mapping is only 100% implemented on X windows.
# However, the key mapping tables are used in the paste function, so
# in the DLX Linux example I'm enabling keyboard_mapping so that paste
# will work. Cut&Paste is currently implemented on win32 and X windows only.
#keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-us.map
#keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-fr.map
#keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-de.map
#keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-es.map
其中红色标识的部分涉及软硬盘映像文件的设置及启动盘的设置。
我们可将配置文件中软盘A的映像文件,从“floppya.img”改为FreeDOS的“fdos11.img”(在DOS操作系统中,文件名和命令行是不区分字母大小写的)。再将“boot:”后的“c”改为“floppy”,即从原来的硬盘C(Demo Linux)启动变成从软盘A(FreeDOS)启动。
重新启动Linux Demo in Bochs 2.5.1虚拟机,则运行结果如下:
老版本FreeDOS的运行界面
3 创建FAT12软盘
3.1 创建软盘映像
现在我们使用的是Bochs虚拟机,所以我们也用Bochs提供的磁盘映像创建工具(一种控制台程序)来创建新软盘映像。
选中“开始/程序/Bochs 2.5.1/Disk Image Creation Tool”项,启动Bochs的磁盘映像创建工具程序bximage.exe,会出现如下控制台窗口:
Disk Image Creation Tool程序窗口
键入“fd”回车,选择创建软盘映像(默认为硬盘映像)
直接回车,选择默认的1.44MB的高密度软盘
键入软盘映像文件的名称MyOS.img(默认的为a.img)后回车
按任意键完成创建
被创建的软盘映像文件MyOS.img,大小为1.44MB,位于Bochs的安装目录“C:\Program Files\Bochs-2.5.1\”中,可将其移至“dlxlinux”子目录中。
如果我们用WinHex查看MyOS.img文件,会发现里面全是0。
刚创建的MyOS.img中全是0
3.2 修改配置文件
为了让Bochs虚拟机使用我们创建的新软盘映像,需要修改Bochs的配置文件。将其中的“floppyb.img”改为我们的“myos.img”。
重新启动Bochs虚拟机,并用DOS的查看目录命令“dir b:”来查看软盘B,则得到的是普通致命错误的提示信息,这是因为软盘映像中缺少必须的分区和格式化信息。可以按两次a字符退回DOS提示符。参见下图:
软盘B的普通致命错误信息
退回DOS提示符
3.3 FAT12软盘结构
1.44MB软盘的格式:2个磁头(head)/ 盘面(side)、每磁头80个柱面(cylinder)/磁道(track)、每个柱面有18个扇区(sector)、每个扇区有512个字节(byte),所以软盘的容量为:
2磁头*80柱面*18扇区*512B=2880扇区*512B=1474560B=1440KB=1.44MB
对1.44MB软盘,采用FAT12文件系统,引导扇区中没有分区信息,但有根目录区(224条目*32B = 7168B = 14扇区)。
FAT12的每个FAT项占12位(1.5B),每个簇只有一个扇区。整个软盘2880个扇区,需要2880*1.5B = 4320B = 8.44个扇区,所以每个FAT表的大小设为9个扇区。
1.44MB软盘的FAT12文件系统结构
起始扇区号
占用扇区数
内容
CHS参数
0
1(512B)
引导程序
起:0/0/1、止:0/0/1
1
9(4608B)
FAT1
起:0/0/2、止:0/0/10
10
9(4608B)
FAT2
起:0/0/11、止:1/0/1
19
14(9728B)
根目录
起:1/0/2、止:1/0/15
33
2847(1457664B)
文件数据区
起:1/0/16、止:79/1/18
FAT12分区引导扇区的结构
偏移
长度
内容
0x0000
3B
跳转指令(jmp 地址 nop = EB ?? 90)
0x0003
8B
OEM名串(虚拟软盘的为“VPC4 ”)
0x000B
25B
BPB
0x0024
26B
扩展BPB
0x005A
448B
引导程序代码
0x01FE
2B
有效结束标志(55 AA)
FAT12的BPB结构(25B)
偏移
长度
内容
1.44M软盘值
10M硬盘值
3M硬盘值
0x0B
2B
每扇区字节数(一般为512)
200H=512
200H=512
200H=512
0x0D
1B
每簇扇区数
1
8
2
0x0E
2B
保留扇区数[含本扇区](≥1)
1
1
1
0x10
1B
FAT数(一般为2)
2
2
2
0x11
2B
最大根目录项数
E0H=224
200H=512
E0H=224
0x13
2B
总扇区数(<64K,容量<32MB)
B40H=2880
5027H=20519
1801H=6145
0x15
1B
介质描述符(盘类型,高密度3.5寸软盘为0xF0、硬盘和U盘为0xF8)
F0H
F8H
F8H
0x16
2B
FAT占扇区数
9
0BH=11
0AH=10
0x18
2B
每道扇区数
12H=18
11H=17
11H=17
0x1A
2B
磁头数
2
4
4
0x1C
4B
隐藏扇区数(对无分区的介质必须为0)
0
11H=17
0
0x20
4B
总扇区数(≥64K,容量≥32MB)
0
0
0
FAT12的EBPB结构(26B)
FAT12/16偏移
长度
内容
1.44M软盘值
10M硬盘值
0x24
1B
驱动器号(软0/硬0x80)
0
80H
0x25
1B
保留(一般为0)
0
0
0x26
1B
扩展引导标签(一般为0x29)
29H
29H
0x27
4B
卷ID(序列号,随机数)
如D2 07 04 22
如全0
0x2B
11B
卷标(不足补空格)
如“NO NAME ”
如全空格符
0x36
8B
文件系统类型(不足补空格)
“FAT12 ”
“FAT12 ”
Virtual PC虚拟机生成的1.44MB虚拟软盘的引导扇区
FreeDOS 1.1系统软盘FDOS11.img的引导扇区
展开阅读全文