back

le prime linee di codice di boot.s spostano il codice del bootloader all'indirizzo #INITSEG. Il registro di stack %ss viene impostato a $INITSEG.

mov ss,ax mov sp,#0x400 | arbitrary value >>512

si noti come lo stack pointer viene valorizzato a un valore arbitario maggiore di 512 bytes. Siamo realmente all'inizio della fase di boot, ricordiamoci che non siamo in protected-mode ma ancora in real address, la memoria è completamente lineare.

Una volta che il codice è stato spostato a #INITSEG, il codice stampa il messaggio di "Loading system ...".

msg1:
.byte 13,10
.ascii "Loading system ..."
.byte 13,10,13,10

Bene il codice del bootloader si trova in memoria e ora deve caricare il sistema e "qualcuno" lo dovrà avviare.

Prima di procedere, qui troviamo una delle prime differenze tra il primo kernel e i kernel recenti. Se nella prima versione del kernel Linus mise insieme la parte di bootloader con la parte di "setup" (ovviamente era una distinzione inesistente ai tempi) che si occupa di passare in modalità protetta, di chiamare la init (main.c), ecc., ai giorni nostri chi si occupa di caricare in memoria la parte di setup e l'immagine del sistema è proprio il bootloader. Come vedremo in seguito, il bootloader in avvio caricherà il setup (setup.S) e l'immagine del sistema.

mov ax,#SYSSEG
mov es,ax | segment of 0x010000
call read_it
call kill_motor

read_it è la parte di codice che attiva il floppy e carica in memoria (in SYSSEG) i settori restanti sul disco che contengono il sistema (più avanti capiremo come la memoria viene mappata).

read_it: ...
| ENDSEG = SYSSEG + SYSSIZE
cmp ax,#ENDSEG | have we loaded all yet?
jb ok1_read
ret

ENDSEG non appare da nessuna parte nel codice di boot.s. La dimensione del sistema viene calcolata nel Makefile ad anteriori:

boot/boot: boot/boot.s tools/system
(echo -n "SYSSIZE = (";ls -l tools/system | grep system \
| cut -c25-31 | tr '\012' ' '; echo "+ 15 ) / 16") > tmp.s
cat boot/boot.s >> tmp.s
$(AS86) -o boot/boot.o tmp.s
rm -f tmp.s
$(LD86) -s -o boot/boot boot/boot.

back