dal 2015 - visita n. 684
SSO
SSO

 

Senza Sistema Operativo

Non seguitemi. E' una idea folle, passeggera. Avete capito bene: Senza Sistema Operativo. Ma cosa ci si può fare con il solo hardware ? Nulla, secondo i benpensanti, è solo uno sfizio. Ed allora silenzio, anzi S.S.O....

Intanto, non è vero che è solo hardware. Poco, ma un po' di software sulla scheda madre c'è. E non solo su quella. Naturalmente certe comodità bisogna, almeno all'inizio, scordarsele. E' come fare le vacanze in uno di quei campeggi di una volta. Niente lusso, ma si riesce lo stesso a sopravvivere e volendo ci si diverte pure.
Ecco il punto: il divertimento, la passione, la conoscenza.

Introduzione al BOOT

Il primo settore di un dischetto (Cilindro 0, Lato 0, Settore 1) è il boot sector; di solito ha le dimensioni di 512 byte. Contiene le informazioni relative al tipo di formattazione e le istruzioni necessarie per il caricamento del Sistema Operativo.
Gli ultimi 2 byte del boot sector hanno il valore caratteristico di 55h e AAh. Negli Hard disk il boot sector si trova all'inizio di ciascuna partizione avviabile (bootabile).

Ecco un modo facile per leggere il settore di boot di un floppy:

Verranno visualizzate due schermate simili alle seguenti:


-L 100 0 0 1
-D 100 L 100
166D:0100  EB 3C 90 4D 53 44 4F 53-35 2E 30 00 02 01 01 00   .<.MSDOS5.0.....
166D:0110  02 E0 00 40 0B F0 09 00-12 00 02 00 00 00 00 00   ...@............
166D:0120  00 00 00 00 00 00 29 33-BC 55 B8 4E 4F 20 4E 41   ......)3.U.NO NA
166D:0130  4D 45 20 20 20 20 46 41-54 31 32 20 20 20 33 C9   ME    FAT12   3.
166D:0140  8E D1 BC F0 7B 8E D9 B8-00 20 8E C0 FC BD 00 7C   ....{.... .....|
166D:0150  38 4E 24 7D 24 8B C1 99-E8 3C 01 72 1C 83 EB 3A   8N$}$....<.r...:
166D:0160  66 A1 1C 7C 26 66 3B 07-26 8A 57 FC 75 06 80 CA   f..|&f;.&.W.u...
166D:0170  02 88 56 02 80 C3 10 73-EB 33 C9 8A 46 10 98 F7   ..V....s.3..F...
166D:0180  66 16 03 46 1C 13 56 1E-03 46 0E 13 D1 8B 76 11   f..F..V..F....v.
166D:0190  60 89 46 FC 89 56 FE B8-20 00 F7 E6 8B 5E 0B 03   `.F..V.. ....^..
166D:01A0  C3 48 F7 F3 01 46 FC 11-4E FE 61 BF 00 00 E8 E6   .H...F..N.a.....
166D:01B0  00 72 39 26 38 2D 74 17-60 B1 0B BE A1 7D F3 A6   .r9&8-t.`....}..
166D:01C0  61 74 32 4E 74 09 83 C7-20 3B FB 72 E6 EB DC A0   at2Nt... ;.r....
166D:01D0  FB 7D B4 7D 8B F0 AC 98-40 74 0C 48 74 13 B4 0E   .}.}....@t.Ht...
166D:01E0  BB 07 00 CD 10 EB EF A0-FD 7D EB E6 A0 FC 7D EB   .........}....}.
166D:01F0  E1 CD 16 CD 19 26 8B 55-1A 52 B0 01 BB 00 00 E8   .....&.U.R......
-
Schermata n. 1



