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