Bootsector

di il
1 risposte

Bootsector

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

1 Risposte

  • Re: Bootsector

    Ho risolto, era come pensavo caricavo due volte in memoria lo stesso settore dell'HD, ho risolto modificando questa riga

    mov cx, 0x0001 ; Cilindro 0, Settore 2

    con

    mov cx, 0x0002 ; Cilindro 0, Settore 2
Devi accedere o registrarti per scrivere nel forum
1 risposte