Kernel 在引导扇区中加载内核

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

我是个新手,对这个引导程序感到困惑。我使用QEMU引导加载程序。我在实现如何在NASM中加载内核或一些.asm文件时遇到了一些问题。我已经实现了我的内核文件,我想把它加载到我的引导扇区文件中

我只是按照互联网上的说法建立了一个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.

任何答案都会很有帮助,因为我真的迷路了。

你可以把你的内核放在任何你想放的地方。 对您来说,最简单的解决方案是用零填充引导加载程序扇区的其余部分,然后继续在同一文件中编写代码

; 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代码进行编辑。请尝试使用一些调试环境。