FAT 文件系统 布局

vfat改为efi_文件系统

创建 硬盘

第一步 : bximage -> 选1 -> [hd] 回车 -> [flat]回车 -> 大小自定义 我选的36 -> [c.img]自己命名 -> 完成
第二步 : 格式化 成FAT32 系统 找一个 ubuntu 系统.
敲如下 命令:

sudo mkfs.vfat -F 32 c.img 格式化成 FAT32
vim c.img 打开 c.img
:% !xxd 二进制查看
mount c.img /xxx/ -t vfat -o loop 挂载 fat 文件系统

vfat改为efi_加载_02

磁盘的第一个——也就是 0 号扇区被称为主引导记录扇区,也称为主引导 记录 MBR(Master Boot recorder,MBR)。
MBR 由 446 个字节的引导代码、64 字节的主分区(4 个)表及两个字节的签名值“55 AA”组成。
上面创建完成后 可以看到 前 0x59 个 字节 是用来存储, FAT32 的一些相关信息的。
然后 第 0x5A~ 0x1FF 是 没有 实际用途的 ,只是存放了 段文字来输出显示, 所以 想要实现 引导 就要 修改这里的 代码 使它 能 检索存放在数据区 的 引导程序。
挂载 后 就可以往 里面 写数据了。

FAT 表起始项 = 保留扇区数 * 扇区字节数 (512)
FAT表 从 2号 位置开始 前 2个 是系统保留 存储 特定 信息的。

修改BOCHS 配置文件

vfat改为efi_加载_03


vfat改为efi_根目录_04

vfat改为efi_加载_05

bochs 开启硬盘 读取

ata0-master: type=disk, path=“c.img”, mode=flat,cylinders=73,heads=16,spt=63

FAT32文件系统,格式和 FAT12 大同小异。
主要变化:
扇区簇大小:512 字节 -> 4K
根目录项数:

偏移

字节数

含义


0x00B

2

每扇区字数

0x0200

0x00D

1

每簇扇区数

0x08

0x00E

2

保留扇区数

0x03F8

0x010

1

FAT个数

0x02

0x011

2

根目录项数,FAT32以突破该限制,无效

0x0000

0x013

2

扇区总数,小于32M使用

0x0000

0x015

1

存储介质描述负

0x0F8

0x016

2

每FAT表占用扇区数 ,小于32M使用

0x0000

0x018

2

逻辑每磁道扇区数

0x003F

0x01A

2

逻辑磁头数

0x00FF

0x01C

4

系统隐含扇区数

0x00000080

0x020

4

扇区总数,大于32M使用

0x00784F80

0x024

4

每FAT表扇区数,大于32M使用

0x00001E04

0x028

2

标记

0x0000

0x02A

2

版本 (通常为零)

0x0000

0x02C

4

根目录起始簇

0x00000002

0x030

2

Boot占用扇区数

0x0001

0x032

2

备份引导扇区位置

0x0006

0x034

12

保留 的12个字节的

0x00

0x042

1

扩展引导标记

0x29

0x043

4

序列号

0x6A9C4125

0x047

10

卷标 转成字符即

“NO NAME”

0x052

8

文件系统 转成字符即

“FAT32”

vfat改为efi_根目录_06

这里注意 往上有很多资料 和我自己研究的格式有些出入,我用ubuntu 18 格式化出来的FAT32 的 目录项 占 用 64 个字节 前 32 个 好像保存的是长文件名目录。如果文件名 只有 11 个字节的 读取 后面 32 个字节 开头 前 11 个字节就好了。

vfat改为efi_加载_07


然后 1a 处 是 文件簇 的 索引 如果 FAT表里面 是0X0fffffff 说明是左后一个文件。

FAT分区信息 需要 按照自己的硬盘字节信息做修改

主要修改: 磁头信息 ,每个磁道扇区数,总扇区数 ,FAT表扇区大小。

;*************************************************************************
;Name: CaoMaoBoy
;E-mail:1158829384@qq.com
;-------------------------------------------------------------------------
;系统启动引导加载程序
;从Fat32 文件系统 加载 启动 OS
;*************************************************************************
[BITS 16]
[ORG 0x0000]
     jmp	short Fat32Boot_Start	;跳转指令,转到0000:7C3E 3个字节
     nop
     OEM_ID                db 		"CBOS0.01";系统版本号   8个字节
     BytesPerSector        dw 		0x0200;每扇区字节数   2个字节
     SectorsPerCluster     db 		0x01;每簇扇区数 默认 8 1个字节 ;----簇的大小
     ReservedSectors       dw 		0x20;保留扇区个数   2个字节
     ;-------16 bit ⬆️------->
     TotalFATs             db 		0x02;FAT表格数 默认2 1个字节
     MaxRootEntries        dw 		0x00;根目录最多可容纳 目录数 历史字段 FAT32不适用 2个字节
     NumberOfSectors       dw 		0x00;扇区总数 小于32M 在这记录 大于32M 改TotalSectors  2个字节
     MediaDescriptor       db 		0xF8;介质描述 0xF8位硬盘 1个字节
     SectorsPerFAT         dw 		0x00;每个FAT表 的大小扇区数 FAT32 已经不使用了 2个字节
     SectorsPerTrack       dw 		63;每个磁道扇区数 S          ---------->不同硬盘改动 2个字节
     SectorsPerHead        dw 		16;磁头数    H            ---------------->修改 2个字节
     HiddenSectors         dd 		0x00;分区目前已使用 隐藏扇区数 4个字节
     ;-------16 bit ⬆️------->
     TotalSectors     	   dd 		0x11f70;大于32M这里修改 扇区数 ---------------> 4个字节
     BigSectorsPerFAT      dd 		0x0236;每个FAT表使用扇区数  ----------->  4个字节
     Flags                 dw 		0x00;标记 2个字节
     FSVersion             dw 		0x00;版本号 2个字节
     RootDirectoryStart    dd 		0x02;根目录簇号 4个字节 起始于数据区的  + 2个簇 4个字节
     ;-------16 bit ⬆️------->
     FSInfoSector          dw 		0x01;文件系统信息扇区 2个字节
     BackupBootSector      dw 		0x06;备份引导扇区 位于文件系统的6号扇区 2个字节
     TIMES 12              db       0x00;预留12字节未使用
     ;-------16 bit ⬆️------->
     DriveNumber           db 		0x80;驱动器编号 0号设备 1个字节
     ReservedByte          db   	0x00;预留  1个字节
     Signature             db 		0x29;扩展引导标记 1个字节
     VolumeID              dd 		0x00 ;4个字节
     VolumeLabel           db 		"QUASI  BOOT" ;11个字节
     SystemID              db 		"FAT32   ";文件系统 8个字节
     ;-------30 bit ⬆️------->

引导 加载成功:

vfat改为efi_加载_08

MyGitHub:

https://github.com/qiaojinxia/HelloOperationSystem 文件名: fat32boot.asm
如果本文 有帮到您,不要吝啬你的Start!