Anno: 1992

Capitolo 1

GESTIONE DELLA MEMORIA ALLOCATA

Solo pochi anni fa parlare di 64 Kb di memoria entusiasmava i possessori di sistemi che godevano di certe prerogative.

Quando fu progettato, al PC venne riservata una quantita' di memoria indirizzabile di 1 Mb ( 1.048.576 Byte ), ma poiche' bisognava riservare una parte di questa alla ROM si penso' bene di riservare i primi 640 Kb. alla RAM ed i seguenti 384 alla ROM.
Fatta questa divisione, sia la RAM che la ROM non occupavano per intero la memoria loro riservata ma solo una parte.
Per prima la RAM raggiunse il valore massimo di 640 Kb installati mentre la ROM ancora ora non occupa piu' di 128 Kb a parte le estensioni fornite con driver esterni.
Nelle macchine dotate di Microprocessore 80286 e superiori e' possibile avere della memoria RAM supplementare detta Memoria Estesa che puo' arrivare fino a 64 Mb. nei sistemi dotati di 386 o 486.
Tale memoria non e' pero' gestibile direttamente e necessita quindi di un apposito software altamente specializzato e complesso.
Su tutte le macchine, comprese quelle basate su 8086, e' possibile aumentare la memoria RAM aggiungendo apposite schede ed un Gestore di memoria Espansa secondo le specifiche LIM ( Lotus, Intel, Microsoft ), in questo caso si puo' espandere la memoria fino a 32 Mb. , non direttamente gestibile e sempre con l'ausilio di software speciale.

Nelle ROM sono contenute tutte le informazioni che permettono al PC di essere operativo. Esse sono scritte in modo permanente e non possono venir perse a macchina spenta ne venire modificate.
In ROM sono contenuti i programmi ed i dati necessari per far funzionare il Computer e le sue periferiche.

Le componenti principali delle ROM sono :
Le Routine di Avviamento che hanno il compito di far partire il Computer.
Il BIOS ( Basic Input Output System ) della ROM che fornisce un gruppo di routine in linguaggio macchina per il supporto dei servizi operativi del Computer.
Le Estensioni della ROM ossia quelle routine che appartengono a Drive o Apparecchiature supplementari collegate al Computer.

Il Controller della Western Digital che fungeva da supporto agli Hard-Disk montati su Olivetti M24, all'accensione del Computer segnalava :
Optional ROM at address C800:0000
Questo significava che alla ROM presente se ne aggiungeva una parte contenente le routine di gestione del disco fisso e che il suo indirizzo in memoria si trovava a C800:0000.
Riguardo alla RAM, essa occupa un posto di primo piano nella gestione del PC. In essa vengono depositati i codici che compongono i programmi ed i dati che dagli stessi vengono poi elaborati.
Quanto segue fara' riferimento al metodo di gestione della memoria degli 8086 poiche' anche tutti gli altri Microprocessori, per ragioni di compatibilita' lavorano in Modo Reale e quindi emulano il tipo 8086/8088.

La locazioni di memoria sono identificate da un indirizzo che specifica in modo univoco il luogo dove e' conservato un dato.
Gli indirizzi di memoria vengono generati dal Microprocessore per mezzo della combinazione di alcuni suoi registri interni secondo il metodo della segmentazione della memoria.
Poiche' sappiamo che ogni registro e' largo 16 Bit, il massimo numero rappresentabile e' costituito da una cifra binaria di 16 bit quindi 65.535 o meglio dalla cifra Esadecimale FFFF.
Sappiamo pero' che il massimo spazio indirizzabile dal microprocessore e' di 1 Mb quindi deve essere generato un indirizzo il cui valore massimo e' FFFFF in esadecimale, 1.048.575 in decimale e 20 Bit a 1 in binario.

