Frage

Wir arbeiten an einem Projekt zu lernen, wie man einen Kernel zu schreiben und die Ins und Outs lernen. 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:

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 es zu tuckern und Drossel verursacht. Darüber hinaus wird der Bootloader und die Arbeit tun Kern in bochs wie wir die Nachricht „Willkommen in unserem OS“ erhalten. Wie auch immer, die folgende ist, was wir für einen Kernel an dieser Stelle haben.

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 Kompilierung 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 auf die Diskette als solche:
cp kernel.sys /dev/fd0

Wie gesagt, diese Werke in bochs . Aber das Booten von der Diskette geben wir bekommen in etwa so:

  

Laden Kernel Shell
  ...........
  ERROR: Drücken Sie die Taste zum Neustart

Weitere Besonderheiten: OpenSUSE 11.2, GNOME-Desktop, AMD x64 Jede andere Informationen, die ich verpasst haben, fühlen Sie sich frei zu fragen. Ich habe versucht, alles zu bekommen hier das wäre nötig. Wenn es nötig ist, kann ich einen Weg finden, die gesamte bootloader.asm irgendwo bekommen geschrieben. Wir sind nicht wirklich interessiert GRäBT entweder aus mehreren Gründen in Verwendung. Das könnte sich ändern, aber wir wollen das Boot erfolgreich sehen, bevor wir wirklich GRUB betrachten.

EDIT: Der Boot-Loader ist annehmen 512 Bytes sein, in den Bootsektor geschrieben (erster Sektor) der Scheibe. Nehmen Sie mein Wort für es, Bootloader ist 512 Bytes zusammengestellt. Der Kernel ist suppose im nächsten Sektor zu sein.

War es hilfreich?

Lösung

Wenn Sie kernel.sys wollen im zweiten Sektor zu starten, verwenden Sie diese anstelle von cp.

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

oder unter der Annahme, bootloader.bin ist genau 512 Bytes, das funktioniert auch:

cat bootloader.bin kernel.sys > /dev/fd0
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top