虽然我定义了 ORG 7C00,但 ISO 文件显示 D800

ali*_*ali 1 x86 kernel nasm osdev bootloader

我正在尝试开发一个引导加载程序。但有一个部分我不明白。我知道当我的汇编文件中定义了 ORG 7C00 时,程序将加载到磁盘 7C00 上。我将其编译为二进制文件并在 Magic ISO 中创建了 iso 文件。然后,当我查看 ISO 文件的十六进制版本时,我看到我编写的代码是从 D800 地址开始的。不是应该安装在7C00吗?

org 0x7C00
bits 16

start:
    cli

times 510 - ($ - $$) db 0
dw 0xAA55
Run Code Online (Sandbox Code Playgroud)

https://i.stack.imgur.com/TFVDE.png

我还有另一个问题。地址 D010 处还有另一个引导加载程序签名。为什么?

https://i.stack.imgur.com/dyZgl.png

另外,我还想知道一件事。我想将一些文件放入我的 ISO 文件中,并且想在此级别读取这些文件。我在 VirtualBox 中进行实验。如何读取 ISO 文件中的文件。或者我如何运行一个程序。所以我想做的就是将内核放置在这里并从引导加载程序加载它。

如果我错了,是否有资源详细说明如何加载引导加载程序以及如何加载 BIOS?

Bre*_*dan 5

我知道当我的汇编文件中定义了 ORG 7C00 时,程序将加载到磁盘 7C00 上。

告诉ORG 0x7C00汇编器它应该假设代码将使用该起始地址运行。它不保证代码实际上会在该起始地址运行。

然后,当我查看 ISO 文件的十六进制版本时,我看到我编写的代码是从 D800 地址开始的。不是应该安装在7C00吗?

文件没有地址,只有偏移量。您希望您的代码将从“文件中的偏移 0xD800”加载到“RAM 中的地址 0x7C00”。

地址 D010 处还有另一个引导加载程序签名。为什么?

一张可启动CD-ROM(根据我对相关规格的模糊记忆);扇区为 2048 字节,前 16 个扇区未使用,应该为零,然后在之后的某个时刻出现一个“引导记录”列表。固件应该检查​​这些记录以确定引导什么(例如,您可以拥有一个用于 PowerPC 的引导加载程序、一个用于 80x86 的引导加载程序、一个用于 Itanium 的引导加载程序……并且固件将自动选择任何一个有意义的引导加载程序)。0xAA55 是其中的一部分(但我不记得它是针对每个条目,还是在所有条目列表的末尾)。

请注意,如果您的引导记录显示“80x86,无仿真,在内存中加载段 = 0x1234”,那么 BIOS 将加载整个引导加载程序文件,不会关心该文件中的任何位置是否有不必要的 0xAA55 签名,并且会加载它进入内存中请求的段;并且“内存中的段”是唯一确定代码加载地址的东西(并且需要与您以“load_address = load_segment_in_boot_record * 16 + 0 =known_segment * 16 + ORG_from_assembler”方式告诉汇编器的ORG相匹配)。

或者; 如果您的引导记录显示“模拟软盘”或“模拟硬盘”,那么固件将执行其指示的操作,包括低效的“读取 2048 字节扇区并丢弃其中的 75% 以假装扇区为 512 字节”之类的操作),并包括将其加载到地址 0x00007C00。当然,这是为了解决古代操作系统(例如 MS-DOS)的问题,这些操作系统是在 CD-ROM 出现之前编写的,无法正确支持从 CD-ROM 启动。

如果我错了,是否有资源详细说明如何加载引导加载程序以及如何加载 BIOS?

用于从 CD-ROM 启动;您想要的文档是“El Torito 可启动 CD-ROM 格式规范版本 1.0,1995 年 1 月 25 日”(很容易通过网络搜索找到,可能在这里: https: //pdos.csail.mit.edu/6.828/2018/读物/boot-cdrom.pdf)。

对于启动网络,您需要 PXE 规范(请参阅: https: //en.wikipedia.org/wiki/Preboot_Execution_Environment - 底部有一个链接)。

对于从软盘和硬盘驱动器启动,存在“从一代传递到下一代的继承行为”(并且没有官方规范);但大约有 5000 个不同的教程涵盖了它,但都略有错误。

用于从 USB 闪存启动;没有规范,而且一团糟(固件进行“启发式黑客攻击”,试图决定它是否应该像带有 BPB 且没有分区的软盘一样运行,或者像带有分区但没有 BPB 的硬盘驱动器一样运行;结合固件特定的怪癖) 。

当然,现在已经是 2022 年了,所以最好将所有这些都扔进垃圾桶,只支持 UEFI,所有内容都已充分指定。