Modello di memoria Intel - Intel Memory Model
In informatica , Intel Memory Model si riferisce a un set di sei diversi modelli di memoria della CPU x86 che operano in modalità reale che controllano il modo in cui vengono utilizzati i registri di segmento e la dimensione predefinita dei puntatori.
Segmentazione della memoria
Quattro registri vengono utilizzati per fare riferimento a quattro segmenti sull'architettura di memoria segmentata x86 a 16 bit. DS ( segmento dati ), CS ( segmento codice ), SS ( segmento stack ) ed ES (segmento extra). Un altro registro a 16 bit può fungere da offset in un dato segmento, quindi un indirizzo logico su questa piattaforma viene scritto segment : offset , tipicamente in notazione esadecimale . In modalità reale, per calcolare l'indirizzo fisico di un byte di memoria, l'hardware sposta il contenuto del registro di segmento appropriato di 4 bit a sinistra (moltiplicando effettivamente per 16), quindi aggiunge l'offset.
Ad esempio, l'indirizzo logico 7522: F139 restituisce l'indirizzo fisico a 20 bit:
| 75220 | |
| + | F139 |
| 84359 |
Si noti che questo processo porta ad aliasing della memoria, in modo tale che un dato indirizzo fisico abbia fino a 4096 indirizzi logici corrispondenti. Ciò complica il confronto dei puntatori a segmenti diversi.
Dimensioni del puntatore
I formati dei puntatori sono noti come vicino , lontano o enorme .
- I puntatori vicini sono offset a 16 bit all'interno del segmento di riferimento, cioè DS per i dati e CS per il codice. Sono i puntatori più veloci, ma sono limitati a puntare a 64 KB di memoria (al segmento associato del tipo di dati). I puntatori vicini possono essere conservati nei registri (tipicamente SI e DI).
mov bx, word [reg]
mov ax, word [bx]
mov dx, word [bx+2]
-
I puntatori lontani sono puntatori a 32 bit contenenti un segmento e un offset. Per usarli, il registro di segmento ES viene utilizzato utilizzando l'istruzione
les [reg]|[mem],dword [mem]|[reg]. Possono fare riferimento a un massimo di 1024 KiB di memoria. Si noti che l'aritmetica del puntatore (addizione e sottrazione) non modifica la porzione del segmento del puntatore, ma solo il suo offset. Le operazioni che superano i limiti di zero o 65535 (0xFFFF) subiranno un'operazione modulo 64K proprio come qualsiasi normale operazione a 16 bit. Ad esempio, se il registro del segmento è impostato su 0x5000 e l'offset viene incrementato, nel momento in cui questo offset del contatore diventa (0x10000), l'indirizzo assoluto risultante passerà a 0x5000: 0000.
les bx,dword [reg]
mov ax,word [es:bx]
mov dx,word [es:bx+2]
- I puntatori enormi sono essenzialmente puntatori lontani, ma sono (per lo più) normalizzati ogni volta che vengono modificati in modo che abbiano il segmento più alto possibile per quell'indirizzo. Questo è molto lento ma consente al puntatore di puntare a più segmenti e consente confronti accurati del puntatore, come se la piattaforma fosse un modello di memoria piatto : proibisce l'aliasing della memoria come descritto sopra, quindi due enormi puntatori che fanno riferimento alla stessa memoria posizione sono sempre uguali.
les bx,dword [reg]
mov ax,word [es:bx]
add bx,2
test bx,0xfff0
jz lbl
sub bx,0x10
mov dx,es
inc dx
mov es,dx
lbl:
mov dx,word [es:bx]
Modelli di memoria
I modelli di memoria sono:
| Modello | Dati | Codice | Definizione |
|---|---|---|---|
| Piccolo * | vicino | CS = DS = SS | |
| Piccolo | vicino** | vicino | DS = SS |
| medio | vicino** | lontano | DS = SS, più segmenti di codice |
| Compatto | lontano | vicino | segmento di codice singolo, più segmenti di dati |
| Grande | lontano | lontano | più segmenti di codice e dati |
| Enorme | enorme | lontano | più segmenti di codice e dati; singolo array può essere> 64 KB |
Altre piattaforme
In modalità protetta un segmento non può essere sia scrivibile che eseguibile. Pertanto, quando si implementa il modello di memoria Tiny, il registro del segmento di codice deve puntare allo stesso indirizzo fisico e avere lo stesso limite del registro del segmento di dati. Ciò ha annullato una delle funzionalità dell'80286 , che garantisce che i segmenti di dati non siano mai eseguibili e che i segmenti di codice non siano mai scrivibili (il che significa che il codice di auto-modifica non è mai consentito). Tuttavia, sull'80386, con la sua unità di gestione della memoria a pagine è possibile proteggere dalla scrittura singole pagine di memoria.
I modelli di memoria non sono limitati ai programmi a 16 bit. È possibile utilizzare la segmentazione anche in modalità protetta a 32 bit (risultando in puntatori a 48 bit) ed esistono compilatori in linguaggio C che lo supportano. Tuttavia la segmentazione in modalità a 32 bit non consente di accedere a uno spazio di indirizzi più ampio di quello che coprirebbe un singolo segmento, a meno che alcuni segmenti non siano sempre presenti in memoria e lo spazio di indirizzi lineare sia usato solo come cache su uno spazio virtuale segmentato più grande . Consente una migliore protezione per l'accesso a vari oggetti (aree fino a 1 MB di lunghezza possono beneficiare di una granularità di protezione dell'accesso di un byte, rispetto alla granularità grossolana di 4 KiB offerta dalla sola paginazione), ed è quindi utilizzata solo in applicazioni specializzate, come le telecomunicazioni Software. Tecnicamente, lo spazio degli indirizzi "flat" a 32 bit è un modello di memoria "minuscolo" per lo spazio degli indirizzi segmentato. Sotto entrambi i regni tutti e quattro i registri di segmento contengono lo stesso valore.
x86-64
Sulla piattaforma x86-64 , esistono un totale di sette modelli di memoria, poiché la maggior parte dei riferimenti ai simboli ha una larghezza di soli 32 bit e se gli indirizzi sono noti al momento del collegamento (al contrario del codice indipendente dalla posizione ). Ciò non influisce sui puntatori utilizzati, che sono sempre puntatori piatti a 64 bit, ma solo sul modo in cui è possibile posizionare i valori a cui è necessario accedere tramite simboli.
Guarda anche
Bibliografia
- Guida dell'utente di Turbo C ++ versione 3.0 . Borland International, Copyright 1992.