19 Haziran 2017 Pazartesi

8086,i286,i386 ve x64 mimaride adresleme

İ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 registerları protected modda  segment selector olarak bilinmektedir. Segment selectorun biçimi ise şu şekildedir.


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.

Global descriptor table üzerinden adres dönüşümü ; 

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