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

问题描述 投票:0回答:1

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

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)

assembly nasm x86-16 bootloader bios
1个回答
0
投票

您不想在运行时在16位内核上加载32位内核,因此您需要使用其他内存地址来加载数据。 (在磁盘读取呼叫和远端jmp中。)>

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


[使用16位入口点组合内核,然后通过一个4扇区加载从Bootloader加载整个程序会更简单。

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

另请参见:

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.