La memoria reale e' quindi indirizzata con una parola di 20 Bit che, come gia' spiegato, viene posta sul Bus degli indirizzi che e' largo appunto 20 Bit.
Per ottenere questo valore il Microprocessore si serve della combinazione dei valori contenuti in due registri a 16 Bit.
Il primo rappresenta l'indirizzo in paragrafi ( ogni paragrafo e' un multiplo di 16 bit ) ed il secondo rappresenta l'offset o scostamento.
Considerando l' indirizzo assoluto B8000 in esadecimale ( 753.664 in decimale) superiore al valore 65.535 rappresentabile con 16 Bit, con il sistema a scostamento il Microprocessore considera B8000 come B800:0000 quindi il primo registro conterra' B800h ed il secondo 0000h.
Per meglio comprendere supponiamo di voler generare l'indirizzo assoluto 754.500 in B8344h
Il valore dovra' essere diviso in due porzioni che dovranno essere contenute ciascuna in un registro a 16 bit.
La prima rappresentera' il segmento e poiche' questo viene espresso in paragrafi, il suo valore verra' interpretato come moltiplicato per 10h ( 1 paragrafo = 16 bit ossia 10 in esadecimale ).
La seconda conterra' lo scostamento ossia il valore che sommato al registro di segmento dara' il valore assoluto.
Nel nostro caso il valore B8344 verra' separato in modo che le prime 4 cifre a sinistra rappresentino il Segmento e la cifra a destra l'Offset.
La separazione e' del tutto arbitraria e la cifra in oggetto potra' essere interpretata come B834:0004 oppure B800:0334 ed ancora AF00:9344.
Il valore assoluto viene ricavato quindi moltiplicando per 10h il contenuto del Registro di Segmento e sommando al risultato il valore dello scostamento o Offset. In pratica eseguiamo le operazioni :

Come possiamo vedere il valore assoluto ottenuto negli esempi e' per tutti uguale.

Nota:
Anche se l'effettiva possibilita' di indirizzamento a 32 Bit permette di raggiungere i 4 Gb. , non e' possibile installare fisicamente tale quantita' di memoria. ( Attualmente su di un 386 o 486 si possono installare 64 Mb di Ram)
Quanto segue, anche se non trovera' una applicazione pratica per la maggior parte dei programmatori, serve per comprendere come la memoria viene gestita dal S.O.

ESEMPIO DI MAPPA DI MEMORIA SU P.C.

Prima di procedere con l'esame dettagliato della memoria e dei suoi contenuti occorre chiarire alcuni concetti basilari.

