我使用该代码加载第二个扇区(一个引导加载程序扩展):
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)
您不想在运行时在16位内核上加载32位内核,因此您需要使用其他内存地址来加载数据。 (在磁盘读取呼叫和远端jmp中。)>
但是,很明显,当您仍处于16位实模式时,相同的BIOS调用以相同的方式工作。 @MichaelPetch在Do I have to keep changing sectors or can I load multiple上评论说,您可以安全地加载多个扇区,但是为了可移植到有问题的BIOS,您应该避免加载太多以至于越过柱面边界。如果是这种情况,请使用多个呼叫。
[使用16位入口点组合内核,然后通过一个4扇区加载从Bootloader加载整个程序会更简单。
您可以在一个NASM源文件中使用BITS 16
和BITS 32
汇编为16位和32位模式。您甚至可以为far-jmp到32位代码使用标签,而不是在加载代码的硬编码地址中使用标签。
另请参见: