如何制作软盘映像并覆盖 MBR

如何制作软盘映像并覆盖 MBR

我正在尝试制作一个具有有效文件系统的软盘映像,以便我可以测试 2 阶段引导加载程序。当我尝试安装软盘,然后将cp第二个二进制文件安装到它上面时,mount一切都不顺利。以下是我正在尝试使用的步骤:

dd if=/dev/zero of=floppy.img bs=512 count=2948
mkfs.vfat floppy.img
dd if=boot1.bin of=floppy.img bs=512 count=1
su -c 'mount -t msdos -o loop floppy.img /mnt'

dmesg | tail

[591461.669870] FAT: invalid media value (0x09)
[591461.669876] VFS: Can't find a valid FAT filesystem on dev loop0.

答案1

您正在了解使用 POSIX 工具集处理此类问题的一些问题。将引导程序安装到卷的 VBR 中是不是只需将一个充满数据的扇区归咎于图像中的扇区 #0。您必须保留现有的BIOS 参数块,应对几种 BPB 变体。

MS/PC/DR-DOS、OS/2 和 Windows NT 等操作系统附带的工具了解 BPB 等所有事物。它们的各种syssysinstxbootsect其他工具知道如何处理事情。但是如果你使用 POSIX 工具,那么dd你必须手动告诉他们在 VBR 中要覆盖哪些字节以及要保留哪些字节。

ms-sys也知道如何保存 BPB,但它没有应用自定义引导程序的选项。去请求它作为新功能。

答案2

实际上,我很久以前(20 世纪 90 年代初)就编写了一个两阶段软盘引导加载程序。无论各种规范(来自 Microsoft 或其他“专家”)如何规定,软盘的第一个扇区必须符合带有 BIOS 参数块 (BPB) 的标准 MS-DOS 软盘。您看到的错误消息似乎表明您的“boot1.bin”不符合此要求。您真正可以更改的只有软盘引导扇区中大约 400 个字节的代码。您无法根据 MS-DOS 或 Windows 对软盘的使用自定义 BPB 值。

尽管有一个值可以指示引导代码占用的扇区数,但我遇到的每个 BIOS 和其他软件(当时)都只期望或容忍一个用于引导的保留扇区。需要两个 FAT 副本,然后是根目录的第一个扇区。我用于存储辅助引导加载程序的方法是硬分配根目录后面的一些扇区,然后在 FAT 中将这些扇区标记为“坏”。这实现了以下目标:

  1. 二级加载程序使用的附加扇区位于软盘上的固定位置,并且第一阶段引导程序知道这些扇区,因此必须读取/加载它们。

  2. 对用户隐藏了辅助加载器。

  3. 使得辅助加载器无法删除。

  4. 该软盘可在 DOS 中使用并可在 Unix 中安装。

软盘有一个引导扇区。它是不是称为 MBR,因为没有分区表。

答案3

我想写一个完整的答案。首先,在 Linux 中,请按照以下两条指令开始:

dd if=/dev/zero of=floppy.img bs=512 count=2948
mkfs.vfat floppy.img

这将创建一个兼容 DOS4/OS2 的 FAT12 磁盘,其中包含扩展的 BIOS 参数块,如维基百科“FAT 文件系统的设计”

前 3 个字节“eb 3c 90”是机器语言:JMP 3E \ NOP,表示跳过 BIOS 参数块并开始运行字节偏移量 62(十进制)处的代码 [3E = 3C + 2(基数 16)= 62(基数 10)]。

从偏移量 62 开始,接下来的 378 个字节由您编写引导程序。默认程序会打印一条消息,等待按键,然后重新启动。

创建一个名为 myBoot.bin 的文件,其中包含 378 字节 x86 二进制程序。

它是仅有的378 字节...你执行此操作,但如果您确实需要一个起点,请使用以下命令:

 dd bs=1 count=378 of=myBoot.bin if=floppy.img skip=62 conv=notrunc

最后,用您自定义的 myBoot.bin 程序覆盖软盘的现有 MBR:

dd bs=1 count=378 if=myBoot.bin of=floppy.img seek=62 conv=notrunc

您现已成功创建软盘映像并覆盖了默认的启动程序。

相关内容