Esistono due tipi fondamentali di memorie RAM determinate dai Chip che le costituiscono:
Le DRAM o RAM dinamiche e le SRAM o RAM statiche.
Le DRAM sono piu' economiche, occupano meno spazio e memorizzano una grande quantita' di dati.
Possiamo immaginare ogni cella di memoria come un condensatore dove lo stato di carica rappresenta il Bit a 1 e lo stato di scarica rappresenta il Bit a 0.
Poiche' la carica elettrica gradualmente si esaurisce, le DRAM necessitano di un continuo ciclo detto " di rinfresco " per ripristinarla e mantenere quindi i dati in memoria e questo va a scapito delle prestazioni.
Le SRAM usano un metodo diverso per memorizzare gli stati 1 e 0 e quindi non necessitano del rinfresco.
Esse sono piu' veloci delle DRAM ma a parita' di spazio hanno minor capacita' di memoria e per di piu' hanno un costo molto elevato.
Le SRAM trovano impiego nella Memoria Cache e nelle schede video avanzate.
La ROM e' una memoria a sola lettura e contiene dei dati che non vengono persi allo spegnimento del computer.
Nelle ROM presenti sul P.C. sono memorizzate istruzioni speciali ( routine di caricamento del S.O. e routine del Bios ) , controlli per dispositivi hardware ( H.D. Controller, Video ecc.).
L'accesso alle ROM avviene in modo trasparente al programmatore in quanto il computer vi accede senza alcun intervento esterno.
E' ovvio che l'accesso alle ROM non e' negato e via software vi si accede in qualsiasi momento si voglia.
Tornando alle RAM , il chip RAM e' caratterizzato dal numero di Bit che puo' contenere.
I piu' correnti sono chip da 64-128-256 Kbit e 1 Mbit.
Poiche' la memoria viene espressa in Byte per ottenere 256 Kbyte occorrono 8 chip da 256 Kbit piu' un chip di controllo che fornisce il nono bit detto di parita' quindi 9 chip in tutto.
I chip si dividono in DIP, SIMM e SIP ( I SIP sono poco usati).
I DIP ( Dual in-line package ) sono quelli che normalmente compongono i banchi della memoria di base; in un P.C. basato su 8086, la massima quantita' di memoria RAM installata e' di 640 Kb.
Essa e' formata da due banchi di 9 chip da 256 Kbit piu' uno da 9 chip da 128 Kbit o 2 da 64 Kbit.
Su P.C. basati su 80286 e superiori e' possibile installare oltre 640 Kb di memoria e oltre ai DIP e' possibile installare i SIMM ( Single in-line memory module).
Questi ultimi hanno una capacita' di 1 Mb. e contengono su di una piccola scheda a forma di pettine 9 chip da 1 Mbit o 3 chip da tre Mbit ognuno dei quali gestisce 3 bit.
Attualmente i Computer 286 sono equipaggiati con 1 Mb. base espandibili a 16 Mb.
I 386 montano 4 SIMM da 1 Mb. per un totale di 4 Mb. espandibili a 64 Mb. montando 8 SIMM da 8Mb caduna.
Cio' non rappresenta uno standard ed ogni costruttore puo' adottare configurazioni diverse. La memoria e' legata a precisi riferimenti che verranno ora esaminati:

TEMPO DI ACCESSO: Poiche' il microprocessore legge e scrive continuamente in memoria si dice chi vi accede ed il tempo impiegato si misura in Nanosecondi ossia in miliardesimi di secondo.
Piu' breve e' il tempo impiegato nel memorizzare il dato ed il passaggio attraverso il ciclo di rinfresco, piu' veloce risulta la memoria. Valori tipici sono 80-70 Nsec.
STATO DI ATTESA (WAIT STATE) : L'ideale e' un Wait state = 0 ; cio' significa che il microprocessore non deve attendere uno o piu' cicli di clock durante il rinfresco della memoria tra la scrittura di un dato e un altro.
INTERLEAVING o Memoria intercalata : La memoria viene divisa in due regioni dove la prima contiene gli indirizzi pari e l'altra gli indirizzi dispari.
Quando un dato viene scritto ad un indirizzo pari vengono rinfrescati gli indirizzi dispari e viceversa. Questo per sfruttare al meglio la velocita' dei microprocessori a 33Mhz.
Memoria CACHE: E' questa una modesta quantita' di memoria (32-64 Kb) formata da SRAM veloci posta tra il microprocessore e la memoria RAM.
Quando dei dati vengono letti o scritti essi vengono anche memorizzati nella Cache.
Un successivo accesso alla memoria passa prima per la cache e se i dati richiesti sono ivi presenti essi vengono prelevati senza dover accedere alla RAM che e' piu' lenta.
Questo comporta un notevole risparmio di tempo con conseguente incremento delle prestazioni.
Attenzione:
La memoria Cache e' parte integrante della scheda madre del computer e non puo' essere quindi installata in un secondo tempo.
E' pero' possibile, sempre che la piastra sia predisposta, installare od espandere questa memoria fino a 128 Kb su un 486 con almeno 8 Mb di RAM.
SHADOW RAM : Esiste una parte di memoria nota sotto questo nome, mappata in un' area inutilizzata della memoria superiore su sistemi 286 e oltre, in cui all'atto dell'inizializzazione del computer (Boot) vengono copiati i BIOS video e di sistema.
L'accesso a questi dispositivi risulta migliorato in quanto la RAM e' piu' veloce della ROM.
Anche la Shadow Ram fa parte del sistema e non puo' venire aggiunta in seguito. Essa deve pero' poter essere disabilitata per evitare conflitti di memoria con particolari applicativi.

