Fehler mit Bootstraploader und Kernel
-
22-09-2019 - |
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.
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