2010-03-28 10 views
5

Stiamo lavorando a un progetto per imparare come scrivere un kernel e imparare i dettagli. Abbiamo un caricatore di bootstrap scritto e sembra funzionare. Tuttavia stiamo avendo un problema con il caricamento del kernel. Inizierò con la prima parte:Errore nel caricatore bootstrap e nel kernel

bootloader.asm:

[BITS 16] 
    [ORG 0x0000] 
; 
; all the stuff in between 
; 
; the bottom of the bootstrap loader 

    datasector dw 0x0000 
    cluster  dw 0x0000 
    ImageName db "KERNEL SYS" 
    msgLoading db 0x0D, 0x0A, "Loading Kernel Shell", 0x0D, 0x0A, 0x00 
    msgCRLF  db 0x0D, 0x0A, 0x00 
    msgProgress db ".", 0x00 
    msgFailure db 0x0D, 0x0A, "ERROR : Press key to reboot", 0x00 

    TIMES 510-($-$$) DB 0 
    DW 0xAA55 

    ;************************************************************************* 

Il bootloader.asm è troppo lungo per l'editor, senza inducendolo a chug e soffocare. Inoltre, il bootloader e il kernel funzionano all'interno di bochs poiché viene visualizzato il messaggio "Benvenuti nel nostro sistema operativo". Ad ogni modo, il seguente è ciò che abbiamo per un kernel a questo punto.

kernel.asm:

[BITS 16] 
[ORG 0x0000] 

[SEGMENT .text]   ; code segment 
    mov  ax, 0x0100   ; location where kernel is loaded 
    mov  ds, ax 
    mov  es, ax 

    cli 
    mov  ss, ax   ; stack segment 
    mov  sp, 0xFFFF   ; stack pointer at 64k limit 
    sti 

    mov  si, strWelcomeMsg  ; load message 
    call  _disp_str 

    mov  ah, 0x00 
    int  0x16    ; interrupt: await keypress 
    int  0x19    ; interrupt: reboot 

_disp_str: 
    lodsb      ; load next character 
    or  al, al   ; test for NUL character 
    jz  .DONE 

    mov  ah, 0x0E   ; BIOS teletype 
    mov  bh, 0x00   ; display page 0 
    mov  bl, 0x07   ; text attribute 
    int  0x10    ; interrupt: invoke BIOS 

    jmp  _disp_str 

.DONE: 
    ret 

[SEGMENT .data]     ; initialized data segment 
    strWelcomeMsg db "Welcome to our OS", 0x00 

[SEGMENT .bss]    ; uninitialized data segment 

Utilizzando nasm 2.06rc2 posso compilare in quanto tale:
nasm bootloader.asm -o bootloader.bin -f bin
nasm kernel.asm -o kernel.sys -f bin

Scriviamo bootloader.bin per il floppy in quanto tale:
dd if=bootloader.bin bs=512 count=1 of/dev/fd0

Scriviamo kernel.sys sul floppy come tale:
cp kernel.sys /dev/fd0

Come ho detto, questo funziona in Bochs. Ma il boot dal floppy otteniamo in uscita in questo modo:

Caricamento Kernel Shell
...........
ERRORE: Premere il tasto per riavviare

Altre caratteristiche: OpenSUSE 11.2, desktop GNOME, AMD x64 Qualsiasi altra informazione che potrei aver perso, non esitate a chiedere. Ho cercato di mettere tutto qui che sarebbe stato necessario. Se ho bisogno di, posso trovare un modo per ottenere l'intero bootloader.asm pubblicato da qualche parte. Non siamo veramente interessati all'utilizzo di GRUB per diversi motivi. Questo potrebbe cambiare, ma vogliamo vedere questo avvio con successo prima di prendere davvero in considerazione GRUB.

MODIFICA: Il caricatore di avvio deve essere di 512 byte, scritto nel settore di avvio (molto primo settore) del disco. Credetemi, il bootloader è 512 byte compilati. Il kernel dovrebbe essere nel prossimo settore.

+1

dubito fortemente che realmente vuol dire 'cp kernel.sys/dev/fd0', che sovrascrivere il dispositivo floppy dall'inizio. Anche se non lo si incolla, si può descrivere da dove ci si aspetta che il bootloader carichi il kernel in memoria? – ephemient

+0

Beh, sì, in realtà è ciò che intendo. È l'esempio che mi è stato dato per copiare un file sul dispositivo. Dovrebbe essere diverso?Sono molto nuovo al modo Linux - Sono stato in Windows dal 3.0. – IAbstract

+1

Il tuo 'dd' scrive un settore di' bootloader.bin' nel primo settore del dischetto. Quindi il tuo 'cp' copia' kernel.sys' direttamente sul floppy, sovrascrivendo che ... forse vuoi dire 'dd seek = 1', per iniziare a mettere' kernel.sys' nel secondo settore del dischetto? Hai bisogno di maggiori dettagli sul tuo bootloader per determinare se è quello che vuoi. – ephemient

risposta

3

Se si desidera che kernel.sys inizi nel secondo settore, utilizzare questo invece di cp.

dd if=kernel.sys of=/dev/fd0 bs=512 seek=1 

Oppure, assumendo bootloader.bin è esattamente 512 byte, questo funziona anche:

cat bootloader.bin kernel.sys > /dev/fd0 
+0

bootloader.bin è esattamente 512 byte ... il comando 'cat ...' metterà bootloader.bin nel settore 0 (il settore di avvio) ??? – IAbstract

+0

Si avvierà all'inizio del dispositivo non elaborato (Linux è conveniente e consente l'accesso non blocco ai dispositivi di blocco), che risulta essere il settore 0. – ephemient

+0

Apparentemente, questo è un problema con la scrittura in '/ dev/fd0'. Anche con gli esempi forniti, apparentemente il file kernel.sys non viene scritto. Quando creo un'immagine del floppy, restituisce un file immagine da 1,4 Mb; tuttavia, solo i primi 512 byte vengono effettivamente scritti con il bootstrap. Non c'è kernel.sys sull'immagine. – IAbstract

Problemi correlati