2010-03-28 3 views
5

Wir arbeiten an einem Projekt, um zu lernen, wie man einen Kernel schreibt und lernen Sie die Details kennen. Wir haben einen Bootstrap Loader geschrieben und es scheint zu funktionieren. Allerdings haben wir ein Problem mit dem Kernel-Laden. Ich werde mit dem ersten Teil beginnen:Fehler mit Bootstrap-Loader und 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 

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

Die bootloader.asm ist zu lang für den Editor, ohne dass es tuckern und zu ersticken. Außerdem funktionieren der Bootloader und der Kernel innerhalb von bochs, da wir die Nachricht "Willkommen zu unserem Betriebssystem" erhalten. Wie auch immer, das Folgende haben wir an dieser Stelle für einen Kernel.

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 

Mit nasm 2.06rc2 ich kompilieren als solche:
nasm bootloader.asm -o bootloader.bin -f bin
nasm kernel.asm -o kernel.sys -f bin

Wir schreiben bootloader.bin auf die Diskette als solche:
dd if=bootloader.bin bs=512 count=1 of/dev/fd0

Wir schreiben kernel.sys als solche auf die Diskette:
cp kernel.sys /dev/fd0

Wie ich bereits sagte, das funktioniert in bochs. Aber von der Diskette booten erhalten wir eine Ausgabe wie so:

Loading Kernel Shell
...........
ERROR: Drücken Sie die Taste

Andere Besonderheiten neu zu starten: OpenSUSE 11.2, GNOME-Desktop, AMD x64 Alle anderen Informationen, die ich vielleicht verpasst habe, können Sie gerne stellen. Ich habe versucht, hier alles zu bekommen, was gebraucht wird. Wenn es nötig ist, kann ich einen Weg finden, den gesamten bootloader.asm irgendwo zu veröffentlichen. Wir sind nicht wirklich daran interessiert, GRUB aus verschiedenen Gründen zu verwenden. Das könnte sich ändern, aber wir wollen diesen Boot erfolgreich sehen, bevor wir wirklich GRUB in Betracht ziehen.

EDIT: Der Bootstrap-Lader soll 512 Bytes sein, geschrieben in den Bootsektor (erster Sektor) der Festplatte. Nehmen Sie mein Wort dafür, Bootloader ist 512 Bytes kompiliert. Der Kernel soll im nächsten Sektor sein.

+1

ich sehr bezweifle, dass Sie wirklich bedeuten 'cp kernel.sys/dev/fd0', die die Floppy-Gerät überschreiben würde von Anfang an. Auch wenn Sie es nicht einfügen, können Sie beschreiben, woher der Bootloader den Kernel in den Speicher laden soll? – ephemient

+0

Nun ja, das ist eigentlich was ich meine. Es ist das Beispiel, das ich erhielt, um eine Datei auf das Gerät zu kopieren. Sollte es anders sein?Ich bin sehr neu in Linux - ich bin seit 3.0 in Windows. – IAbstract

+1

Ihr 'dd' schreibt einen Sektor von' bootloader.bin' in den ersten Sektor der Diskette. Dann kopiert dein 'cp'' kernel.sys' direkt auf die Diskette und überschreibt das ... vielleicht meinst du zu 'dd seek = 1', um' kernel.sys' auf den zweiten Sektor der Diskette zu setzen? Benötigen Sie weitere Informationen zu Ihrem Bootloader, um festzustellen, ob Sie das möchten. – ephemient

Antwort

3

Wenn Sie möchten, dass kernel.sys im zweiten Sektor beginnt, verwenden Sie diesen anstelle von cp.

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

Oder unter der Annahme bootloader.bin genau 512 Bytes ist, funktioniert dies auch:

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

bootloader.bin ist genau 512 Bytes ... wird der Befehl 'cat ...' bootloader.bin in Sektor 0 (der Boot-Sektor) setzen ??? – IAbstract

+0

Es beginnt am Anfang des Raw-Geräts (Linux ist praktisch und erlaubt blockfreien Zugriff auf Geräte zu blockieren), die Sektor 0 sein kann. – ephemient

+0

Offenbar ist dies ein Problem mit dem Schreiben von '/ dev/fd0'. Selbst mit den von Ihnen bereitgestellten Beispielen wird anscheinend die Datei kernel.sys nicht geschrieben. Wenn ich ein Bild von der Diskette mache, gibt es eine 1,4Mb-Bilddatei zurück; Jedoch werden nur die ersten 512 Bytes tatsächlich mit dem Bootstrap geschrieben. Es gibt keine kernel.sys auf dem Bild. – IAbstract