Anno: 1992

Capitolo 2

Intestazione di blocco = ARENA HEADER

Il DOS alloca la memoria, che verra' destinata ai programmi, in modo dinamico.
Il termine di allocazione dinamica si riferisce al fatto che gli applicativi possono allocare e rilasciare aree di memoria servendosi delle funzioni del DOS.
Il S.O. divide queste aree in blocchi ai quali antepone un'intestazione o descrittore di blocco chiamata ARENA HEADER.
Le intestazioni sono collegate in modo da permettere la ricerca di blocchi liberi.

I blocchi possono essere liberi o assegnati e quando un blocco assegnato viene rilasciato esso si fonde con le aree libere adiacenti per cui non possono esistere 2 blocchi consecutivi liberi.

L' area allocata dinamicamente viene allocata dal DOS a gruppi di 16 Byte chiamati paragrafi, che possono iniziare solo ad indirizzi multipli di 16 Byte detti Indirizzo di Paragrafo.
Cio' permette al DOS ed agli applicativi di riferirsi alle aree di memoria servendosi del solo indirizzo di segmento assumendo che questo e' formato dal valore appropriato seguito dall'offset che e' 0. ( Esempio 1C5A:0000 ).
La catena delle intestazioni dei blocchi ed i contenuti delle intestazioni stesse sono dati critici del sistema; se essi fossero sovrascritti dagli applicativi il DOS non sarebbe piu' in grado di gestire la memoria ed il sistema andrebbe in blocco.
E' di importanza estrema che questa struttura interna del DOS non sia manipolata direttamente dai programmi.
MSDOS pone in un area della memoria bassa, riservata ai dati di sistema, una serie di informazioni di proprieta' del S.O.
In quast'area e' presente l' indirizzo che punta all' intestazione del primo blocco di memoria allocata dinamicamente.
Questo indirizzo e' rilevabile tramite la funzione 52h dell'interrupt 21h.
Sia la funzione in oggetto, peraltro non documentata, che la struttura della intestazione di blocco di memoria, vengono considerate come dati riservati del DOS e quindi non manipolabili.

----------------------------

NOTA : Il valore 011C, che apparira' in seguito, e' legato alla configurazione della macchina usata per le prove e quindi potra' essere diverso su altre macchine. TUTTI i valori verranno espressi in formato ESADECIMALE.

----------------------------

L'intestazione del blocco di memoria o Arena Header e' lunga 16 Byte ed inizia SEMPRE con un carattere, detto Indicatore di blocco, che puo' essere
" M " (4Dh) Se il blocco e' seguito da altri blocchi
" Z " (5Ah) Se il blocco e' l'ultimo della catena.

Qualsiasi altro carattere provoca il blocco del sistema.

Nota: Le lettere M e Z non sono state scelte a caso ma sono le iniziali di Mark Zbikowski, uno dei principali artefici del DOS, che ha voluto in questo modo lasciare la sua " firma ".

Descriveremo ora come rilevare il primo blocco di memoria ed i successivi.
Tramite L'Int.21 Funz. 52 si rileva nei registri ES:BX un indirizzo composto da Segmento:Offset che punta ad una struttura dati interna del DOS.
L'Offset e' preceduto da 2 Byte che contengono il segmento del primo descrittore di blocco.
Assumendo che la coppia ES:BX contenga 011C:0026, si esamina la word che inizia all'offset 0024 ( BX-2).
Questa contiene 5B02 (Notazione Back word) e quindi l'indirizzo del primo descrittore di blocco e' 025B.

Quanto contenuto nel primo paragrafo (16 Byte) all'indirizzo 025B:0000 fa parte del primo descrittore di blocco.
Il blocco di memoria inizia esattamente alla fine del paragrafo e quindi all'indirizzo 025B:0010 o 025C:0000 che e' poi la stessa cosa.

Nel nostro caso specifico, il primo blocco di memoria di cui abbiamo esaminato il Descrittore, e' un'area contenente dei dati di sistema e precisamente i driver installabili definiti nel file CONFIG.SYS ed i parametri di configurazione ( FILES, FCBS, BUFFERS ecc.)
Il PROPRIETARIO DEL BLOCCO non punta al P.S.P. (Prefisso di Segmento del Programma) di un programma specifico ed il valore rilevato, 0008, e' l'indirizzo del paragrafo di segmento della routine dell' Int.20. ( Anche il valore rilevato nei primi 2 byte del P.S.P dei programmi si riferisce allo stesso interrupt)
La DIMENSIONE DEL BLOCCO indica l'ampiezza dello stesso in 11F90h byte.
Questo valore sommato al valore ASSOLUTO dell'indirizzo 025B = 25B0 + 10 rappresenta l' indirizzo di segmento dove si trova il successivo descrittore di blocco.
Il NOME DEL BLOCCO contiene il nome del proprietario del programma; nel nostro caso contiene " SD " che significa System Data e quindi il blocco e' di proprieta' di MSDOS.

