首页 > 解决方案 > 如何从第二阶段引导加载程序将更多代码加载到内存中?

问题描述

我使用该代码加载我的第二个扇区(引导加载程序扩展):

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

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

引导加载程序 = 1 扇区 512 字节

内核 x16 = 2 扇区 1024 字节

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

标签: assemblynasmx86-16bootloaderbios

解决方案


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

但是,是的,当您仍处于 16 位实模式时,显然相同的 BIOS 调用以相同的方式工作。@MichaelPetch 评论了我是否必须不断更改扇区,或者我可以加载多个,您可以安全地加载多个扇区,但是为了便于移植到有问题的 BIOS,您应该避免加载太多以至于您越过柱面边界。如果是这种情况,请使用多个调用。


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

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

也可以看看:


推荐阅读