LA MEMORIA DEL P.C.

Nota: Essendo le CPU 8088 ed 8086 praticamente uguali dal punto di vista della programmazione, il riferimento 8086 sara' sottointeso come 8086 e 8088.

Quando fu progettato il P.C. con la CPU 8086 lo spazio di memoria indirizza- bile risultava di 1 Mb.
Non potendo dedicare tutto lo spazio alla RAM in quanto era necessario dedicare anche spazio alla ROM, si decise di riservare i primi 640 Kb alla RAM e i rimanenti 384 Kb alla ROM ed alle schede di espansione.
La parte comprendente i primi 640 Kb venne definita Memoria convenzionale e, la rimanente, Memoria riservata in quanto riservata alle ROM.
Con l'avvento dei nuovi microprocessori e con le nuove tecniche di sfruttamento della memoria, possiamo dividere quest'ultima in 4 tipi distinti:

memoria CONVENZIONALE
memoria SUPERIORE
memoria ESPANSA
memoria ESTESA

Prima di procedere con l'esame dettagliato della memoria e dei suoi contenuti occorre chiarire il concetto di Segmentazione della memoria.
Si fara' riferimento al microprocessore 8086 in quanto i microprocessori 80286-386-486, in ambiente DOS operano in modo " Reale " e praticamente si esprimono come un 8086 veloce.
Per sfruttare le loro caratteristiche essi devono operare in modo " Protetto " e solo alcuni applicativi sfruttano, in parte, questo modo sotto DOS.
Come gia' affermato la CPU 8086 puo' esprimere 1.048.576 indirizzi diversi.
Essendo pero' il microprocessore un componente a 16 bit non puo' operare che con numeri composti da un massimo di 16 bit il cui valore piu' alto e' 65.536
Per indirizzare fino ad 1 Mb. esso adotta un sistema di indirizzamento a 20 bit ed infatti con 20 bit si esprime il numero 1.048.576.
Bisogna ricordare che il microprocessore ha 20 dei suoi piedini che vengono identificati con la sigla che va da A0 ad A19; attraverso di essi passano i bit che formano l'indirizzo di memoria a cui deve accedere la CPU.
Per formare l'indirizzo a 20 bit si combinano i valori di due dei suoi registri dei quali uno rappresenta il paragrafo di segmento e l'altro lo scostamento o offset all'interno di questo.
La memoria viene divisa in 16 segmenti ideali da 64 Kb ciascuno. (16 x 65536 = 1.048.576)
Ogni segmento inizia ad un indirizzo detto di paragrafo che deve essere divisibile per 16 ( 10h ) ossia con 0 finale ( 2B050h / 10h = 2B05 )
Per convenzione i primi 10 segmenti sono riservati alla memoria convenzionale ed i loro indirizzi vanno da 0000h a 9FFFh. (Vedi mappa di memoria precedente)
Bisogna notare che nella parte della memoria fino a 640 Kb. possono esistere infiniti segmenti in quanto un indirizzo puo' iniziare ogni 16 Byte.

Esaminiamo un classico indirizzo di memoria : 2B05:0100
Il primo numero rappresenta il paragrafo di segmento il cui valore effettivo si ottiene moltiplicandolo per 16 ed il secondo numero rappresenta lo scostamento all'interno del segmento stesso.
L'effettivo indirizzo o indirizzo assoluto si ottiene spostando a sinistra di una posizione il primo valore ( spostare di una posizione a sinistra significa moltiplicare per 16 ) e sommando lo scostamento.

