在引导扇区中加载内核

时间:2014-01-11 06:43:30

标签: kernel nasm bootloader

我很新并且对这个引导程序感到困惑。我使用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.

任何答案都会非常有用,因为我真的迷失了。

1 个答案:

答案 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