我很新并且对这个引导程序感到困惑。我使用QEMU bootloader。我在实现如何在NASM中加载内核或某些.asm文件时遇到了问题。我已经实现了我的内核文件,我想将它加载到我的bootsector文件中。
我只是按照互联网对构建一个bootsector所说的话来说,我想出了这个:
[BITS 16]
[ORG 0x7C00]
mov [bootdrv], dl ;put drive number
;disable interrupt, set stack, enable interrupt
cli
mov ax, 0x9000
mov ss, ax
mov sp, 0
sti
...
*some code here nothing to do with loading
...
.load_kernel:
call read_kernel ; Load stuff from the bootdrive
jmp dword KERNEL_SEGMENT:0
read_kernel:
push ds
.reset:
mov ax, 0 ;reset disk
mov dl, [bootdrv] ;drive to reset
int 13h
jc .reset ;try again if fail
pop ds
.read:
*this is where I became confused and lost. I read that you should
locate your kernel and pass around using the bootdrv(drive number)
and return. I can't seem to understand.
任何答案都会非常有用,因为我真的迷失了。
答案 0 :(得分:1)
您可以将内核放置在任何您想要的位置。 最简单的解决方案是用零填充bootloader的其余部分,然后继续在同一个文件中编写代码。
; your code
...
; bootloader has 512 bytes, so...
; fill up to 510 bytes with zeroes and ...
times 510-($-$$) db 0
; place the boot signature on the end
dw 0xAA55
要加载,您可以使用中断2
的函数0x13
。
.read:
push es ; save ES if there's something important in it
; load the "kernel" at KERNEL_SEGMENT:0
mov ax, KERNEL_SEGMENT
mov es, ax
xor bx, bx
; your kernel will have 512 bytes (1 sector) for now
mov al, 0x1
; get the saved drive number back to DL
mov dl, [bootdrv]
mov dh, 0x0 ; head 0
mov cl, 0x2 ; start reading from 2nd sector
; read
int 0x13
pop es ; restore ES
ret ; return and continue after call instruction