Intel-hukommelsesmodel - Intel Memory Model
I computing , Intel Memory Model refererer til et sæt af seks forskellige hukommelse modeller af x86 CPU drift i real mode , som kontrol, hvordan segmentet registre anvendes, og standardstørrelsen af pointere.
Hukommelsessegmentering
Fire registre bruges til at henvise til fire segmenter på 16-bit x86 segmenteret hukommelsesarkitektur. DS ( data segment), KS ( kode segment), SS ( stak segment), og ES (ekstra segment). Et andet 16-bit register kan fungere som en forskydning i et givet segment, og således er en logisk adresse på denne platform skrevet segment : offset , typisk i hexadecimal notation. I real mode for at beregne den fysiske adresse på en byte af hukommelse skifter hardwaren indholdet af det relevante segmentregister 4 bits tilbage (effektivt ganget med 16) og tilføjer derefter forskydningen.
For eksempel giver den logiske adresse 7522: F139 20-bit fysisk adresse:
| 75220 | |
| + | F139 |
| 84359 |
Bemærk, at denne proces fører til aliasing af hukommelse, således at enhver given fysisk adresse har op til 4096 tilsvarende logiske adresser. Dette komplicerer sammenligningen af markører til forskellige segmenter.
Markørstørrelser
Markørformater er kendt som nær , fjern eller enorm .
- I nærheden af markører er 16-bit forskydninger inden for referencesegmentet, dvs. DS for data og CS for kode. De er de hurtigste pointer, men er begrænset til at pege på 64 KB hukommelse (til det tilknyttede segment af datatypen). Nær markører kan holdes i registre (typisk SI og DI).
mov bx, word [reg]
mov ax, word [bx]
mov dx, word [bx+2]
-
Far pejlemærker er 32-bit pointere indeholder et segment og et offset. For at bruge dem bruges segmentregistret ES ved hjælp af instruktionen
les [reg]|[mem],dword [mem]|[reg]. De kan henvise til op til 1024 KiB hukommelse. Bemærk, at markøraritmetik (addition og subtraktion) ikke ændrer markørens segmentdel, kun dens forskydning. Operationer, der overstiger grænserne på nul eller 65535 (0xFFFF), gennemgår modulo 64K-operation ligesom enhver normal 16-bit operation. For eksempel, hvis segmentet register er sat til 0x5000 og forskydningen bliver inkrementeret, det øjeblik denne tæller offset bliver (0x10000), vil den resulterende absolut adresse rulle over til 0x5000: 0000.
les bx,dword [reg]
mov ax,word [es:bx]
mov dx,word [es:bx+2]
- Enorme henvisninger er i det væsentlige langt henvisninger, men normaliseres (for det meste) hver gang de ændres, så de har det højest mulige segment for den adresse. Dette er meget langsomt, men gør det muligt for markøren at pege på flere segmenter og giver mulighed for nøjagtige markør sammenligninger, som om platformen var en flad hukommelsesmodel : Det forbyder aliasering af hukommelse som beskrevet ovenfor, så to kæmpe markører, der refererer til den samme hukommelse placering er altid ens.
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]
Hukommelsesmodeller
Hukommelsesmodellerne er:
| Model | Data | Kode | Definition |
|---|---|---|---|
| Lille bitte* | nær ved | CS = DS = SS | |
| Lille | nær ved** | nær ved | DS = SS |
| Medium | nær ved** | langt | DS = SS, flere kodesegmenter |
| Kompakt | langt | nær ved | enkelt kodesegment, flere datasegmenter |
| Stor | langt | langt | flere kode- og datasegmenter |
| Kæmpe stor | kæmpe stor | langt | flere kode- og datasegmenter; enkelt array kan være> 64 KB |
Andre platforme
I beskyttet tilstand kan et segment ikke være både skrivbart og eksekverbart. Derfor skal kodesegmentregistret pege på den samme fysiske adresse og have samme grænse som datasegmentregistret, når den implementerer den lille hukommelsesmodel. Dette besejrede en af funktionerne i 80286 , som sørger for, at datasegmenter aldrig kan køres, og kodesegmenter aldrig kan skrives (hvilket betyder, at selvmodificerende kode aldrig er tilladt). Men på den 80386, med sin Paged hukommelse forvaltningsenhed er det muligt at beskytte individuelle hukommelsessider mod skriftligt.
Hukommelsesmodeller er ikke begrænset til 16-bit programmer. Det er også muligt at bruge segmentering i 32-bit beskyttet tilstand (hvilket resulterer i 48-bit-markører), og der findes C-sprogkompilatorer, der understøtter det. Imidlertid giver segmentering i 32-bit-tilstand ikke adgang til et større adresseområde, end hvad et enkelt segment ville dække, medmindre nogle segmenter ikke altid er til stede i hukommelsen, og det lineære adresseområde kun bruges som en cache over et større segmenteret virtuelt rum . Det giver bedre beskyttelse for adgang til forskellige objekter (områder op til 1 MB lange kan drage fordel af en one-byte-adgangsbeskyttelsesgranularitet i modsætning til den grove 4 KiB-granularitet, der tilbydes af eneste personsøgning), og bruges derfor kun i specialiserede applikationer som telekommunikation software. Teknisk set er det "flade" 32-bit adresseområde en "lille" hukommelsesmodel til det segmenterede adresseområde. Under begge regeringer indeholder alle fire segmentregistre en og samme værdi.
x86-64
På x86-64 platformen findes der i alt syv hukommelsesmodeller, da størstedelen af symbolreferencer kun er 32 bit brede, og hvis adresserne er kendt på linktidspunktet (i modsætning til positionsuafhængig kode ). Dette påvirker ikke de anvendte markører, som altid er flade 64-bit-markører, men kun hvordan værdier, der skal tilgås via symboler, kan placeres.
Se også
Bibliografi
- Turbo C ++ version 3.0 brugervejledning . Borland International, Copyright 1992.