2014-01-11 66 views
2

我对这个引导加载程序非常陌生和困惑。我使用QEMU引导程序。我真的遇到了如何在NASM中加载内核或某些.asm文件的问题。我已经实现了我的内核文件,我想把它加载到我的启动文件中。在引导程序中加载内核

我只要按照互联网有什么用建立一个引导扇区说,我想出了这个:

[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

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

; 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功能2

.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 
+0

不错,看起来很简单。我可以一点一点地理解。重置已经实现并且堆栈设置良好。但是,它仍然不加载我的内核文件。什么似乎是问题?你能教我更多吗?如果您需要更清晰的信息,我可以将我的启动扇区编辑为整个nasm代码。 – ThisGuy

+0

尝试使用一些调试环境。 – user35443

相关问题