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