如何复制现有的 BOB 并将其放入我的引导加载程序代码中

How can I copy an existent BPB and put it in my bootloader code

我目前正在开发一个简单的操作系统(GitHub: https://github.com/Nutty000/PlanetOS)

我想让 os 在真正的硬件上工作,但由于文件系统的原因我很难做到...我希望我的 OS 基于 FAT32文件系统,但我需要以某种方式不覆盖 MBR 上的 BPB。我考虑过编写一个程序来复制现有的 BPB 并将其放在我的 .bin 可启动文件的开头,但是:

  1. 我不知道如何制作那个程序,与磁盘相关的东西对我来说太难和混乱了

  2. BPB 太大,如果我复制它,那么我的引导加载程序代码将无法容纳 512 个字节

  3. 我不知道应该复制现有 MBR 代码的哪些部分

我花了几个小时试图解决这个问题,所以如果我犯了任何语法错误,请原谅。

MBR 中没有 BPB。您正在混合使用两种类型的引导扇区。

MBR(主引导记录)是磁盘上的第一个扇区。它在从偏移量 01BEh 开始的分区 table 中包含分区信息。在这种引导扇区中,前446个字节(512-64-2)可供引导扇区程序使用,其任务是加载DBR。
DBR(DOS 引导记录)是分区上从分区 table 设置 bootable 的第一个扇区。这种引导扇区确实包含一个 BPB(BIOS 参数块)。对于 FAT32,它占据前 90 个字节。考虑到最后的强制引导扇区签名,您有 420 字节 (512-90-2) 可用。

I have no idea how to make that program, disk related stuff is too hard and confusing for me

这对于想要创建自己的人来说太糟糕了 OS。

The BPB is too large and if I copy it then my bootloader code wont fit in 512 bytes

您必须针对代码大小优化您的代码。所需的结构就是它们。

I don't know what parts of the existent MBR code I should copy

首先将现有的 DBR 从磁盘复制到文件,例如。 'MyDBR.bin'。 然后像这样写你的引导扇区(FASM):

  jmp begin
  nop
  FILE 'MyDBR.bin':3,87
Begin:

  ...

  times 510-($-$$) db 0
  dw 0AA55h

对于 MBR

MBR“应该”(见注释)具有 BPB 的唯一情况是未分区的磁盘,其中磁盘的第一个扇区也是文件系统的第一个扇区。这主要是旧软盘,除此之外别无他物(其他所有东西要么使用分区,要么使用具有不同规则的 ISO9660 等文件系统)。

注意:“应该”表示某些操作系统(例如 Windows)如果没有 BPB 会抱怨磁盘未格式化。固件或硬件对 BPB 的存在没有严格的要求;你的 OS 可以根据自己的需要制定自己的规则。

对于旧软盘,通常 OS 开发人员会进行相反的操作 - 例如他们将拥有(或编写)一个实用程序来创建大小为 right/desired 的软盘 image/s(例如,标准 3.5 英寸软盘为 1440 KiB),为该软盘格式创建合适的 BPB;然后将图像复制到他们想要的任何软盘中,而不用关心软盘以前的内容(可能在格式化软盘之后立即或作为格式化软盘的一部分)。更常见的是(现在软盘本身已经过时以至于它们在实践中实际上不存在)软盘映像直接在模拟器中使用,或者合并到 CD image/ISO 中并用于软盘仿真,其中没有涉及物理软盘(并且没有“以前的内容”)。

如果您确实需要在保留现有 BPB 的同时写入磁盘的新第一个扇区;然后你可以编写一个实用程序来完成它(例如,将旧的第一个扇区读入缓冲区,然后覆盖缓冲区中 BPB 之前的前几个字节和缓冲区中 BPB 之后的其余部分,然后将修改后的缓冲区写回磁盘);或者您可以使用现有工具(具体来说,大多数 *nix 系统上的 dd 实用程序)。

另请注意,FAT32 对软盘没有意义(由于您需要 FAT12 的卷很小)。

对于 FAT32 分区的第一个扇区(不是 MBR)

对于分区磁盘,如果您使用 FAT32,除了 BPB(FAT32 需要)之外,分区的第一个扇区可能包含引导加载程序的第一个扇区(对于 BIOS,而不是 UEFI)文件系统)。在这种情况下,它主要是将相同的解决方案应用于不同的扇区(例如,用一个好的 BPB 覆盖以适应 partition/disk,或者使用工具来保留旧的 BPB 并且只修改第一个扇区的“非 BPB”部分).

请注意,最终您将编写某种 OS 安装程序,允许用户创建 partition/s、格式化 partition/s 并安装 OS新的 partition/s(包括启动 loader/s 和许多其他文件)。通常,您编写的 OS 安装程序将 运行 在您编写的 OS 之上(并从 CD 或 USB 启动);除了使用您的内核、驱动程序等

之外,还将回收您为 OS 编写的一堆实用程序(例如分区管理工具等)
  1. I don't know what parts of the existent MBR or 1st sector of partition code I should copy

BPB 的位置和大小取决于它的版本。幸运的是,它们都在维基百科上有描述(位于 https://en.wikipedia.org/wiki/BIOS_parameter_block )。

大多数情况下,为了涵盖“worst/largest 案例”,您要确保您的引导加载程序不使用偏移量 0x000B 到 0x0059(以及您用来合并引导加载程序的任何 tool/s具有预先存在的 BPB 的第一个扇区保留从偏移量 0x000B 到 0x0059 的字节。

当然,对于 512 字节的扇区大小,BPB 丢失大约 80 字节会使引导加载程序的第一个扇区更难包含找到正确分区所需的代码,然后加载其自身的其余部分或第二阶段(特别是如果有足够的 sanity/error 检查和足够的错误消息)。有时人们通过在安装引导加载程序时设置一些变量(例如“分区中第二个扇区的 LBA”)来缓解这个问题(如果您编写自己的引导加载程序安装程序,这相对容易)。