-D 200 L 100
166D:0200  3B 00 72 E8 5B 8A 56 24-BE 0B 7C 8B FC C7 46 F0   ;.r.[.V$..|...F.
166D:0210  3D 7D C7 46 F4 29 7D 8C-D9 89 4E F2 89 4E F6 C6   =}.F.)}...N..N..
166D:0220  06 96 7D CB EA 03 00 00-20 0F B6 C8 66 8B 46 F8   ..}..... ...f.F.
166D:0230  66 03 46 1C 66 8B D0 66-C1 EA 10 EB 5E 0F B6 C8   f.F.f..f....^...
166D:0240  4A 4A 8A 46 0D 32 E4 F7-E2 03 46 FC 13 56 FE EB   JJ.F.2....F..V..
166D:0250  4A 52 50 06 53 6A 01 6A-10 91 8B 46 18 96 92 33   JRP.Sj.j...F...3
166D:0260  D2 F7 F6 91 F7 F6 42 87-CA F7 76 1A 8A F2 8A E8   ......B...v.....
166D:0270  C0 CC 02 0A CC B8 01 02-80 7E 02 0E 75 04 B4 42   .........~..u..B
166D:0280  8B F4 8A 56 24 CD 13 61-61 72 0B 40 75 01 42 03   ...V$..aar.@u.B.
166D:0290  5E 0B 49 75 06 F8 C3 41-BB 00 00 60 66 6A 00 EB   ^.Iu...A...`fj..
166D:02A0  B0 4E 54 4C 44 52 20 20-20 20 20 20 0D 0A 52 69   .NTLDR      ..Ri
166D:02B0  6D 75 6F 76 65 72 65 20-73 75 70 70 6F 72 74 69   muovere supporti
166D:02C0  2E FF 0D 0A 45 72 72 6F-72 65 20 64 69 73 63 6F   ....Errore disco
166D:02D0  FF 0D 0A 50 72 65 6D 65-72 65 20 75 6E 20 74 61   ...Premere un ta
166D:02E0  73 74 6F 20 70 65 72 20-72 69 61 76 76 69 61 72   sto per riavviar
166D:02F0  65 0D 0A 00 00 00 00 00-00 00 00 AC C2 D1 55 AA   e.............U.
-
Schermata n. 2

Queste due schermate ci serviranno, in seguito, per illustrare alcuni passaggi importanti.
Intanto possiamo notare, nella prima schermata, la stringa MSDOS5.0 benchè il floppy sia stato formattato con Windows XP; mentre, nella seconda schermata, la presenza dei codici 55h AAh negli ultimi 2 byte del settore.
Attenzione: si tenga presente che l'offset iniziale, usato da debug per caricare il settore, parte da 0100h.
Invece gli indirizzi usati nella descrizione del settore presuppongono un offset iniziale di 0000h, quindi occorrerà sempre detrarre il valore 0100h dall'offset indicato nelle schermate di esempio per ottenere l'offset effettivo.

Un attimo prima del BOOT

Appena portati a termine i vari test iniziali (POST = Power On Self Test), BIOS cercherà di caricare un sistema operativo tentando di leggere, in sequenza, il primo settore (Cilindro 0, Testina 0, Settore 1) di un disco presente in uno dei lettori A:, C:, D: (o in un altro ordine a seconda delle impostazioni predefinite). Il contenuto di questo settore verrà memorizzato in RAM all'indirizzo 0000h:7C00h. Nel caso di un dischetto si avrà la situazione mostrata in figura:


Appena letto il settore, BIOS controlla che gli ultimi 2 byte siano 55h e AAh. In caso affermativo BIOS considera il boot sector valido e passa quindi l'esecuzione all'indirizzo 0000:7C00h, caricando i registri CS=0000h e IP=7C00h.
D'ora in poi tutto dipende da ciò che è stato scritto nel codice di boot. Al momento del passaggio i registri della CPU contengono valori qualsiasi, tranne DL che contiene il numero del lettore dal quale e' stato eseguito il boot.

Una delle prime cose da fare (si trova in qualsiasi boot) e' l'impostazione dello lo stack in modo tale che non vada a cancellare il codice appena caricato. Dato che lo stack cresce verso gli indirizzi più bassi si imposta, di norma, SS=0000h ed SP=7C00h e cosi' non si dovrebbero creare problemi di sovrascrittura.


E' ovvio che non essendo stato ancora caricato nessun sistema operativo si potrà disporre solo dei servizi offerti da BIOS, delle informazioni già presenti in RAM all'indirizzo 0040:0000h e seguenti, e delle informazioni memorizzate in RTC.

Struttura del BOOT Record

I primi 61 byte (da 00h a 3Dh) del settore di Boot hanno un significato particolare, descritto nella tabella "SCHEMA DEL BOOT RECORD".
Per maggior comodità viene utilizzata la numerazione esadecimale cominciando a contare da 00h; il confronto fatto con la parte iniziale della schermata n. 1, ottenuta con DEBUG, comporterà l'aggiunta della costante 100h.


166D:0100  EB 3C 90 4D 53 44 4F 53-35 2E 30 00 02 01 01 00   .<.MSDOS5.0.....
166D:0110  02 E0 00 40 0B F0 09 00-12 00 02 00 00 00 00 00   ...@............
166D:0120  00 00 00 00 00 00 29 33-BC 55 B8 4E 4F 20 4E 41   ......)3.U.NO NA
166D:0130  4D 45 20 20 20 20 46 41-54 31 32 20 20 20 33 C9   ME    FAT12   3.
Parte iniziale della Schermata n. 1


SCHEMA DEL BOOT RECORD
 Posiz.  Lungh. DescrizioneNote
00h3 byteInizio programma. ByPass Area Dati.E9 xx xx oppure EB xx 90
03h8 byteIdentificativo del S.O. (O.E.M. Name)(MSDOS5.0)
0Bh2 bytenumero di bytes per settore (0200h)=(512)
0Dh1 bytenumero di settori per cluster (01h)=(1)
0Eh2 bytenumero di settori riservati all'inizio (0001h)=(1)
10h1 bytenumero di copie della FAT (02h)
11h2 bytenumero di voci della directory radice(00E0h)=(224)
13h2 bytenumero totale dei settori sul disco(0B40h)=(2880)
15h1 byteID del formato del dischetto (F0h) vedi tabella succ.
16h2 bytenumero di settori assegnati alla FAT(0009h)=(9)
18h2 bytenumero di settori per traccia (0012h)=(18)
1Ah2 bytenumero di lati / testine (0002h)=(2)
1Ch4 bytenumero di settori speciali riservati (00000000h)=(0)
20h4 byteN. totale settori (=Partition Table)
24h2 byten. drive fisico (0000h)
26h1 byteID record avviamento (29h)
27h4 byteNumero di serie casuale(B855:BC33)
2Bh11 byteEtichetta Volume ("NO NAME ")
36h8 byteID file system(FAT12)
3Eh448 byteCorpo del programma di bootMassimo 448 byte
1FEh2 byteIdentificativo Settore di Boot55h AAh

Le parti indicate in rosso sono costituite da codice eseguibile, tutte le altre sono dei dati. Le due parti in giallo sono rispettivamente la Bios Parameter Block e la Extended Bios Parameter Block. I dati in verde sono degli identificativi.

INDENTIFICATORI DEL FORMATO DEL DISCO
CodiceCapacitáDescrizione
FDh360 Kb9 settori 40 tracce 512 bytes per settore
F9h720 Kb9 settori 80 tracce 512 bytes per settore
F9h1.2 Mb15 settori 80 tracce 512 bytes per settore
F0h1.44 Mb18 settori 80 tracce 512 bytes per settore
F8h---- Disco fisso

Nota: le strutture numeriche multiple del byte (word, doppie word, etc.) vengono rappresentate in memoria con la sequenza di byte rovesciata, in pratica si incontra prima l'ultimo byte poi il penultimo e così via fino al primo byte. C'è una logica in tutto questo: il microprocessore memorizza sempre i byte meno significativi negli indirizzi più bassi ed i byte più significativi negli indirizzi più alti.

Prima Prova

La prima cosa che viene in mente, a questo punto, è di effettuare una semplicissima prova per tentare un boot da floppy. Supponiamo semplicemente di voler scrivere il messaggio "CIAO" sul video, attendere la battuta di un tasto qualsiasi e quindi riavviare il computer. Un possibile listato può essere il seguente:

SEG_A           SEGMENT BYTE PUBLIC
                ASSUME  CS:SEG_A
                ORG     0

zzBOOT          PROC    FAR
START:          JMP     SHORT Begin
Msg             DB      "CIAO",0
Begin:          CLD                             ; Imposta Flag Direzione
                SUB     AX,AX                   ; Azzera AX
                CLI                             ; Disabilita gli interrupt
                MOV     SS,AX                   ; Azzera SS
                MOV     SP,7C00h                ; Inizializza Stack a 0000:7C00
                STI                             ; Riabilita gli interrupt
                MOV     AX,07C0h                ; Posiziona DS al segmento di BOOT
                MOV     DS,AX
                MOV     SI,Offset Msg           ; Scrittura Messaggio
                MOV     AH,0Eh
                SUB     BX,BX
Work:           LODSB                           ; Lettura Carattere in AL
                CMP     AL,0                    ; Test se AL=0
                JZ      Exit
                INT     10h                     ; Video display   ah=func 0Eh
                JMP     Work
Exit:           MOV     AH,0                    ; Attesa tasto
                INT     16h
                DB      0EAh, 0, 0, 0FFh, 0FFh  ; Codice del Reset
zzBOOT          ENDP

                
; Il file zzBOOT.COM deve essere lungo esattamente 512 byte ed avere come
; ultimi 2 byte 55h e AAh.

Zavorra         DB      510 - (Offset Zavorra - Offset Start) DUP(0)
                DB      55H,0AAH                ; Chiusura Standard
SEG_A           ENDS
                END
Listato Prima Prova: zzBOOT.ASM

memorizziamo il listato con il nome zzBOOT.ASM e seguiamo le istruzioni per la compilazione:

     tasm zzBOOT
     tlink zzBOOT
     exe2 zzBOOT.exe zzBOOT.com

Attenzione: per ottenere il .COM non possiamo utilizzare "tlink /t zzBOOT" in quanto viene generato un errore per la non presenza di ORG 100h. Utilizziamo allora una utility meno pretenziosa di nome "exe2.exe" oppure "exe2bin.exe".
Nella borsa attrezzi sono disponibili tutti gli strumenti per la compilazione.

Il passo successivo consiste nella preparazione del floppy, ma non essendoci ancora nessun sistema operativo a disposizione non è possibile copiarvi zzBOOT.COM come fosse un file. Ecco come procedere:

    1) Utilizzare un floppy vuoto formattato
    2) Entrare in debug con il comando: DEBUG zzBOOT.COM
    3) Scrivere sul primo settore del floppy con:  w 100 0 0 1
    4) Uscire da debug con il comando: q

Siamo quasi pronti per il collaudo. Ricordiamo che i computer possono eseguire il BOOT: da Floppy, da Disco rigido, da CD-ROM. Generalmente partono da Disco rigido perchè in fase di "setup" sono stati preimpostati con questa opzione, quindi per partire da floppy occorre prima preimpostare questa opzione. E quindi:

    1) Verificare che il computer sia impostato per il boot da A:
    2) A computer spento, inserire il floppy nel lettore
    3) Accendere il computer ed aspettare il BOOT
    4) Verrà visualizzato il messaggio "CIAO"
    5) Premere un tasto qualsiasi per provocare un REBOOT
    6) Estrarre subito il floppy


Seconda Prova

Nel corso della Prima Prova siamo proprio andati all'essenziale ed abbiamo calpestato clamorosamente sia il BPB sia l'EBPB. Infatti, con ogni probabilità, se si prova ad inserire il floppy in condizioni normali e si tenta di leggerlo verrà emesso o un messaggio di errore o un messaggio inconsistente con la struttura del floppy.
Ecco allora pronta una Seconda Prova che rispetta il Blocco di Parametri del Bios. La struttura del programma è praticamente la stessa, soltanto che abbiamo inserito, nell'area dati, i due Blocchi di Parametri del Bios presi di peso dalla Schermata n. 1.

SEG_A           SEGMENT BYTE PUBLIC
                ASSUME  CS:SEG_A
                ORG     0

zzBOOT          PROC    FAR
START:          JMP     SHORT Begin
                NOP
                DB                     4Dh, 53h, 44h, 4Fh, 53h, 35h, 2Eh, 30h, 00h, 02h, 01h, 01h, 00h 
                DB      02h,0E0h, 00h, 40h, 0Bh,0F0h, 09h, 00h, 12h, 00h, 02h, 00h, 00h, 00h, 00h, 00h 
                DB      00h, 00h, 00h, 00h, 00h, 00h, 29h, 33h,0BCh, 55h,0B8h, 4Eh, 4Fh, 20h, 4Eh, 41h 
                DB      4Dh, 45h, 20h, 20h, 20h, 20h, 46h, 41h, 54h, 31h, 32h, 20h, 20h, 20h
Msg             DB      "CIAO",0
Begin:          CLD                             ; Imposta Flag Direzione
                SUB     AX,AX                   ; Azzera AX
                CLI                             ; Disabilita gli interrupt
                MOV     SS,AX                   ; Azzera SS
                MOV     SP,7C00h                ; Inizializza Stack a 0000:7C00
                STI                             ; Riabilita gli interrupt
                MOV     AX,07C0h                ; Posiziona DS al segmento di BOOT
                MOV     DS,AX
                MOV     SI,Offset Msg           ; Scrittura Messaggio
                MOV     AH,0Eh
                SUB     BX,BX
Work:           LODSB                           ; Lettura Carattere in AL
                CMP     AL,0                    ; Test se AL=0
                JZ      Exit
                INT     10h                     ; Video display   ah=func 0Eh
                JMP     Work
Exit:           MOV     AH,0                    ; Attesa tasto
                INT     16h
                DB      0EAh, 0, 0, 0FFh, 0FFh  ; Codice del Reset
zzBOOT          ENDP

                
; Il file zzBOOT2.COM deve essere lungo esattamente 512 byte ed avere come
; ultimi 2 byte 55h e AAh.

Zavorra         DB      510 - (Offset Zavorra - Offset Start) DUP(0)
                DB      55H,0AAH                ; Chiusura Standard
SEG_A           ENDS
                END
Listato Seconda Prova: zzBOOT2.ASM

Procedendo come nel caso precedente si otterrà un nuovo dischetto di Boot, equivalente dal punto di vista delle prestazioni, ma riconoscibile da Bios e quindi, in questo caso, non ci saranno errori quando si tenterà di utilizzarlo "normalmente".



Asm86
Senza Sistema Operativo



Non e' possibile costruire sul vertice delle piramidi.
Anonimo 1983

Valid CSS!
pagina generata in 0.001 secondi