Modelli di memoria
Le applicazioni non accedono direttamente alla memoria fisica, ma essa, dal punto di vista logico, può essere organizzata in diversi modi:
-Flat memory, in cui la memoria appare come un unico blocco
-Segmented Memory Model, in cui la memoria è raggruppata in spazi di indirizzamento indipendenti, detti segmenti. Le applicazioni possono indirizzare solo in una parte di questi segmenti di dimensione massima 2^36 byte. Questa tecnica non è alternativa alla paginazione.
-Real-address mode Memory Model, che è il modello di memoria utilizzato dall'Intel 8086 compatibili. Questo modello di memoria è quello analizzato nelle parti seguenti.
Real-address mode Memory Model
Questo modello di memoria è simili alla memoria segmentata. Infatti i segmenti sono visibili al programmatore a livello istruzione. Esso permette di dividere la memoria in porzioni con funzioni simili (data, stack e codice) e usare più segmenti per la stessa funzione. Ogni segmento può avere un livello di protezione (lettura, scrittura, lettura/scrittura). L'indirizzo fisico è su 20bit e viene ottenuto fornendo l'indirizzo di segmento su 16bit e l'indirizzo di offset, anch'esso di 16bit. Questo tipo di indirizzamento minimizza lo spreco di memoria, ottenendo in più uno spazio di indirizzamento di 2^20, utilizzando indirizzi di 16bit.
In alcune archittetture non è possibile modificare l'indirizzo di segmento, poichè a questo pensa il sistema operativo.
Questo schema di memoria permette di trasferire ciascun segmento di memoria logica sulla memoria fisica, che normalmente ha dimensioni inferiori. Il meccanismo di mapping, intrinseco nell'architettura di segmentazione dei processori, ha il compito di conservare le informazioni relative ai permessi anche sulla memoria fisica.
A seconda della modalità di funzionamento si hanno due modelli distinti di memoria
-in real mode la profondità della memoria è di 1MB, essendo una memoria organizzata in segmenti da 64KB. Questi segmenti nel modo reale sono sovrapposti e quindi sono invisibili al programmatore. La memoria è organizzata dividendo, a seconda degli indirizzi, le varie parti. Fino all'indirizzo 003FF è presente l'interrupt vector table, fino all'indirizzo FFFF0 la memoria è libera, fino al FFFFC è presente il reset bootstrap ed infine gli ultimi byte sono riservati.
-in modo protetto ogni segmento è di 64KB, sovrapposto al segmento successivo a meno della prima parte di 16B, detta paragrafo.
Calcolo degli indirizzi e segmentazione
Per calcolare un'indirizzo fisico, l'8086 esegue un'operazione di somma tra il contenuto di un registro puntatore (oppure BX), che funge da offset, ed il contenuto di un registro di segmento, dopo aver moltiplicato quest'ultimo per 16 (shift a sinistra di 4 posizioni).
Grazie a questo metodo di calcolo degli indirizzi si può pensare alla memoria fisica organizzata in segmenti, ognuno dei quali comincia ad un indirizzo multiplo di 16 e tutti di dimensione pari a 64Kbyte. I segmenti sono parzialmente sovrapposti. In questo modo una volta caricato un indirizzo in un registro di segmento, tutti gli indirizzi del segmento possono essere espressi mediante il registro di offset.
I gruppi di 16byte, che iniziano ad indirizzi multipli di 16, si definiscono paragrafi.
La segmentazione consente uno spazio di indirizzamento pari a 2^20, utilizzando indirizzi su 16bit. E' possibile dividere parti di memoria in dati, codice, stack, completamente indipendenti. Si può minimizzare la memoria sprecata, sovrapponendo i segmenti.
Accesso e utilizzo della memoria
Il modello IA-16 permette di avere uno spazio di indirizzamento pari a 1MB ed è in grado di accedere in un solo passo ad un byte o ad una word, che inizia su un indirizzo pari. Nel caso in cui il byte o la word inizi con un indirizzo dispari sono necessari due cicli.
La tecnica usata per la memorizzazione è quella del little-endian, nel senso che le parole iniziano dal byte con indirizzo minore, verso l'indirizzo maggiore.
Non tutta la memoria è utilizzabile dal programmatore, in quanto esistono parti come l'interrupt vector table o la cella contenente l'indirizzo del programma di bootstrap oppure le celle destinate a contenere informazioni del BIOS, a cui il programmatore non può accedere:
Un esempio è rappresentato dal Reset bootstrap. Normalmente esso è rappresentato dalla prima locazione di memoria, dove è presente una JMP alla procedura di Bootstrap, essenziale per avviare il processore; solitamente la vera e propria procedura è posizionata nel BIOS.
Stack
L'8086 prevede l'esistenza di uno stack, gestito in modo hardware. Lo stack è comandato dagli indirizzi puntati dal registro SS (posizione di testa dello stack) e dal registro SP (ultima posizione dello stack). Lo stack parte dalle celle con indirizzo maggiore verso quelle con indirizzo minore. Per questo ogni volta che è effettuato l'inserimento di un elemento nello stack mediante PUSH, il registro SP viene decrementato di due unità. Viceversa quando è effettuata un'operazione di POP viene incrementato l'SP di due unità, dopo aver prelevato l'ultimo elemento nello stack.
Lo stack viene utilizzato anche durante l'attivazione di una chiamata a procedura o del ritorno alla procedura chiamante. Infatti nello stack viene memorizzato l'IP. Quando si attiva un interrupt o quando si ritorna alla procedura che si stava eseguendo, vengono automaticamente immagazzinati/prelevati dallo stack i registri CS, IP e PSW.
| < Prec. | Succ. > |
|---|