Con riferimento alla descrizione della struttura del Descrittore di blocco, risaliremo la catena delle intestazioni fino alla fine, assumendo che la ricerca e' stata eseguita con DEBUG.COM .

Sommando il valore assoluto del segmento alla dimensione assoluta del blocco:
25B0 + 11F90 + 10 otteniamo 14550 che tradotto nella forma Segmento:Offset viene rappresentato come 1455:0000
A questo indirizzo troviamo il secondo Descrittore di blocco :

Notare che 1455:0050 e' uguale a 145A:0000 come vedremo in seguito

Con riferimento al sistema di decodifica descritto in precedenza scopriamo che:
L' INDICATORE DI BLOCCO e' 4D
Il PROPRIETARIO DEL BLOCCO punta a 0008
La DIMENSIONE DEL BLOCCO e' 0004 x 10 = 40 ( 4 Paragrafi )
Il NOME DEL BLOCCO e' SC 5343( System Code ) quindi proprieta' di MSDOS


Sommando i valori 14550 (Indirizzo segmento del secondo blocco) +
                              40 (4 paragrafi = 40h ) +
                              10 (dimensione descrittore del blocco)
           otteniamo 145A0 ossia 145A:0000

Usando il sistema di decodifica visto fino ad ora, tenendo conto della posizione dei Byte da esaminare e del calcolo dell'indirizzo di segmento sapendo che esso puo' essere definito con cifre diverse ma ottenenti lo stesso risultato ( 1455:0050 e' uguale a 145A:0000 ) continuiamo l'esame del blocco di memoria.


Notare che 145A:0010 e' uguale a 145B:0000

L' INDICATORE DI BLOCCO e' 4D
Il PROPRIETARIO DEL BLOCCO punta a 145B che e' l'inizio del PSP
La DIMENSIONE DEL BLOCCO e' 00A5 x 10 = A50 ( A5 Paragrafi )
Il NOME DEL BLOCCO e' COMMAND quindi precede il P.S.P. di COMMAND.COM


Sommando i valori 145A0 + A50 + 10 otteniamo 15000 ossia 1500:0000

L' INDICATORE DI BLOCCO e' 4D
Il PROPRIETARIO DEL BLOCCO punta a 0000 quindi il blocco e' libero (MSDOS)
La DIMENSIONE DEL BLOCCO e' 0004 x 10 = 40 ( 4 Paragrafi )
Il NOME DEL BLOCCO non esiste poiche' e' libero


Sommando i valori 15000 + 40 + 10 otteniamo 15050 ossia 1505:0000;
notare che questo indirizzo lo vediamo nella tabella precedente come 1500:0050

L' INDICATORE DI BLOCCO e' 4D
Il PROPRIETARIO DEL BLOCCO punta a 145B che e' il P.S.P. di COMMAND.COM
La DIMENSIONE DEL BLOCCO e' 0010 x 10 = 100 ( 10 Paragrafi )
Il NOME DEL BLOCCO questo e' il Blocco di Ambiente di COMMAND.COM.

La descrizione del Blocco o Segmento di Ambiente verra' ripresa in seguito.

Sommando i valori 15050 + 100 + 10 otteniamo 15160 ossia 1516:0000

L' INDICATORE DI BLOCCO e' 4D
Il PROPRIETARIO DEL BLOCCO punta a 17A7 che e' il P.S.P. di PC-CACHE
La DIMENSIONE DEL BLOCCO e' 0006 x 10 = 60 ( 6 Paragrafi )
Il NOME DEL BLOCCO questo e' il Blocco di Ambiente di PC-CACHE


Sommando i valori 15160 + 60 + 10 otteniamo 151D0 ossia 151D:0000

L' INDICATORE DI BLOCCO e' 4D
Il PROPRIETARIO DEL BLOCCO punta a 151E che e' il P.S.P. di KEYB
                                                    ( 151D:0010 = 151E:0000 )
La DIMENSIONE DEL BLOCCO e' 0184 x 10 = 1840 ( 184 Paragrafi )
Il NOME DEL BLOCCO e' KEYB quindi precede il P.S.P. di KEYB.COM


Sommando i valori 151D0 + 1840 + 10 otteniamo 16A20 ossia 16A2:0000

L' INDICATORE DI BLOCCO e' 4D
Il PROPRIETARIO DEL BLOCCO punta a 16A3 che e' il P.S.P. di DOSKEY
                                                        ( 16A2:0010 = 16A3:0000 )
La DIMENSIONE DEL BLOCCO e' 0103 x 10 = 1030 ( 103 Paragrafi )
Il NOME DEL BLOCCO e' DOSKEY quindi precede il P.S.P. di DOSKEY.COM


Sommando i valori 16A20 + 1030 + 10 otteniamo 17A60 ossia 17A6:0000

L' INDICATORE DI BLOCCO e' 4D
Il PROPRIETARIO DEL BLOCCO punta a 17A7 che e' il P.S.P. di PC-CACHE
                                                          ( 17A6:0010 = 17A7:0000 )
La DIMENSIONE DEL BLOCCO e' 03C6 x 10 = 3C60 ( 3C6 Paragrafi )
Il NOME DEL BLOCCO e' PC-CACHE quindi precede il P.S.P. di PC-CACHE.COM


Sommando i valori 17A60 + 3C60 + 10 otteniamo 1B6D0 ossia 1B6D:0000

L' INDICATORE DI BLOCCO e' 4D
Il PROPRIETARIO DEL BLOCCO punta a 0000 qindi il blocco e' libero (MSDOS)
La DIMENSIONE DEL BLOCCO e' 0007 x 10 = 70 ( 7 Paragrafi )
Il NOME DEL BLOCCO non appare poiche' e' libero


Sommando i valori 1B6D0 + 70 + 10 otteniamo 1B750 ossia 1B75:0000

L' INDICATORE DI BLOCCO e' 4D
Il PROPRIETARIO DEL BLOCCO punta a 1B76 che e' il P.S.P. di VSHIELD
                                                         ( 1B75:0010 = 1B76:0000 )
La DIMENSIONE DEL BLOCCO e' 08EF x 10 = 8EF0 ( 8EF Paragrafi )
Il NOME DEL BLOCCO e' VSHIELD quindi precede il P.S.P. di VSHIELD.COM


Sommando i valori 1B750 + 8EF0 + 10 otteniamo 24650 ossia 2465:0000

L' INDICATORE DI BLOCCO e' 4D
Il PROPRIETARIO DEL BLOCCO punta a 2472 che e' il P.S.P. di DEBUG
La DIMENSIONE DEL BLOCCO e' 000B x 10 = B0 ( B Paragrafi )
Il NOME DEL BLOCCO questo e' il Blocco di Ambiente di DEBUG.COM


Sommando i valori 24650 + B0 + 10 otteniamo 24710 ossia 2471:0000

ATTENZIONE:
L' INDICATORE DI BLOCCO e' 5A ------> ULTIMO BLOCCO DELLA CATENA
Il PROPRIETARIO DEL BLOCCO punta a 2472 che e' il P.S.P. di DEBUG
                                                       ( 2471:0010 = 2472:0000 )
La DIMENSIONE DEL BLOCCO e' 7B8E x 10 = 7B8E0 ( 7B8E Paragrafi )
Il NOME DEL BLOCCO e' DEBUG quindi precede il P.S.P. di DEBUG.COM


Essendo questo l'ultimo blocco, la sua dimensione viene allocata a tutta la memoria disponibile.
Sommando i valori 24710 + 7B8E0 otteniamo 9FFF0 ossia 9FFF:0000
Questo e' l'indirizzo dell'ultimo paragrafo di memoria e corrisponde alla fine della memoria convenzionale di 640K meno 16 Byte.

Quanto segue viene rilevato automaticamente tramite il programma di utilita' MEM.EXE facente parte del DOS 5 con il comando MEM/D
Tutti i valori sono espressi in formato Esadecimale.
L' indirizzo e' rappresentato nella forma assoluta
La dimensione e' rappresentata in Byte e non in paragrafi.

Il comando MEM consente di localizzare l'inizio dei blocchi di memoria del sistema.
A fronte di cio' ed a conferma di quanto affermato riguardo alla NON manipolazione della catena delle intestazioni di blocco, prendiamo un valore di indirizzo qualsiasi, in questo caso 25B0 che segmentato diventa 025B:0000. ( Su altri P.C. l'indirizzo puo' essere diverso)
Lanciare Debug ad al prompt digitare: F025B:0000 L 1 64
che significa: riempi il primo byte alla locazione 025B:0000 con il valore 64 ( @ ). 64 e' un valore a caso e qualsiasi altro va bene.
Confermare ed uscire da Debug digitando Q (Quit)
Il sistema rispondera' con:
Errore di allocazione della memoria
Impossibile caricare COMMAND, sistema bloccato.


Questo perche' al posto del valore 4D ( M ) che e' il carattere iniziale dell'Arena Header abbiamo inserito un altro valore rompendo in questo modo la catena dei blocchi.