Paměťový model Intel - Intel Memory Model
V práci na počítači , Intel Memory Model odkazuje na sadu šesti různých paměťových modelů x86 provozu procesoru v reálném režimu , které řídí způsob, jakým segmentové registry jsou použity a výchozí velikost ukazatele.
Segmentace paměti
Čtyři registry se používají k označení čtyř segmentů na 16bitové architektuře segmentu paměti x86. DS ( údaje segment), CS ( kód segmentu), SS ( zásobník segment) a ES (extra segment). Další 16bitový registr může fungovat jako offset do daného segmentu, a tak je logickou adresou na této platformě zapsaný segment : offset , obvykle v hexadecimálním zápisu. V reálném režimu, aby bylo možné vypočítat fyzickou adresu bajtu paměti, hardware posune obsah příslušného segmentového registru o 4 bity vlevo (účinně vynásobený 16) a poté přidá posun.
Například logická adresa 7522: F139 poskytuje 20bitovou fyzickou adresu:
75220 | |
+ | F139 |
84359 |
Všimněte si, že tento proces vede k aliasingu paměti, takže každá daná fyzická adresa má až 4096 odpovídajících logických adres. To komplikuje srovnání ukazatelů na různé segmenty.
Velikost ukazatele
Ukazatelské formáty jsou známé jako blízké , vzdálené nebo obrovské .
- Blízké ukazatele jsou 16bitové posuny v referenčním segmentu, tj. DS pro data a CS pro kód. Jsou to nejrychlejší ukazatele, ale jsou omezeny tak, aby ukazovaly na 64 kB paměti (na přidružený segment datového typu). Blízké ukazatele mohou být uchovávány v registrech (obvykle SI a DI).
mov bx, word [reg]
mov ax, word [bx]
mov dx, word [bx+2]
-
Vzdálené ukazatele jsou 32bitové ukazatele obsahující segment a posun. K jejich použití se pomocí instrukce používá segmentový registr ES
les [reg]|[mem],dword [mem]|[reg]
. Mohou odkazovat až na 1024 KiB paměti. Všimněte si, že aritmetika ukazatele (sčítání a odčítání) nemění část segmentu ukazatele, pouze jeho posun. Operace, které přesahují meze nula nebo 65535 (0xFFFF), projdou modulo 64K operací stejně jako všechny běžné 16bitové operace. Například pokud je registr segmentu nastaven na 0x5000 a posun se zvyšuje, v okamžiku, kdy se toto posunutí počitadla stane (0x10000), výsledná absolutní adresa se převrátí na 0x5000: 0000.
les bx,dword [reg]
mov ax,word [es:bx]
mov dx,word [es:bx+2]
- Obrovské ukazatele jsou v podstatě vzdálené ukazatele, ale jsou (většinou) normalizovány pokaždé, když jsou upraveny tak, aby měly pro danou adresu nejvyšší možný segment. To je velmi pomalé, ale umožňuje to, aby ukazatel ukazoval na více segmentů, a umožňuje to přesné srovnání ukazatelů, jako by platforma byla modelem ploché paměti : Zakazuje aliasing paměti, jak je popsáno výše, takže dva obrovské ukazatele, které odkazují na stejnou paměť umístění jsou vždy stejná.
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]
Paměťové modely
Paměťové modely jsou:
Modelka | Data | Kód | Definice |
---|---|---|---|
Drobný* | u | CS = DS = SS | |
Malý | u** | u | DS = SS |
Střední | u** | daleko | DS = SS, více kódových segmentů |
Kompaktní | daleko | u | jeden segment kódu, více segmentů dat |
Velký | daleko | daleko | více segmentů kódu a dat |
Obrovský | obrovský | daleko | více kódových a datových segmentů; jedno pole může být> 64 KB |
Jiné platformy
V chráněném režimu nemůže být segment zapisovatelný ani spustitelný. Proto při implementaci modelu paměti Tiny musí registr segmentu kódu směřovat na stejnou fyzickou adresu a mít stejný limit jako registr datového segmentu. Tím byla poražena jedna z funkcí 80286 , která zajišťuje, že datové segmenty nejsou nikdy spustitelné a segmenty kódu nejsou nikdy zapisovatelné (což znamená, že samočinně upravený kód není nikdy povolen). Na modelu 80386 je však s jeho stránkovanou jednotkou správy paměti možné chránit jednotlivé stránky paměti před zápisem.
Paměťové modely se neomezují pouze na 16bitové programy. Je možné použít segmentaci také v 32bitovém chráněném režimu (což má za následek 48bitové ukazatele) a existují překladače jazyka C, které to podporují. Segmentace v 32bitovém režimu však neumožňuje přístup k většímu adresnímu prostoru, než jaký by pokryl jeden segment, pokud některé segmenty nejsou vždy přítomny v paměti a lineární adresní prostor se používá pouze jako mezipaměť přes větší segmentovaný virtuální prostor. . Umožňuje lepší ochranu přístupu k různým objektům (oblasti s délkou do 1 MB mohou těžit z jednobajtové úrovně ochrany přístupu oproti hrubé zrnitosti 4 KiB nabízené jediným stránkováním), a proto se používá pouze ve specializovaných aplikacích, jako jsou telekomunikace software. Technicky je „plochý“ 32bitový adresní prostor „malým“ paměťovým modelem pro segmentovaný adresní prostor. Pod oběma vládnutími obsahují všechny čtyři segmentové registry jednu a stejnou hodnotu.
x86-64
Na platformě x86-64 existuje celkem sedm paměťových modelů, protože většina odkazů na symboly má šířku pouze 32 bitů a pokud jsou adresy známé v době propojení (na rozdíl od kódu nezávislého na poloze ). To neovlivní použité ukazatele, což jsou vždy ploché 64bitové ukazatele, ale pouze to, jak lze umístit hodnoty, ke kterým je třeba přistupovat prostřednictvím symbolů.
Viz také
Bibliografie
- Uživatelská příručka k Turbo C ++ verze 3.0 . Borland International, Copyright 1992.