Buonasera. Sto cercando di scrivere un sistema operativo minimale per mettere in pratica quello che sto studiando all'università nel corso di sistemi operativi.
Ho creato un piccolo bootsector ed un piccolo kernel in assembler. Il kernel non fa altro che stampare un messaggio e basta non fa nulla per ora.
Dopo aver creato i due fie binari in NASM li concateno con il comando COPY e lancio QEMU impostando il file creato come disco fisso.
I processo di boot parte e va tutto bene, cioè non tutto altrimenti non avrei scritto qui , per testare il funzionamento stampo una stringa all'avvio ed una dopo che leggo dal disco il secondo settore che contiene il kernel. Succede che questi messaggi vengono ripetuti per 2 volte.
Non riesco quindi a capire se il problema è che io dopo aver caricato il kernel faccio il jump sempre al punto di ingresso del boot Sector, anche se penso non sia così perché il bootsector viene carticato a 0x7c00, è lungo 512 byte ed io salto a 0x7E00 che dovrebbe essere giusto, oppure carico sempicemente in memeoria 2 volte il boot Sector in quanto passo dei parametri errati ai registri che poi uso con l'int 13h
Vi posto il codice del bootsector:
;*********************************************
; Boot1.asm
; - Settore di boot
;*********************************************
bits 16 ; Real Mode a 16 bit
org 0x7c00 ; Indirizzo in cui deve essere caricato il boot sector
start:
jmp loader ; Salta all'etichetta loader
msg1 db "Prima fase OS", 0
fail db "Boot disk read failure!", 0
msg2 db "OK settore caricato", 0
%include "charservice.asm"
%include "diskservice.asm"
; Punto di ingresso del bootloader
loader:
xor ax, ax ; Azzera AX
mov ds, ax ; Copia AX in DS
mov es, ax ; Copia AX in ES
mov si, msg1 ; carica in SI il puntatore del messaggio
call Print ; richiama la funzione di stampa
; Carica il kernel
load_kernel:
mov al, 0x01 ; Carica un settore
mov bx, 0x7E00 ; Locazione di destinazione
mov cx, 0x0001 ; Cilindro 0, Settore 2
mov dl, 0x0080 ; primo drive
xor dh, dh ; Testina 0
call read_sectors_16
jnc .success
mov si, fail
call Print
.success:
mov si, msg2 ; carica in SI il puntatore del messaggio
call Print ; richiama la funzione di stampa
jmp 0x7E00
times 510 - ($-$$) db 0 ; Riempe di 0 i byte dalla fine del bootsector fino al byte 5010
dw 0xAA55 ; Scrive la signature al byte 511 e 512