Intel Bellek Modeli - Intel Memory Model

Gelen bilgi işlem , Intel Bellek Modeli altı farklı bellek modelleri bir dizi ifade eder x86 CPU işletim gerçek mod nasıl kontrol segmenti kayıtları kullanılır ve işaretçiler varsayılan boyutu.

Bellek bölümleme

16 bit x86 bölümlü bellek mimarisinde dört bölüme başvurmak için dört yazmaç kullanılır. DS ( veri segmenti), CS ( kod segmenti), SS ( yığın segmenti) ve ES (ekstra segment). Başka bir 16 bitlik kayıt, belirli bir segmentte bir ofset olarak işlev görebilir ve bu nedenle bu platformdaki mantıksal bir adres, segment : offset , tipik olarak onaltılık gösterimde yazılır. Gerçek modda, bir bellek baytının fiziksel adresini hesaplamak için, donanım uygun bölüm yazmacının içeriğini 4 bit sola kaydırır (etkin bir şekilde 16 ile çarparak) ve sonra ofseti ekler.

Örneğin, 7522: F139 mantıksal adresi, 20 bitlik fiziksel adresi verir:

  75220
+ F139
  84359

Bu işlemin , verilen herhangi bir fiziksel adresin 4096'ya kadar karşılık gelen mantıksal adrese sahip olacağı şekilde belleğin örtüşmesine yol açtığını unutmayın . Bu, işaretçilerin farklı segmentlerle karşılaştırılmasını zorlaştırır.

İşaretçi boyutları

İşaretçi biçimleri yakın , uzak veya büyük olarak bilinir .

  • Yakın işaretçiler, referans segment içindeki 16 bit ofsetlerdir, yani veriler için DS ve kod için CS. En hızlı işaretçilerdir, ancak 64 KB bellekle sınırlıdır (veri türünün ilişkili segmentine). Yakın işaretçiler kayıtlarda tutulabilir (tipik olarak SI ve DI).
    mov bx, word [reg]
    mov ax, word [bx]
    mov dx, word [bx+2]
  • Uzak işaretçiler , bir segment ve bir uzaklık içeren 32 bitlik işaretçilerdir. Bunları kullanmak için, komut kullanılarak segment kaydı ES kullanılır les [reg]|[mem],dword [mem]|[reg] . 1024 KiB belleğe kadar başvurabilirler  . İşaretçi aritmetiğinin (toplama ve çıkarma) işaretçinin segment bölümünü değiştirmediğini, yalnızca ofsetini değiştirdiğini unutmayın. Sıfır veya 65535 (0xFFFF) sınırlarını aşan işlemler, herhangi bir normal 16-bit işlemde olduğu gibi 64K modulo işlemine maruz kalacaktır. Örneğin, segment kaydı 0x5000 olarak ayarlanmışsa ve ofset artırılıyorsa, bu sayaç ofseti (0x10000) olduğu anda , elde edilen mutlak adres 0x5000: 0000'e dönecektir.
    les bx,dword [reg]
    mov ax,word [es:bx]
    mov dx,word [es:bx+2]
  • Büyük işaretçiler esasen uzak işaretçilerdir, ancak her değiştirildiğinde (çoğunlukla) normalleştirilir, böylece o adres için mümkün olan en yüksek segmente sahip olurlar. Bu çok yavaştır, ancak işaretçinin birden çok segmenti işaret etmesine izin verir ve platform düz bir bellek modeliymiş gibi doğru işaretçi karşılaştırmalarına izin verir : Yukarıda açıklandığı gibi belleğin örtüşmesini yasaklar, bu nedenle aynı belleğe başvuran iki büyük işaretçi konum her zaman eşittir.
    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]

Bellek modelleri

Bellek modelleri şunlardır:

Modeli Veri Kod Tanım
Çok küçük* yakın CS = DS = SS
Küçük yakın ** yakın DS = SS
Orta yakın ** Irak DS = SS, birden çok kod segmenti
Kompakt Irak yakın tek kod bölümü, birden çok veri bölümü
Büyük Irak Irak çoklu kod ve veri segmentleri
Kocaman Kocaman Irak çoklu kod ve veri segmentleri; tek dizi> 64 KB olabilir

Diğer platformlar

Olarak korumalı modu , bir kademeli yazılabilir ve çalıştırılabilir hem olamaz. Bu nedenle, Tiny bellek modelini uygularken, kod bölümü kaydı aynı fiziksel adresi göstermeli ve veri bölümü yazmacı ile aynı limite sahip olmalıdır. Bu, 80286'nın özelliklerinden birini yendi , bu da veri segmentlerinin hiçbir zaman çalıştırılabilir olmamasını ve kod segmentlerinin hiçbir zaman yazılabilir olmamasını sağlar (bu, kendi kendini değiştiren koda asla izin verilmediği anlamına gelir ). Bununla birlikte, 80386'da, disk belleğine alınmış bellek yönetim birimi ile, ayrı bellek sayfalarını yazmaya karşı korumak mümkündür.

Bellek modelleri 16 bit programlarla sınırlı değildir. Bölümlemeyi 32 bit korumalı modda da kullanmak mümkündür (48 bitlik işaretçilerle sonuçlanır) ve bunu destekleyen C dili derleyicileri vardır. Bununla birlikte, 32 bit modundaki bölümleme, bazı bölümler her zaman bellekte bulunmadığı ve doğrusal adres alanı yalnızca daha büyük bölümlere ayrılmış sanal alan üzerinde bir önbellek olarak kullanılmadığı sürece, tek bir bölümün kapsayacağından daha büyük bir adres alanına erişime izin vermez. . Çeşitli nesnelere erişim için daha iyi koruma sağlar (1 MB'ye kadar olan alanlar, tek sayfalama tarafından sunulan kaba 4 KiB tanecikliliğine karşı bir baytlık erişim koruması tanecikliğinden yararlanabilir) ve bu nedenle yalnızca telekomünikasyon gibi özel uygulamalarda kullanılır yazılım. Teknik olarak, "düz" 32 bit adres alanı, bölümlere ayrılmış adres alanı için "küçük" bir bellek modelidir. Her iki hüküm altında, dört bölüm kaydının tümü bir ve aynı değeri içerir.

x86-64

Açık x86-64 platformunda, yedi hafıza modellerinin toplam sembolü referansların çoğunluğu yalnızca 32 bit genişliğinde olduğu gibi, mevcut ve adresleri, bağlantı zaman biliniyorsa, (aksine konumdan bağımsız kod ). Bu, her zaman düz 64 bitlik işaretçiler olan kullanılan işaretçileri etkilemez, sadece semboller aracılığıyla erişilmesi gereken değerlerin nasıl yerleştirilebileceğini etkiler.

Ayrıca bakınız

Kaynakça

  • Turbo C ++ Sürüm 3.0 Kullanım Kılavuzu . Borland International, Telif Hakkı 1992.

Referanslar