从零开始写一个操作系统内核 笔记(三) 番外篇 FAT12 魔改 FAT32 文件系统 硬盘文件读取方式

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
根目录项数:

偏移字节数含义
0x00B2每扇区字数0x0200
0x00D1每簇扇区数0x08
0x00E2保留扇区数0x03F8
0x0101FAT个数0x02
0x0112根目录项数,FAT32以突破该限制,无效0x0000
0x0132扇区总数,小于32M使用0x0000
0x0151存储介质描述负0x0F8
0x0162每FAT表占用扇区数 ,小于32M使用0x0000
0x0182逻辑每磁道扇区数0x003F
0x01A2逻辑磁头数0x00FF
0x01C4系统隐含扇区数0x00000080
0x0204扇区总数,大于32M使用0x00784F80
0x0244每FAT表扇区数,大于32M使用0x00001E04
0x0282标记0x0000
0x02A2版本 (通常为零)0x0000
0x02C4根目录起始簇0x00000002
0x0302Boot占用扇区数0x0001
0x0322备份引导扇区位置0x0006
0x03412保留 的12个字节的0x00
0x0421扩展引导标记0x29
0x0434序列号0x6A9C4125
0x04710卷标 转成字符即“NO NAME”
0x0528文件系统 转成字符即“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!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值