FAT 文件系统 布局
创建 硬盘
第一步 : 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 文件系统
磁盘的第一个——也就是 0 号扇区被称为主引导记录扇区,也称为主引导 记录 MBR(Master Boot recorder,MBR)。
MBR 由 446 个字节的引导代码、64 字节的主分区(4 个)表及两个字节的签名值“55 AA”组成。
上面创建完成后 可以看到 前 0x59 个 字节 是用来存储, FAT32 的一些相关信息的。
然后 第 0x5A~ 0x1FF 是 没有 实际用途的 ,只是存放了 段文字来输出显示, 所以 想要实现 引导 就要 修改这里的 代码 使它 能 检索存放在数据区 的 引导程序。
挂载 后 就可以往 里面 写数据了。
FAT 表起始项 = 保留扇区数 * 扇区字节数 (512)
FAT表 从 2号 位置开始 前 2个 是系统保留 存储 特定 信息的。
修改BOCHS 配置文件
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” |
这里注意 往上有很多资料 和我自己研究的格式有些出入,我用ubuntu 18 格式化出来的FAT32 的 目录项 占 用 64 个字节 前 32 个 好像保存的是长文件名目录。如果文件名 只有 11 个字节的 读取 后面 32 个字节 开头 前 11 个字节就好了。
然后 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 ⬆️------->
引导 加载成功:
MyGitHub:
https://github.com/qiaojinxia/HelloOperationSystem 文件名: fat32boot.asm
如果本文 有帮到您,不要吝啬你的Start!