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?
我知道当我的汇编文件中定义了 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,所有内容都已充分指定。
| 归档时间: |
|
| 查看次数: |
63 次 |
| 最近记录: |