Kernel 在引导扇区中加载内核
我是个新手,对这个引导程序感到困惑。我使用QEMU引导加载程序。我在实现如何在NASM中加载内核或一些.asm文件时遇到了一些问题。我已经实现了我的内核文件,我想把它加载到我的引导扇区文件中 我只是按照互联网上的说法建立了一个bootsector,我想到了这个:Kernel 在引导扇区中加载内核,kernel,nasm,bootloader,Kernel,Nasm,Bootloader,我是个新手,对这个引导程序感到困惑。我使用QEMU引导加载程序。我在实现如何在NASM中加载内核或一些.asm文件时遇到了一些问题。我已经实现了我的内核文件,我想把它加载到我的引导扇区文件中 我只是按照互联网上的说法建立了一个bootsector,我想到了这个: [BITS 16] [ORG 0x7C00] mov [bootdrv], dl ;put drive number ;disable interrupt, set stack, enable interr
[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.
任何答案都会很有帮助,因为我真的迷路了。你可以把你的内核放在任何你想放的地方。 对您来说,最简单的解决方案是用零填充引导加载程序扇区的其余部分,然后继续在同一文件中编写代码
; 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
对于加载,您可以使用中断的函数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
很好,看起来很简单。我能一点一点地理解。重置已经很好地实现,堆栈设置也很好。但是,它仍然没有加载我的内核文件。有什么问题吗?你能多教我一些吗。如果您需要更清晰的信息,我可以将引导扇区作为整个nasm代码进行编辑。请尝试使用一些调试环境。