我如何从第二阶段引导加载程序将更多代码加载到内存中?

How i can load more code to memory from a second-stage bootloader?

我加载了我的第二个扇区(引导加载程序扩展),代码为:

mov ah, 00;                     // reset disk
int 13h;                        // disk interrupt

mov ax, 0x0000;                 // register ax [0000]:1000
mov bx, 0x1000;                 // register bx  0000:[1000]

mov ah, 0x2;                    // read sector instruction
mov al, 0x2;                    // sectors to read
mov ch, 0x0;                    // cylinder
mov cl, 0x6;                    // local to write
mov dh, 0x0;                    // head

int 0x13;                       // call the disk interupter

jmp 0x0000:0x1000;              // Jump to kernel

但我想在内存中加载另一个内核(保护模式内核),我如何使用这段代码加载它或者我必须使用其他方式?

bootloader = 1 个扇区 512 字节

内核 x16 = 2 个扇区 1024 字节

内核 x32 = 2 个扇区 1024 字节(我知道我可以加载更多,更改 AL)

您不想在 16 位内核 运行 上加载 32 位内核,因此您需要为要加载的数据使用不同的内存地址。 (在磁盘读取调用和远程跳转中)。

但是,是的,当您仍处于 16 位实模式时,显然相同的 BIOS 调用以相同的方式工作。 @MichaelPetch 在 Do I have to keep changing sectors or can I load multiple 上评论说,您可以安全地加载多个扇区,但为了可移植到有问题的 BIOS,您应该避免加载太多以致跨越柱面边界。如果是这种情况,请使用多个调用。


只制作一个具有 16 位入口点的组合内核并使用一个 4 扇区加载从引导加载程序加载整个内核会更简单。

您可以在一个 NASM 源文件中使用 BITS 16BITS 32 到 assemble 16 位与 32 位模式。您甚至可以为 far-jmp 到 32 位代码使用标签,而不是到您加载代码的硬编码地址。

另请参阅:

  • How to load second stage boot loader from first stage?(两阶段引导加载程序设置类似于您所问的内容。)