我如何从第二阶段引导加载程序将更多代码加载到内存中?
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 16
和 BITS 32
到 assemble 16 位与 32 位模式。您甚至可以为 far-jmp 到 32 位代码使用标签,而不是到您加载代码的硬编码地址。
另请参阅:
- How to load second stage boot loader from first stage?(两阶段引导加载程序设置类似于您所问的内容。)
我加载了我的第二个扇区(引导加载程序扩展),代码为:
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 16
和 BITS 32
到 assemble 16 位与 32 位模式。您甚至可以为 far-jmp 到 32 位代码使用标签,而不是到您加载代码的硬编码地址。
另请参阅:
- How to load second stage boot loader from first stage?(两阶段引导加载程序设置类似于您所问的内容。)