【问题标题】:How i can load more code to memory from a second-stage bootloader?如何从第二阶段引导加载程序将更多代码加载到内存中?
【发布时间】:2019-11-15 03:27:58
【问题描述】:

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

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)

【问题讨论】:

    标签: assembly nasm x86-16 bootloader bios


    【解决方案1】:

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

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


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

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

    另见:

    【讨论】:

    • 我明白了,我将加入 2 个内核(现在有意义),谢谢
    猜你喜欢
    • 2013-05-05
    • 2016-03-22
    • 2019-08-24
    • 2019-07-08
    • 2011-12-04
    • 2016-02-14
    • 2019-07-20
    • 2020-10-21
    • 2013-08-24
    相关资源
    最近更新 更多