Partendo dal valore ottenuto lo possiamo segmentare in 2B15:0000 Con lo stesso principio l'indirizzo iniziale : 2B05:0100 lo possiamo esprimere come :

Come si nota tutti i valori ottenuti sono uguali e ovviamente il risultato e' composto da 5 byte ossia 20 bit.

LA MEMORIA CONVENZIONALE

La memoria convenzionale e' quella in cui il DOS carica ed esegue i programmi.
Essa si estende dall'indirizzo 0000h a 9FFFh ossia da 0 a 640Kb.
Quella che segue e' una classica mappa di memoria ottenuta con il comando MEM/D del MS-DOS 6.00.
Una mappa analoga, rilevata con il DOS 5.0 verra' vista piu' avanti.
In quella che segue l' indirizzo di segmento e' espresso in paragrafi e l'indirizzo assoluto puo' venire espresso aggiungendo uno 0 ( x 16).
Se esaminiamo Segment = 00040 lo possiamo vedere come 00040:0000 oppure 000400 assoluto.
I valori "Segment" sono in formato esadecimale mentre quelli "Size" sono in decimale.

Conventional Memory Detail:

IL PRIMO BLOCCO DI MEMORIA si estende fino a 400h ed e' ampio 1024 Byte.
Dalla mappa si nota pero' che il blocco e' ampio 1039 Byte.
Cio' e' dovuto al modo in cui si calcola l'ampiezza del blocco che vediamo ora in dettaglio:

Quanto visto non deve trarre in inganno sull'effettiva ampiezza dei blocchi di memoria poiche' la rappresentazione e' soggettiva al programma MEM.
Quanto segue e' la stessa mappa ricavata con il DOS 5.0

In seguito verra' esaminata la mappa di memoria con il programma DEBUG e gli effettivi indirizzi controllati.
Passiamo ora all'esame dettagliato della memoria.
I primi 400h byte contengono la tabella vettoriale degli Interrupt.
Essa e' formata dagli indirizzi relativi ai 256 interrupt gestibili dal sistema.
Ogni vettore di interrupt e' formato da 4 byte che rappresentano l'indirizzo della routine relativa. Essi sono memorizzati nella forma:
OFFSET:SEGMENTO dove segmento e' il paragrafo e offset lo scostamento.
Se moltiplichiamo 256 per 4 otteniamo 1024 ossia 400h che e' appunto la ampiezza del primo blocco di memoria.
Quanto segue e' parte delle tabella vettoriale e contiene gli indirizzi relativi agli interrupt che vanno dal n. 0 al n. 1F.
Notare che le letture in memoria vanno fatte tenendo conto della memorizzazione al rovescio quindi 4C01 diventa 014C.
In questo caso essendo memorizzate due parole ( Segmento:Offset ) vengono invertiti sia l'ordine dei byte che delle parole stesse.
La routine dell'interrupt 0 inizia quindi al Seg:Off 218F:014C mentre quella dell'interrupt 2 a 0070:06F4 e quella dell'interrupt 10h a 2185:1834.

L' Area per le comunicazioni ROM inizia dall'indirizzo 0040:0000 ed e' ampia 256 byte ( 100h ).
Il Bios utilizza i dati in essa contenuti per le routine di tastiera, video, dischi, stampante e comunicazioni.
Quest'area e' considerata proprieta' del Bios e non e' consigliabile manipolarla.
In essa sono contenute informazioni il cui esame si puo' rivelare interessante.

le ROM bios sono anche all'indirizzo E000:0 e rispecchiano F000:0
Le ROM installate iniziano da C000 e vengono gestite a blocchi di 800h
A C000 c'e' la ROM della scheda VGA.
L'intestazione di una ROM attiva e' 55 AA seguito da un codice di 1 byte.
C000 a CFFF ROM video.
C800 a DFFF estensioni per dischi ecc.
E000 a FFFF ROM bios

ESEMPIO DI MEMORIA ALLOCATA DINAMICAMENTE