İntelin 8086 işlemcisi,x86
mimarinin temeli ve günümüze kadar bu
temel “geriye dönümlü uyumluluk” adı
altında ret edilmemiş ve üstüne konularak
gelişimine devam edilmiştir.
İntel firmasının “geriye dönümlü uyumluluk” felsefesini
ilk 64 bitlik işlemcilerde uygulayan firma AMD firması olmuştur.Bu yüzden kimi
zaman bu mimariye AMD64 veya x64
mimarinin x86 mimari ile uyumlu olduğunu ifade etmek için x86-64 mimari
denilmektedir.
Burada merak edenler
olabileceğini düşündüğüm için kısa birşeye
değinmek istiyorum.x86 mimarinin geriye dönümlü uyumluluğundan bahsederken
aslında İnstruction Set Architecture veya kısacası ISA kavramından
bahsediyoruz.işlemciler geliştirilirken iki önemli husus var bunlar geriye
dönümlü uyumluluğu sağlayan instruction set arhitecture ve diğeri ise microarchitecture.
Microarchitecture ve ISA için şöyle bir örnekleme yapabiliriz.elimizde iki adet kara
kutu olduğunu düşünelim ve her iki kutumuzunda X işini yapabildiğini
varsayalım ve ayrıca birinin diğerinden
daha gelişmiş olduğunu varsayalım. iki kara
kutu aynı X işi yapabilmesine rağmen iç yapılarında(microarchitecture)
aynı davranışı sergilemiyorlar.
Bilgisayar dünyasına geri gelecek
olursak bizim bu iç yapı ile konuşmamızı
sağlayan ise Instruction Set Architecture ve bizler buna bağlı olarak program
yazıyor,geliştiriyoruz.Her ne kadar yeni
işlemciler çıksa da ve ISA bir öncekine göre gelişmiş olsa da
uygulamalarımız x86 instruction seti ile
uyumlu olduğundan programlarımızdaki instructionları yeni çıkan bu
işlemciler de icra edebilir.
8086 Adresleme
~~~~~~~~~~~~~~~~
Konudan daha fazla uzaklaşmayalım
ve kaldığımız yerden devam edelim.yazının başında dediğimiz gibi 8086 işlemci
x86 mimarinin temeli ve bu işlemci
16-bit data bacağı ve 20-bit adres bacağına sahip.
20 bitlik adres bacağı olan bir
işlemci ile ne kadarlık bir alan adreslenebilir ? 2^20 bytelık ve MB cinsinden
ifade edecek olursak 1MB lık bir adres alanı adreslenebilir peki ya
16-bitlik data bacağı olan olan bir işlemci ile yazıcağımız programlar
ile ne kadarlık bir adres alanını adresleyebiliriz ? 2^16 bytelık KB cinsiden
ifade edecek olursak 64KB bir alanı adresleyebiliriz.
İntel mühendisleri SEGMENT:OFFSET çifti ile 8086 işlemcinin 16-bitlik data bacağı olsa dahi 1MB lık bir alan ile
çalışılabileceğini göstermişler.o halde SEGMENT:OFFSET çiftinden 20-bitlik bir
adres(fiziksel) üretilmesi gerekiyor peki intel mühendisleri bunu nasıl
gerçekleştirildi ?
SEGMENT:OFFSET çiftinden fiziksel adresler üretilmektedir. Segmentli çalışma ile RAM 16 adet
64KBlık segmentlere ayrılıyor ve programcı bu 64KB lık segmentlerle
çalışabiliyor.
SEGMENT:OFFSET --- > | SEGMENTATION UNIT | ---- > LINEAR ADDRESS
8086 işlemcisi,segmentation unit
ile SEGMENT:OFFSET çiftinden aşağıdaki biçimde
LINEAR ADDRESS elde edebiliyor.
LINEAR ADDRESS = ( SEGMENT
REGISTER * 16 ) + OFFSET
örnekleyecek
olursak ;
1234:3456
hexadecimal değerler ile ifade edilmiş
segment:offset çiftini
linear addrese dönüştürelim.
1234*16 --->
12340
3456
+
+
----------------------------
15796
8086 işlemcinin,çalışma modu real mod olarak bilinir ve real mode
içerisinde yalnız 1MB lık bir adres alanı adreslenebilir ve bazı SEGMENT:OFFSET çiftleri aynı linear
adrese karşı gelmektedir.
Son olarak Near jump ve Far
jump kavramlarından bahsedelim.Bir segment den başka bir segmente sıçrama yapılacak olursa buna
far jump aynı segment içerisinde bir sıçrama gerçekleşecekse buna da near jump denilmektedir.
i286
Adresleme
~~~~~~~~~~~~~~~~~
80286 veya i286, x86 mimarinin protected modu ilk olarak
kullandığı işlemci.yazının yukarı kısımlarında geriye dönümlü uyumluluktan
bahsetmiştik bu yüzden bu işlemci ilk çalıştığında real mod da çalışmaktadır.
i286 işlemcilerin 16 bit data bacağı ve 24 bit adres bacağı
bulunmaktadır. İ286 2^24 baytlık(16 MB) bir adres alanını adresleyebilir. Fakat
burada programcının tüm bu alanı adresleyemediğini biliyoruz. Çünkü tıpkı 8086
işlemci gibi data bacağımız 16 bit. İntel mühendisleri segment : offset
çiftlerini kullanarak fiziksel adres üretmek yerine(8086 işlemcideki gibi) koruma mekanizması için bazı bilgilerin tutulduğu tablolar aracılığıyla bu işi gerçekleştirdiler.Bu tablolar Global
Descriptor Table ve Local Descriptor Table. Bu tabloların amacı elbette adresleme değil fakat protected mode ile segmentlerin korunması için bu tablolar kullanılırken aynı zamanda adreslemede de kullanılmaktadır..(GDT ve LDT başka bir yazının konusu ve bu
yazıda yalnızca adreslemede nasıl kullanıldığı açıklanmıştır).
Segment Selector
Format
Segment selectorün yapısı yukarıdaki resimde gayet açık peki
bu selectorler adres çevriminde nasıl kullanılmakta sorusuna ise aşağıdaki
resim yardımcı olabilir.
Resimde
görüldüğü gibi segment selectorün ilk 13-biti(MSB den itibaren) global descriptor tablosunda
index olarak kullanılmaktadır. Bu ilk
13-bite karşı düşen gdt içindeki segment descriptordan ilgili segmentin base adresi
alınır ve programda kullanılan 16-bit offset ile toplanarak linear address elde
edilir. Bu linear adres fiziksel adrese karşı düşmektedir. Segment
descriptorların formatı ve içerisinde ne gibi bilgileri tuttuğu bu yazının konusu değildir. İlgili segmente ait Segment descriptorın tuttuğu base address ve
segmentin limiti gibi bilgiler segment registerların hidden kısmına yüklenir.
Bu şekilde aynı segmente üst üste erişimde tekrar tekrar global descriptor
tablosuna başvurmaya gerek kalmayacaktır.
Özet olarak i286 segmentli memory modeli ile çalışmaktadır.
Protected modun desteklendiği x86 mimarinin ilk işlemcisidir. Fakat tıpkı 8086
gibi maximum olarak bir segmentin boyutu ancak 64KB boyutundadır.
i386 Adresleme
~~~~~~~~~~~~~~~~~
İntel 80386 veya i386, i286 dan sonraki ilk 32-bit intel işlemcisi. 32-bit adres bacağına ve 32-bit data bacağına sahip. Protected mode
dışında virtual mode adında bir mod eklenmiştir ve paging mekanizması yine ilk olarak bu işlemcide görülmüştür.
virtual mode tam olarak nedir ? sorusu ile başlayalım. İntel i286 işlemci x86
mimarinin geriye dönümlü uyumluluk felsefesinden dolayı real mod uygulamalarını
da çalıştırmaktaydı fakat işlemcinin
reset edilmesi şartıyla çünkü işlemci ilk açılışında ancak real modda
çalışmaktaydı. İşlemcinin reset edilmesi ile real moda sokulması istenilen bir
şey olmadığından direk olarak protected mode içerisinde real mod uygulamaların
çalıştırılması gerekliydi.İntel mühendisleri bu durumu da protected mode
içerisinde real modu taklit ederek kısacası yeni bir mod ekleyerek giderdiler.
Bu mod virtual mode olarak isimlendirildi.
i386 işlemci adreslemeyi hem segmentation hem de paging ile
gerçekleştirmekte.i386 adreslemede segmentation kullanırken tıpkı i286 işlemci
gibi bir tablo aracılığı ile adreslemeyi yapmaktatır. Yukarıdaki örnekte olduğu
gibi global descriptor tablosu üzerinden adreslemeyi gerçekleştirdiğimizi
düşünelim. Bu durumda global descritor tablosundan alacağımız 32-bit lik
segmentin base adresi 0 olacaktır. Bunun nedeni ise oldukça basit elinizde
32-bit data bus var ise ulaşılabilecek maximum adres alanının(32-bit adres
bacağı -> 4GB) tamamını adresleyebilirsiniz. Fakat yine belirtelim bu
tablolar sadece adres çevriminde kullanılmıyor.Buradaki her bir descriptor
ilgili segmentin karakteristiğine ilişkin bilgi taşıyor.
i386 adreslemeyi nasıl gerçekleştiriyor bunu
görselleştirmek istersek ;
0x08042420 ile 0x0 değerinin toplanması sonucu elde edilen
adres yine 0x08042420 adresinin kendisi olacaktır. bu adrese i286
işlemcilerindeki gibi linear adres denilmektedir. i286 işlemcide linear
adresler direk fiziksel adrese karşı gelirken i386 da bu adresler fiziksel
adres değildir. fiziksel adresin elde edilmesi için paging unit ile linear
adresin fiziksel adrese çevrilmesi gerekir. i386 işlemcilerin kullandığı bu
memory modelinin adına flat memory modeli denilmektedir. Bu memory modelinde programcı
için tüm memory tek bir parça gibi
görünmektedir.
İ386
işlemci için adreslemenin nasıl yapıldığını özetleyecek olursak şu şekildedir.
x64 mimari Adresleme
~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~
Son olarak x64 mimaride adresleme nasıl gerçekleşiyor
diyorsanız paging kullanılarak
gerçekleştirilmektedir.Paging mekanizması virtual memory kavramını da beraberinde getirdi. Aslında i386 ve sonrası işlemciler için modern işletim sistemlerinin segmentation yöntemini adreslemede
kullanmadığını biliyoruz. Çünkü paging ile processler birbirinden izole edilebilmekte, sayfalar korunabilmekte ve sayre. Fakat zamanında paging gibi bir mekanizmanın olmaması segmentli yapıyı zorunlu kılıyordu çünkü bir şekilde uygulamaların segmentlenerek birbirinden izole edilmesi gerekiyordu.
Son olarak x64 mimaride sanal adresler canonical adres
formundadır.canonical adres formunun ne olduğunu merak ediyorsanız virtual
memory başlıklı yazıda bahsettiğim o kısma bakabilirsiniz.
Umarım faydalı olmuştur.
Referanslar
~~~~~~~~~~~~~~~~~
AMD64 Arhitecture Programmer's Manual Volume 2: System Programming
EOF
Hiç yorum yok:
Yorum Gönder