|
Abruzzi
|
 |
« : Mayıs 14, 2008, 17:23:07 ÖS » |
|
GİRİŞ 80286, 386, 486 ve PENTIUM İŞLEMCİLERİNİN ÇALIŞMA MODLARI Dünyanın ilk mikroişlemcisinin 1974 yılında Intel firması tarafından tasarlanan ve üretilen 8080 olduğu söylenebilir. Her ne kadar Intel daha önce 4040 ve 8008 gibi işlemciler tasarladıysa da, bunlar bir mikroişlemcide olması gereken bütün fonksiyonlara sahip değildi. Bu nedenle 4040 ve 8008 yalnız elektronik hesap makinalarında kullanılmıştır. Gerçi Intel 8080 işlemcisini mikrobilgisayar yapmak için tasarlamamıştır. Bu mikroişlemciden mikrobilgisayar yapma fikri IBM, DEC gibi o zamanın büyük firmaları tarafından da geliştirilmedi. Aslında mikrobilgisayar devrimini Edd Roberts isimli bir kişinin başlattığı kabul edilebilir. Edd Roberts 8080 çıktığında bununla bir mikrobilgisayar yapılabileceğini düşünmüş ve o zamanın ünlü dergisi “Popular Electronics”e kapak olmuştu. Daha sonra Edd Roberts’ın tasarladığı mikrobilgisayara işletim sistemi ve BASIC derleyicisi, Microsoft şirketini kuracak olan Bill Gates ve Paul Allen tarafından yazıldı. Intel, 8080 işlemcisinin BASIC gibi yüksek seviyeli bir dili desteklemeyeceğini iddia etmiş olsa da, kısa süre sonra fikrinden vazgeçerek mikrobilgisayar devrimini kabullenmiştir.[13] Intel’in mikroişlemci pazarındaki tekeli ise uzun sürmedi. Mikrobilgisayar fikrinin tuttuğunu gören Motorola firması hemen ertesi yıl 6800, Zilog firması da Z80 mikroişlemcileri ile pazardaki yerlerini aldılar. Intel’den ayrılan iki mühendis tarafından tasarlanan Z80 hem 8080’e benziyor hem de ondan iki kat daha hızlı çalışıyordu. Bunun üzerine Intel atağa geçerek 8080 mikroişlemcisini optimize etmiş ve 8085’i tasarlamıştır.[13] 8080, 6800, Z80 ve 8085 işlemcilerinin hepsi 8 bit mikroişlemcilerdi. 64K belleği adresleyebilen bu mikroişlemciler o günlerde gereksinimi büyük ölçüde karşılıyordu. Ancak Intel ileride 64K belleğin yetmeteceğini diğerlerinden önce görüp, girişimi elde bulundurmak amacıyla – ciddi bir ihtiyaç olmamasına rağmen – 1978 yılında 8086’yı piyasaya sürdü. 8086 mikroişlemcisi 1MB ( 1024K ) belleği adresleyebilen 16 bitlik bir mikroişlemcidir. [13] 8086 işlemcisinin 1980 yılına kadar ciddi bir anlamda kullanılmadığını söylemek hata olmaz. 1980 yılında IBM, Intel’in 8086 işlemcisi ile herkesin evinde kullanabileceği bir kişisel bilgisayar yapmak için kolları sıvadı. O zamana kadar 8 bit tabanlı bilgisayarlarda CPM denilen nispeten basit bir işletim sistemi kullanılıyordu. IBM yeni kişisel bilgisayarı için, tamamen yeni bir işletim sistemi arayışına girişti. Mikrobilgisayarlara sistem yazılımı geliştirme konusunda deneyim kazanmış olan Microsoft ile DOS işletim sistemi üzerinde anlaşıldı. Böylece ilk kişisel bilgisayar 1981 yılında Intel firmasının 8086 mikroişlemcisi ve Microsoft firmasının DOS işletim sistemiyle piyasaya sürülmüş oldu. Bundan sonra Intel 8086 işlemcisinin üst modellerini çıkarttıkça, IBM bunları kullanarak kişisel bilgisayarları geliştirmiş ve hızlandırmıştır.[13] İlk kişisel bilgisayarlar ve DOS işletim sistemi 8086’lar zamanında tasarlandığı için Intel sonraki modellerde geriye doğru uyumu da sürekli korumuştur. Yani bugün bir Pentium, 1978 yılında tasarlanmış olan 8086 gibi de çalışabilmektedir. Eğer Pentium DOS işletim sistemi ile çalıştırılıyorsa, o bir 8086 gibi kullanılıyordur. DOS programlarının çok yaygınlaşmış olması 386, 486 ve Pentium gibi Intel işlemcilerinin güçlü özelliklerinin uzun süre kullanılamamasına yol açtı. 90’lardan sonra Windows işletim sisteminin yaygınlaşması ile bir ölçüde 8086 mimarisinden kurtulunmuş olundu. [13] Intel sonraki modellerde geriye doğru uyumu koruyabilmek için işlemciyi çeşitli çalışma modlarına ayırdı. Böylece sonraki modellerin 8086’yı desteklemesi de mümkün olmuştur. Örneğin, istenirse 32 bit Intel işlemciler real ( gerçek ) modda çalıştırılabilinir. Bu durumda işlemci 8086 gibi çalışacaktır. Ya da protected mod ile işlemcinin bütün ileri özellikleri etkin hale getirilecektir. Tabii ki işlemcinin hangi modda kullanılacağı işletim sistemine bağlıdır. [13] Intel Pentium işlemcilerden önce DOS programları ve protected mod programları aynı anda çalışamıyordu. DOS programları ve protected mod programlarının çok işlemli bir biçimde çalışabilmesi için Virtual 86 modu tasarlanmıştır.[13] Önceleri virtual 86 modu, Intel 80386 ile çalışıyordu ve sonraki işlemcilerde protected mod kullanan işletim sisteminin altında real mod programlarını da çalıştırır duruma getirdiler. Bu mod, protected modun bir alt yani ikincil modudur.[21] 386, 486 ve Pentium işlemcilerinin görüldüğü üzere toplam üç çalışma modu vardır: Real ( Gerçek mod ) mod, virtual 8086 mod ( sanal 8086 mod ) ve protected mod ( korumalı mod ). Virtual 8086 mod 286 işlemcilerin¬de yoktu; ilk kez 386’larla eklenmiştir.[13] 80 x 86 İşlemcilerinin Çalışma Modları
Real mod Virtual 86 mod Protected mod (286’larda yok) Şekil Giriş.1 : Çalışma Modları Real modda işlemci küçük farklılıklar dışında 8086 gibi çalışır. Protected mod, programlar arasında bellek ayrımının sağlandığı, 32 bit çok işlemli çalışmanın mümkün olduğu, sayfalama ve sanal bellek işlemlerinin gerçekleştirilebildiği işlemcinin en geniş çalışma modudur. Çok işlemli işletim sistemlerinin hepsi bu modu kullanırlar. Intel virtual 86 modu, protected mod programları ile real mod programları arasında görevler arası geçiş (task switch) yapılabilmesi amacıyla tasarlamıştır. Yani virtual 86 mod, “protected modun çeşitli özelliklerinin kullanılabildiği real mod” denebilecek ara bir moddur. Bu mod 80286 işlemcilerinde yoktu. Intel özellikle protected modda çalışan işletim sistemlerinin DOS programlarını aynı anda çalıştırılabilmesi için eklemiştir.[13]
BÖLÜM I KAYDEDİCİLER 1.1. 8086/8088 KAYDEDİCİ YAPISI 8086/8088 Kaydedicileri 3 grupta toplanabilir. 1.1.1. Genel Amaçlı Kaydediciler (General Purpose Registers) Bu grupta yer alan kaydediciler programcı tarafından çok değişik amaçlar için kullanılabilirler. 8086/8088 de 4 adet genel amaçlı kaydedici vardır. Bu kaydediciler AX (Accumulator) , BX (Base) , CX (Count) , DX (Data) kaydedicileridir . Bu kaydedicilerin alçak ve yüksek anlamlı 8 biti ayrı ayrı kullanılabilirler. Örneğin AX kaydedicisin yüksek değerli 8 biti AH ve düşük değerli 8 biti AL olarak kullanılabilir. [1] Genel amaçlı kaydediciler aritmetik ve mantıksal işlemlerde doğru¬dan kullanılabilirler. AX (accumulator) kaydedicisi diğerlerinden daha geniş kullanıma sahiptir. Bazı komutlar yalnızca AX için tasarlan¬mıştır; ya da bazı komutları AX ile kullanmak daha verimlidir BX (base register) aritmetik ve mantıksal işlemlerin yanı sıra indeksle¬me amacıyla da kullanılır. CX ve DX genel amaçlı olmanın dışında bazı komutların default operandı olarak da kullanılır.[13] Şekil 1.1 : Genel Amaçlı Kaydedicilerin Yapısı AX kaydedicisi bir aritmetik veya lojik işlemden sonra sonucu üzerinde tuttuğu için toplam (accumulator ) olarak adlandırılmıştır.[1] • BX kaydedicisi hafızada yer alan bir verinin taban adresini tutmakta sık olarak kullanıldığı için taban ( base ) olarak adlandırılmıştır. [1] • CX bit kaydırma veya döndürme gibi işlemlerde bit sayısını tutmada döngülerde sayaç olarak kullanılmasından dolayı sayıcı ( count ) olarak adlandırılmıştır.[1] • DX özellikle 16 bit çarpma işlemlerinden sonra sonucun yüksek değerli kısmını , bir bölme işleminden önce bölünen sayının yüksek değerli kısmını tutma işlemlerinde kullanıldığı için veri ( data ) olarak adlandırılmıştır. [1] 1.1.2. İşaretçi ve İndis Kaydedicileri (Pointer and index registers ) İşaretçi ve indis kaydedicileri genel amaçlı olarak da kullanılabilmelerine rağmen genellikle hafızaya erişmede indis ve işaretçi olarak kullanılırlar. [11] • SP ( Stack pointer - Yığın işaretçisi ) :Stack ( yığın ) hafızada yer alan bir veriyi adresleme de kullanılır. Interrupt işlemlerinde otomatik olarak CPU tarafından verileri stack hafızaya atmada kullanılır. [11] • BP ( Base Pointer - Taban İşaretçisi ) : Satck hafızada bulunan bir veri dizisini adresleme de kullanılır.[11] • SI ( Source Index - Kaynak İndisi ):String komutlarında kaynak veriyi dolaylı adresleme de kullanılır.[11] • DI ( Destination Index - Hedef İndisi ) :String komutlarında hedef veriyi dolaylı adresleme de kullanılır.[11] • IP ( Instruction Pointer - Komut İşaretçisi ): Her zaman mikroişlemci tarafından yürütülecek bir sonraki komutu adresleme de kullanılır. IP içeriğinin CS * 10h ile toplanmasıyla bir sonraki komutun gerçekte olan fiziksel hafıza adresi bulunur. [11] 1.1.3. Segment Kaydedicileri (Segment Registers ) Mikroişlemci deki diğer kaydedicilerle beraber hafıza adresleri üretmede kullanılırlar.8086/8088 de 4 tane segment kaydedicisi vardır. [11] • CS ( Code Segment ) :Kod segment kaydedicisi , hafızanın programları ve alt programları tutan bir bölümüdür. CS kaydedicisi , program kodunun başlangıç taban adresini belirler. [11] • DS ( Data Segment) : Veri segment 'i bir program tarafından kullanılan verilerin bulunduğu hafıza alanıdır. DS kaydedicisi bu veri alanının başlangıç taban adresini belirler. [11] • ES ( Extra Segment): Bazı string komutlarında kullanılan extra segmenttir.[11] • SS ( Stack Segment): Stack için kullanılan hafıza alanını belirler. Stack segmentine yazılacak veya okunacak verinin adresi SP kaydedicisi tarafından belirlenir. BP kaydedicisi de SS de bulunan veriyi adreslemede kullanılır.[11] 1.2. 80386 / 80486 / PENTIUM İŞLEMCİLERİNİN KAYDEDİCİ YAPISI 32 bit Intel kaydedicileri 5 gruba ayrılarak incelenebilir. 1- Genel Amaçlı Kaydediciler (General Purpose Registers) 2- Segment Kaydedicileri (Segment Registers) 3- Koruma Kaydedicileri (Protection Registers) 4- Kontrol Kaydedicileri (Control Register) 5- Debug ve Test Kaydedicileri (Debug and Test Registers) 1.2.1. Genel Amaçlı Kaydediciler (General Purpose Registers ) EAX , EBX , ECX , EDX , ESI , EDI , ESI , EBP ,ESP kaydedicilerine genel amaçlı kaydediciler olarak kabul edilir. Bu kaydedicilerin 8086 / 8088 den farkları genişletilmiş bir yapıya sahiptir. Kaydedicileri baş harfi olan E ingilizcede extended (genişletilmiş) anlamında kullanılmıştır. 8086 /8088 kaydedicileri 16 bit olmasına karşın bu kaydediciler 32 bitliktir. 8086 ve 80286 işlemcisi ile uyumu sağlayabilmek amacıyla bu işlemciler 4 parça halinde tasarlanmıştır. Bu sayede 80286 da yazılan bir program 80386 veya daha üst düzeyde çalışabilmektedir.[13] Genel amaçlı kaydediciler bilgileri saklamak ve hesaplama yapmak amacıyla kullanılırlar. EAX, EBX, ECX ve EDX kaydedicileri 16 bit 8086 ve 80286 işlemcisiyle uyumu koruyabilmek için dört parça halinde tasarlanmıştır. Bu durumda programa EAX kaydedicisini 32 bit olarak, AX kaydedicisinin bunun düşük anlamlı 16 biti olarak ya da AH ve AL yazmaçlarını 8 bit olarak kullanabilir. Bu kaydediciler yüksek anlamlı 16 bitlerini bağımsız olarak kullanmazlar.[13] EBP kaydedicisi 32 bit segmentlerde stack işlemlerinin yapılması için BP kaydedicisinin genişletilmiş bir biçimi olarak kullanılır. Programlama dillerindeki yerel değişkenlerin çoğu stack bölgesinde saklanır ve bu kaydedici sayesinde erişebilirler. ESI ve EDI kaydedicileri de SI ve DI kaydedicilerinin genişletilmiş biçimidir. Data segmentlerinde indeksleme yapma amacıyla kullanılırlar. ESP ise 32 bit stack göstericisi olarak kullanılmaktadır.[13] Şekil 1.2 : Genel Amaçlı Kaydedicilerin Yapısı 1.2.2. Segment Kaydedicileri (segment registers ) 8086 / 8088 den farklı olarak bu işlemcileri 2 tane daha ek segment kaydedici konmuştur . Bunlar FS ve GS segment kaydedicileridir. İlk kez 386 işlemcilerinde tanımlanmıştır ve tamamen ekstra kullanımlar içindir. Bu segment kaydedicileri ekstra veriler için tasarlanmış segment kaydedicileridir. [12,19] 386 , 486 , Pentium işlemcilerde her segment kaydedicisinin bir de programcıya kapalı olan tampon kısmı vardır bu tampon kısım 64 bit uzunluğundadır. [12] Segment kaydedicilerinin işlevi real mod ve virtual 86 modda aynıdır. Bu modlarda segment kaydedicileri tıpkı 8086 işlemcisinde olduğu gibi fiziksel bellekte 64K’lık segment bölgelerinin başlangıcını gösterirler. Mikroişlemci segment kaydedicisindeki bilgiyi 16 ile çarpar, bu değeri ofset bilgisi ile toplayarak doğrusal ( lineer address) adresi elde eder.[13,19] Şekil 1.3 : Segment Kaydedicilerinin Yapısı CS program kodunun bulunduğu segmentin başlangıç adresini tutar. SS stack bölgesine, DS ise data segment bölgesine ilişkindir. ES, FS, ve GS ek segment kaydedicilerdir. ES string işlemlerinde zorunlu olarak kullanıldığı halde, FS ve GS ilk kez 386 işlemcilerinde tanımlanmıştır ve tamamen ekstra veri kullanımları içindir. Programcıya kapalı oan tampon kısmı tanımlayıcı bilgilerinin tutulduğu tampon bir kaydedicidir. Tampon kaydediciler tanımlayıcılar gibi 8 byte uzunluğundadır. İşlemci, segment kaydedicilerine yapılan bir yükleme sırasında tanımlayıcıyı otomatik olarak tanımlayıcı tablodan çekerek ilgili tampon kaydediciye yerleştirir.[12] 1.2.3. Koruma Kaydedicileri ( Protection Registers ) Koruma mekanizmasıyla doğrudan bağlantılı olan 4 adet kaydedici vardır. Bunlar GDTR , LDTR ,IDTR ve TR kaydedicileridir. [13] GDTR (Global Descriptor Table Register ): Global tanımlayıcı tablonun başlangıç adresini tutar . Global tanımlayıcı tablo protected moda geçilmeden önce oluşturulmalı ve GDTR kaydedicisi de tablonun başlangıç adresine gösterecek biçimde yüklenmelidir.[13] IDTR (Interrupt Descriptor Table Register ): Interrupt tanımlayıcı tablo kaydedicisi interrupt tanımlayıcı tablonun başlangıç adresini tutar. Protected modda interrupt işlemleri real moddakinden farklı olarak interrupt tanımlayıcı tablo yoluyla yönlendirilmektedir. Yani real moddaki interrupt vektörü yerine protected modda interrupt tanımlayıcı tablo vardır. Interrupt tanımlayıcı tablo da protected moda geçmeden önce oluşturulmalı ve IDTR kaydedicisi tablo başlangıç adresi ile yüklenmelidir.[13] GDTR ve IDTR kaydedicilerinin 48 bit uzunluğunda olduğuna ve içerisinde bir de limit alanının bulunduğuna dikkat edin. Bu limit tabloların byte cinsinden uzunluğunu gösterir Limit için 16 bit ay¬rılmıştır ve 16 bit ile yazılacak en büyük sayı 64 K mertebesindedir Limit kısmı koruma mekanizmasının sağlanması için gereklidir İş¬lemci limit dışındaki erişimleri dahili bir interrupt çağırarak engeller. Ayrıca her iki kaydedicideki adres de fiziksel adres değil, doğrusal ad¬restir. LDTR (Local Descriptor Table Register) yerel tanımlayıcı tab¬lonun başlangıç adresinin ve limit bilgisinin yazılı olduğu tanımlayıcıya ilişkin bir selektör belirtir Yani yerel tanımlayıcı tablonun başlangıç adresi doğrudan bu kaydedicide saklanmaz; bu kaydedici 16 bit uzunluğunda bir selektör gösterir. Asıl değerler bu selektörün gösterdiği yerden çekilmektedir. [13] LDTR ( Local Descriptor Table Register ) : Yerel tanımlayıcı tablonun başlangıç adresinin ve limit bilgisinin yazılı olduğu tanımlayıcıya ilişkin bir selektör belirtir. Yani yerel tanımlayıcı tablonun başlangıç adresi doğrudan bu tabloda saklanmaz . Bu kaydedici 16 bit uzunluğunda bir selektör gösterir. Asıl değerler bu selektörün gösterdiği yerden çekilmelidir.[13] TR ( Task Register ) : O anda çalışmakta olan programa ilişkin görev durum segment tanımlayıcının selektör bilgisini tutar. TR kaydedicisi de 16 bit uzunluğunda ki bir selektörden oluşur. Gösterdiği tanımlayıcının global tanımlayıcı tablo içinde olması gerekmektedir.[13] Şekil 1.4 : Koruma kaydedicileri yapısı
1.2.4. Kontrol Kaydedicileri ( Control Register ) Kontrol kaydedicileri protected moda geçiş, sayfalama, matematik iş¬lemci, dahili tampon yönetimi gibi önemli işlemlerin düzenlenmesi amacıyla kullanılır. Kontrol kaydedicileri 386, 486 ve Pentium model¬lerinde küçük farklılıklar göstermektedir.Kontrol kaydedicileri 32 bit uzunluğundadır ve 386 - 486 işlemci¬lerinde CR0, CR1, CR2, CR3 olmak üzere dört tanedir. Pentium iş¬lemcilerinde CR4 kaydedicisinin eklenmesiyle sayıları beşe çıkartılmıştır. Kontrol kaydedicilerine yükleme işlemi MOV CRX, Reg makine komutlarıyla yapılabilir. Ancak komutu çalıştıran programın en ön¬celikli seviyede (sıfırıncı öncelik) bulunması gerekir. [11,13] 1.2.4.1. CR0 Kaydedicisi Bu kaydedici işlemcinin en önemli işlevlerinin düzenlenmesi ama¬cıyla kullanılır. CR0 kaydedicisindeki her bit, çeşitli işlemlerin müm¬kün olduğunu ya da engellendiğini göstermektedir.[13] 31 30 29 18 17 16 5 4 3 2 1 0 P C N A W N E T E M P G D W RESERVED M Res P RESERVED E T S M P E Şekil 1.5 : CR0 Kaydedicisinin Yapısı Not : Taralı olan bitler 386’dan sonra tanımlanmıştır. PG ( Paging ) : Sayfalama mekanizmasının etkin duruma getiril¬mesi için bu bit kullanılır. İşlemci, PG = 1 ise sayfalama mekaniz¬masının etkin durumda olduğunu anlar ve doğrusal adresleri dizin ve sayfa tablolarıyla fiziksel adreslere dönüştürür. Genellikle bu bit işletim sisteminin yüklenmesi sırasında bir kez 1 yapılır, bir daha değeri değiştirilmez.[13] CD ( Cache Disable ) : Bu bit dahili tampon sisteminin olmadığı 386 işlemcilerinde yoktur, 486 ve Pentium modellerinde vardır Bu bit 1 yapıldığında dahili tamponlamanın etkinliği sonlandırılır. Yani işlemci artık dahili tamponunda olmayan bellek bölgelerine eriştiğin¬de bunu tampona yazmayacaktır. Ancak bu durum tampondan okuma yapılamayacağı anlamına da gelmez. Bellekten okuma yapıl¬dığında CD = 1 olsa bile dahili tampona bakılır. Tamponlama işlemi¬ni tamamen kapatmak için CD = 1, NW = 1 ve INVD komutu ile bellek tazeleme işlemleri yapılmalıdır.[13,11] NW ( No write – through ) : Bu bit de pentium işlemcilerinde yoktur. NW ile CD normal olarak aynı değerdedir Örneğin tampon bellek tamamen kapatılacaksa her iki bit de 1 yapılmalıdır.CD = 1 ve NW = 0 durumu dahili tampona yazmayı engeller, an¬cak tampondan okumayı engellemez.[13] AM ( Alignment Mask ) : 486 ve Pen¬tium modellerinde tanımlıdır. AM = 1 durumunda EFLAGS kaydedicisindeki AC biti etkin hale gelir. AM = 0 ise AC biti dikkate alın¬mamaktadır.[13] WP ( Write Protect ) : 386 işlemcilerinde yoktur, 486 ve Pentium modellerinde vardır Bu bit sayfalama mekanizması etkin olduğun¬da eğer sayfa sistem programcısı modundaysa yazma işleminin kısıtlanmasında kullanılır.[13] NE ( Numerics Exception ) : 486 ve Pentium modellerinde vardır. Eğer bu bit 1 ise matematik işlemci¬nin yol açtığı hatalar karşısında 16h interrupt’ı çağrılır; NE = 0 duru¬munda ise eski sistemde olduğu gibi 13h interrupt’ı ile işlemler yürütülür.[13] ET ( Extention Type ) : Bu bit ilk kez 80386 ile eklenmiştir. 80386’ya matematik işlemci olarak 80287 ya da 80387 bağlanabili¬yordu. Reset işlemiyle 80386 kendisine matematik işlemci olarak ne¬yin bağlı olduğunu tespit etmeye çalışmaktadır. Eğer 80387 bağlıysa bu bit 1 yapılır Bu bitin 0 olması matematik işlemcinin bağlı olma¬dığı ya da 80287 ‘ nin bağlı olduğu anlamına gelir. Böylelikle sistem programcısı bu bite bakarak matematik işlemci cinsini tespit edebi¬lir. (Bu tespiti yapmanın yazılımsal yolları da vardır) 486-DX ve Pentium modelleri kendi içerisinde matematik işlemciyi de içerdi¬ğinden, bu modellerde bu bit sürekli görevler arası 1 durumundadır.[13,11] TS ( Task Switch ) : İşlemci görevlerarası geçiş sırasında TS bitini 1 yapar. TS = 1 yapıldıktan sonraki ilk matematik işlemci komutu bir interrupt çağrılmasına yol açacaktır. Bu özellik işletim sisteminin görevler arası geçiş sırasında matematik işlemci kaydedicilerini sakla¬yarak zaman kaybetmesini engeller. Matematik işlemci bilgileri 100 byte’ tan daha uzun sürmektedir.[13,11] EM ( Emulate Math Coprocessor ) : Eğer bu bit l ise gerçek sayı işlemleri matematik işlemci tarafından yapılır, değilse işletim siste¬mi komutu tamsayı işlemleriyle emüle eder. Bu bit 0 ise işlemci emülasyonu sağlamak amacıyla her matematik işlemci komutu için 7 numaralı dahili interrupt’ı çağırmaktadır.[13,11] MP ( Monitor Coprocessor ) : Bu bit WAIT işleminde etkilidir.[13] PE ( Protected Enable ) : Protected moda geçiş bu bitin 1 yapıl¬masıyla olur. Tabii protected moda geçmeden önce birtakım hazır¬lıkların yapılmış olması gerekir. 386, 486 ve Pentium modellerinde bu bit 0 yapılarak real moda geri dönüş mümkündür.[13,11] CR0 kaydedicisi reset sonrası 60000001H değerine çekilmektedir. Bu değer şu anlama gelir: - Sayfalama işlemi etkin değildir (PG = 0) - İçsel tampon belleği kapalıdır (CD=1 ve NW =1) - Hizalama kontrolüne ilişkin dahili interrupt değildir. (AM=0 ) - Sistem programcısının sayfaya yazabilmesi sayfa tablosundaki duruma bağlıdır. (WP= 0) - İşlemci real moddadır. (PE= 0) - Matematik işlemci birimi etkin değildir. (MP= 0 ve EM = 0) - Görevlerarası geçiş henüz yapılmamıştır (TS= 0)[13] 1.2.4.2. CR1 Kaydedicisi Bu kaydedici şu ana kadar ki hiçbir modelde kullanılmamıştır. An¬cak Intel bu kaydediciyi ileri modellerde kullanmak üzere ayırmış ola¬bilir. Bu kaydediciden okuma yapıldığında 0 değeri elde edilir.[13] 1.2.4.3. CR2 Kaydedicisi Bir sayfalama hatası (page fault) oluştuğunda sayfalama hatasını oluşturan doğrusal adres CR2 kaydedicisinde tutulur. Sayfalama me¬kanizmasının olmadığı 286’larda bu kaydedici tanımlı değildir. CR2 kaydedicis reset işlemiyle birlikte 00000000H değerine çekilir.[13] 1.2.4.4. CR3 Kaydedicisi Bu kaydedicinin yüksek anlamlı 20 biti sayfalama işlemleri için dizin tablosunun başlangıç adresini tutar. 286 işlemcilerinde sayfalama mekanizması olmadığı için CR3 kaydedicisi de yoktu. Ayrıca 486 iş¬lemcileriyle birlikte iki yeni bit de tamamlanmıştır. CR3 kaydedicisinin yüksek anlamlı 20 biti dizin tablosunun fiziksel adresini tutmaktadır. CR3 Intel mimarisinde protected modda fizik¬sel adres tutan tek kaydedicidir. PCD ve PWT bilen 486 ile birlikte tanımlanmıştır ve tamponlama işlemleri üzerinde etkili olur.CR3 kaydedicisi reset işlemiyle sıfırlanmaktadır.[13] 1.2.4.5. CR4 Kaydedicisi Bu kaydedici Pentium’ larla birlikte tanımlanmıştır, yani normal olarak 286, 386 ve 486’lı işlemcilerde yoktur. Ancak Intel, Penti¬um’dan sonra ürettiği 486’lı işlemcilere de bu kaydediciyi eklemiştir.[13] 1.2.5. Debug ve Test Kaydedicileri (Debug and Test Registers) 386, 486 ve Pentium işlemcilerinde 32 bit uzunluğunda 8 debug kaydedicisi vardır. Bunlara DR0...DR7 isimleri verilmiştir. DR4 ve DIR5 sonraki modellerde kullanılmak üzere saklanmıştır, yani he¬nüz kullanılmamaktadır. DR6’ya debug durum kaydedicisi (debug status register), DR7’ye de debug kontrol kaydedicisi (debug control register) denilmektedir. DR0...DR3 kaydedicilerine MOV DRx, Reg makina komutlarıyla doğrusal adresler yerleştirilir. Program bu ad¬rese geldiğinde 1 numaralı dahili interrupt (Debugger Fault) çağrılır. Debug kaydedicilerine yerleştirilen adresler doğrusal adreslerdir. Bu adresler sayfalama özelliğinden etkilenmezler.[11] Test kaydedicileri 386’larda TR0 ve TR1 olmak üzere iki taneydi. 486’larla birlikte TR2, TR3 ve TR4 kaydedicilerinin eklenmesiyle sayıları beşe yükseltilmiştir. Eklenen bu kaydediciler dahili tamponun kontrolüne ilişkindir. TR0 ve TR1 kaydedicileri çevrim tamponunun test edilmesi işleminde kullanılmaktadır.[11] Aşağıdaki şekil ise genel olarak 8086 ailesinin kaydedici yapısını ve kaydedicilerin kaç bitten oluştuğunu gösterir. EAX AH AL EBX BH BL Genel Amaçlı ECX CH CL Kaydediciler EDX DH DL ESP SP EBP BP İşaretçi ve İndis EDI SI Kaydedicileri ESI DI EIP IP 32 Bit 16 Bit EFLAGS EFLAGS CS DS SS Segment ES Kaydedicileri FS GS Şekil 1.6 : 8086’dan Pentium’a Kadar 8086 Ailesi Kaydedicileri
BÖLÜM 2 SAYFALAMA MEKANİZMASI 2.1. SAYFALAMANIN TANIMI Sayfalama (paging), belleğin daha verimli kullanılmasını sağlayan bir bellek yönetim tekniğidir. Sayfalama mekanizmasının anlaşılabilmesi için çeşitli kavramların bilinmesi gerekir.[13] Bellek kullanım oranı, yüklü olan programların kullanıldığı bellek alanlarının toplam bellek alanına oranı biçimde tanımlanır. Örneğin 32 MB toplam RAM belleği olan bir sistemde, yüklü olan programlar 24 MB yer kaplıyorsa ( 8 MB boş yer kaldığına dikkat edin ):[13] Bellek kullanım oranı = 24 / 32 = %75’tir. Bellek kullanım oranını, kullanılmayan ( yani boş olan ) bellek alanları düşürdüğüne göre, bu oranın yükseltilmesi için boş bellek alanlarının da azaltılması gerekir. İşletim sistemlerinin bellek yönetimlerindeki en önemli problemlerden biri de budur. Bellek kullanım oranının yükseltilmesi için donanım tarafından desteklenen çeşitli yönetim biçimleri düşünülmüştür. Bu yönetim biçimlerinden en çok kullanılanı ve etkin olanı sayfalama tekniği’dir.[13] 2.2. SAYFALAMA ÖZELLİĞİ OLMAYAN İŞLETİM SİSTEMLERİNİN BELLEK YÖNETİMLERİ Sayfalama özelliğinin olmadığı işletim sistemlerinde programlar belleğe sürekli bir biçimde yerleşmek zorundadır. Belleğe sürekli biçimde yerleşme zorunluluğu ise, programların işini bitirip bellekten boşaltılması durumlarında parçalanmaya yol açar. Parçalanma ( fragmentation ) programların yüklenip boşaltılması sonucunda ortaya çıkan ve kullanılmayan küçük bellek alanlarının oluşmasıdır. Bellek kullanım oranını düşüren parçalanmayı bir örnekle açıklayacak olursak : Aynı anda beş programın çalıştığı bir sistem düşünelim ( Tabii bu beş program tamamen birbirinden farklı olabileceği gibi Intel mimarisinde bir programın farklı segmentleri de olabilir ). Bellekteki yerleşimleri ve uzunlukları aşağıdaki gibi olsun : [13] ….. Prog1 30K Prog2 50K Prog3 30K Prog4 60K Prog5 25K ….. Şekil 2.1 : Beş Ayrı Programın Bellekte Kapladıkları Yerler Örnek kolay anlaşılsın diye küçük bellek miktarları kullanmayı uygun gördük. yukarıdaki yerleşim biçiminde 50 K’lık Prog 2’nin işini bitirip işletim sistemi tarafından bellekten çıkarıldığını ve yerine 30 K’lık yeni bir Prog 6’nın geldiğini düşünelim.[13] ….. Prog1 30K Prog6 30K Boş Prog3 20K Prog4 30K Prog5 60K ….. Şekil 2.2 : Program 6’nın Belleğe Yerleşmesi Bu işlemin sonucunda 20 K’lık parçalanmış boş bir bölge oluşmuştur. Şimdi de Prog 4’ün işini bitirip boşaltıldığını ve onun yerine 50 K uzunluğundaki Prog 7’nin geldiğini varsayalım.[13] ….. Prog1 30K Prog6 30K Boş Prog3 20K Prog7 30K Boş 50K Prog5 10K ….. Şekil 2.3 : Program 7’nin Belleğe Yerleşmesi Bu işlemin sonucunda da 10 K’lık yeni bir boş bölge oluşmuştur. Bu boş bölgeler ancak kendilerinden daha küçük programların sisteme girmesiyle kullanılabilir. Özetle, verdiğimiz örnekten çıkaracağımız sonuç şudur : “Programların yüklenip boşaltılmasıyla bellekte küçük parçalanmalar ( fragmentation ) oluşur. Bellek sürekliliğini bozan bu parçalanmalar zamanla fazlalaşıp bellek kullanım oranını düşürürler.[13] 2.3. SAYFALAMA TEKNİĞİNİN DAYANDIĞI TEMELLER Programların belleğe sürekli bir biçimde yerleşmeleri parçalanmaya yol açtığına göre, sürekli yerleşme zorunluluğunun kaldırılmasıyla parçalanma da engellenmiş olur. Şöyle ki: Programlar belleğe rastgele 4K’lık bloklar biçiminde yerleşsinler, programın hangi bloğunun belleğin neresinde olduğu da bir tablo da tutulsun. Bu durumda parçalanmış alanlar da programların blokları olabileceğinden, boş kalmamış olur ve böylece bellek kullanım oranı yükselir. Sayfalama tekniğinin esasları şunlardır:[7] • Tüm bellek sabit uzunlukta sayfalara ayrılır. Sayfa boyu için genellikle 4K değeri kullanılır. 4K değeri birçok bakımdan iyi bir değerdir. • Sayfalar sıfırdan başlayarak numaralanır. • Program blokları boş sayfaya rastgele yerleştirilir. (Buradaki rastgelelik, gelişigüzellik olarak anlaşılmamalıdır. Süreklilik biçiminde bir zorunluluğu olmadığı anlatılmak istenmiştir.) • Program bloklarının hangi sayfalara yerleştirildiği bir tabloda tutulur. Bellekte ayrık bir biçimde tutulan programlar kesiksiz bir biçimde ancak özel tasarlanmış ve sayfalamayı destekleyen işlemciler sayesinde çalıştırılabilirler. Yani işlemcinin de sayfalama işlemine uygun olarak tasarlanmış olması gerekir. Sayfalama yalnızca yazılım tarafından değil, aynı zamanda donanım tarafından da sağlanan bir özelliktir. Ayrıca sayfalama tekniği sanal bellek oluşturma tekniği ile birlikte de kullanılabilir. Her iki tekniğin birlikte kullanılması fiziksel bellek verimini çok yüksek boyutlara çekmektedir. Sayfalama tekniğinde herhangi bir programın içerisinde bulunan adresler gerçek fiziksel adresler değildir; doğrusal adreslerdir. Fiziksel adresler ancak doğrusal adresler üzerinde yapılan bir takım dönüşümler sonucunda elde edilmektedir.[7] 2.4. INTEL PENTİUM İŞLEMCİLERDE SAYFALAMA Doğrusal adres, selektör ve offset bilgilerinden elde edilir ve 32 bit uzunluğundadır. Doğrusal adres işlemci tarafından üç kısma ayrıştırılır.[7] 10 bit dizin adresi + 10 bit tablo indeksi + 12 bit sayfa offseti Doğrusal Adres ( 32 bit ) Dizin İndeksi (10 bit) Tablo İndeksi(10 bit) Sayfa Offseti (12 bit) Şekil 2.4 : Doğrusal Adresin Bölümleri Intel mimarisinde sayfanın fiziksel bellekteki yerini belirlemek için “dizin indeksi ve tablo indeksi” biçiminde iki aşamalı bir indeks sistemi düşünülmüştür. Tablo indeksi, sayfaların fiziksel bellekteki adreslerini ve özelliklerini tutan sayfa tablolarında bir yer gösterir. İşlemci adresin fiziksel adresini sayfa tablosundaki sayfa elemanından çeker. [13] Tablo 2.1 : Sayfa Tablosu Sayfa Tablosu Sayfa Elemanı Sayfanın Fiziksel Özellik Bellekteki Yeri 0 5 ….. 1 8 ….. 2 17 ….. 3 30 ….. 4 58 ….. 5 42 ….. ….. ….. ….. Sayfa tablosu sayfa elemanlarından oluşur. Sayfa elemanları sayfanın fiziksel bellekteki yerini ve sayfa özelliklerini tutan kayıtlar biçimindedir. Örneğin, yukarıda temsili olarak verilen sayfa tablosunda 3 numaralı eleman fiziksel bellekte 30 numaralı sayfayı göstermektedir. 30 numaralı sayfa, fiziksel belleğin 30 x 4096 (4 K) = 122880 numaralı byte değerinden başlar ve 4096 byte sürer.[7] Dizin indeksi ise “dizin tablosu” denilen bir tabloya ilişkindir ve sayfa tablosunun fiziksel bellekteki başlangıcını temsil etmek için kullanılır. Yani dizin tablosu genel olarak “sayfa tablolarının başlangıç adresini tutar.” Dizin tablosu ile sayfa tablosunun yapısı birbirine benzer. Dizin tablosunu da temsili olarak aşağıdaki biçimde gösterilebilir.[13,7] Tablo 2.2 : Dizin Tablosu Dizin Tablosu Dizin Elemanının Sayfa Tablosunun Fiziksel Özellik Numarası Bellekteki Yeri 0 26 ….. 1 59 ….. 2 72 ….. 3 46 ….. 4 53 ….. ….. ….. ….. Örneğin yukarıda temsili olarak verilen dizin tablosunun dört numaralı elemanına karşılık gelen sayfa tablosu, fiziksel belleğin 53 numaralı sayfasından ( 53 x 4096 = 217088 numaralı byte değerinden ) başlayarak 4096 byte sürmektedir. Nihayet dizin indeksi ve tablo indeksi ile belirlenen sayfa adresinin sayfa offseti ile toplanmasıyla fiziksel adres bulunur.[13] Doğrusal Adres ( 32 bit ) Dizin İndeksi Tablo İndeksi Sayfa Offseti ( 10 Bit ) ( 10 Bit ) ( 12 Bit )
Dizin Tablosu Sayfa Tablosu Sayfa
Fiziksel Adres
Şekil 2.5 : Fiziksel Adresin Bulunması Örnek : ( 00C0F210 )16 değerleriyle verilen doğrusal adresi ayrıştırarak fiziksel adresin nasıl elde edildiğini gösterelim.
Çözüm : Adresi ikilik sistemde belirterek bileşenlerine ayıralım : ( 00C0F210 )16 = 0000 0000 1100 0000 1111 0010 0001 0000 İşlemci doğrusal adresi sırasıyla 10, 10 ve 12 bitlik üç parçaya ayırır. 0000 0000 11 00 0000 1111 0010 0001 0000 Dizin İndeksi Tablo İndeksi Offset 3 15 528 Fiziksel Adres Şöyle Hesaplanır : 1.Adım : İşlemci yüksek anlamlı 10 bitlik değeri ayrıştırarak dizin tablosundan dizin indeksi ile belirtilen dizin elemanını çeker. Örneğimizde dizin indeksi 3 olduğu için üç numaralı dizin elemanı çekilecektir.[13] 2.Adım : Dizin tablosundan çekilen dizin elemanı sayfa tablosunun bellekteki başlangıç adresini verir. İşlemci bu adresten başlayan sayfa tablosundan tablo indeksi yardımıyla sayfanın fiziksel adresini elde eder. Örneğimizde sayfanın fiziksel bellekteki yeri sayfa tablosunun 15 numaralı elemanında yazmaktadır.[13] 3.Adım : Sayfanın fiziksel adresi ile 12 bit offset değeri toplanarak gerçek fiziksel adres bulunur. Örneğimizde fiziksel adres bulunan sayfanın 528. offsetidir.[13] Şimdi sayfalamada kullanılan bazı değerlerin anlamları üzerinde duralım. Öncelikle sayfa offsetinin 12 bit olduğuna dikkat edin. Bu sayfanın boyu 4 K olduğuna göre 12 bit değerinin nereden geldiği anlaşılır ( 212 = 4096 = 4 K ). Sonra, tablo indeksi 10 bit olduğuna göre her sayfa tablosunda 210 = 1024 = 1 K tane sayfa elemanı vardır. Bir sayfanın boyu 4 K olduğuna göre “bir sayfa tablosu toplam 1 K x 4 K = 4 MB bilgi tutabilir” denilebilir. Dizin tablosuna ilişkin dizin indeksi de 10 bittir. Bu durum 1 K tane sayfa tablosunun olabileceğini göstermektedir. Bu sayıların hepsini çarparsak toplam fiziksel bellek alanı bulunabilir.[13,10] 1 K tane sayfa tablosu x Her sayfa tablosunda 1 K tane sayfa x Her sayfada 4 Kbyte = 1 K x 1 K x 4 K = 4 GB Doğrusal adresten fiziksel adresin elde edilmesi işlemcinin sayfalama özelliği etkin ise yukarıdaki dönüşümler sonucunda bulunmaktadır. Eğer sayfalama özelliği etkin değilse doğrusal adres ile fiziksel adres aynı anlamdadır.[7] Aşağıdaki şekilde görüldüğü gibi işlemci doğrusal adresten fiziksel adresi bulabilmek için oldukça fazla dönüşüm yapmak zorundadır. Doğrusal adresin de tanımlayıcı tablolardan çekilerek elde edildiği göz önüne alınırsa bir tek fiziksel adresin bulunabilmesi için ne kadar çok dönüşüm yapılması gerektiği görülür. Doğrusal adresten fiziksel adresin elde edilmesi dizin tablosunun indeksi ile belirtilen elemanlardan sayfa tablosunun başlangıç adresinin çekilmesiyle başlıyor.[13,10] Şekil 2.6 : Doğrusal Adresten Fiziksel Adresin Bulunması 2.5. DİZİN TABLOSUNUN YERİ Dizin tablosunun başlangıç adresi CR3 kaydedicisinde tutulmaktadır. CR0, CR1, CR2 ve CR3 olarak isimlendirilen dört tane kontrol kaydedicisi vardır. Diğer kontrol kaydedicileri gibi CR3 kaydedicisi de 32 bit uzunluğundadır.[13] 31 12 11 4 3 0
Dizin tablosunun fiziksel bellek adresi Reserved P C T P W T Reserved Şekil 2.7 : CR3 Kaydedicisi Şekilden de görüldüğü gibi CR3 kaydedicisinin yüksek anlamlı 20 biti (12…31 bitleri) dizin tablosunun bulunduğu sayfanın fiziksel bellek adresini gösterir. Yani dizin tablosu ancak 4 K sınırlarından başlayabilir. CR3 kaydedicisinin içerisindeki adres doğrudan fiziksel bellğe ilişkindir. CR3 386, 486 ve Pentium işlemcilerinde fiziksel bellek gösteren tek kaydedicidir. (286 işlemcisinin sayfalama özelliği olmadığı için CR3 kaydedicisi de yoktur.)[13,9] Örneğin CR3 kaydedicisinin içerisinde ( 0100A000 )16 değeri olsun : 0100A 000 Dizin tablosunun başlangıç adresi Fiziksel adresin elde ( 4106 ) edilmesinde kullanılmıyor. Dizin tablosu 4106 x 4096 = 16818176 numaralı fiziksel adresten başlamaktadır. 2.6. DİZİN VE SAYFA TABLOLARININ YAPISI Dizin tablosu ( Page Directory ) sayfa tablolarının fiziksel bellekteki yerlerini ve özelliklerini tutar. 4 byte uzunluğundaki dizin elemanlarından ( page directory entry ) oluşmaktadır. Tablo 2.3 : Dizin Tablosu 000 Dizin Elemanı ( 0 ) 4 Byte 004 Dizin Elemanı ( 1 ) 4 Byte 008 Dizin Elemanı ( 2 ) 4 Byte ……….. 4K
FF4 Dizin Elemanı ( 1021 ) 4 Byte FF8 Dizin Elemanı ( 1022 ) 4 Byte FFC Dizin Elemanı ( 1023 ) 4 Byte 4096 / 4 = 1024. Doğrusal adresin yüksek anlamlı 10 biti de 1024 dizin elemanından bir tanesini göstermektedir. Buna göre aranılan dizin elemanının fiziksel adresi : ( CR3 x 4096 ) + ( dizin indeksi x 4 ) işlemleriyle bulunabilir. Şimdi de dizin elemanlarının gösterdiği sayfa tablolarına bir bakalım. Sayfa tabloları ( page table ) da dizin tablosu gibi 4’er K uzunluğundadır ve 4 byte’lık sayfa elemanlarından oluşur. Sayfa elemanları sayfaların fiziksel bellekteki yerlerini ve özelliklerini tutar. Doğrusal adresin [12…21] arası bitlerinin (10 bit) sayfa tablosuna ilişkin indeks belirtir.[8] Tablo 2.4 : Sayfa Tablosu 000 Dizin Elemanı ( 0 ) 4 Byte 004 Dizin Elemanı ( 1 ) 4 Byte 008 Dizin Elemanı ( 2 ) 4 Byte ……….. 4K
FF4 Dizin Elemanı ( 1021 ) 4 Byte FF8 Dizin Elemanı ( 1022 ) 4 Byte FFC Dizin Elemanı ( 1023 ) 4 Byte
Dizin tablosu ya da sayfa tabloları işletim sistemi tarafından tam olarak doldurulmayabilir. Örneğin ; işletim sistemi 8 MB fiziksel bellek için dizin tablosunun yalnızca iki dizin elemanını kullanabilir. Bu iki dizin elemanı da yalnızca iki dizin tablosunu gösterebilir. Böylece 8 MB RAM iki sayfa tablosu ile yönetilebilir. Zaten iki aşamalı bir indeks sistemi düşünülmesinin nedeni de budur. Dizin tablosu ile sayfa tabloları arasındaki ilişki için aşağıdaki şekle bakalım.[13,7] CR3 Dizin Tablosu Sayfa Tablosu
Sayfanın fiziksel Dizin İndeksi bellekteki yeri
Şekil 2.8 : Dizin ve Sayfa Tablosu Arasındaki İlişki Şimdi de dizin ve sayfa elemanlarını daha yakından inceleyelim. Dizin ve sayfa elemanlarının biçimi 386 / 486 ve Pentium işlemcilerinde küçük bir farklılık göstermektedir. Bu farklılık Pentium işlemcilerin 4 MB’lık büyük sayfaları destekleme özelliğinden kaynaklanıyor.[8] Her biri dört byte uzunluğundaolan dizin ve sayfa elemanlarının içeriği birbirine çok benzediği için birlikte inceleyelim. 31 12 11 10 9 8 7 6 5 4 3 2 1 0 P P U R Fiziksel Sayfa Numarası Serbest 0 1 D A C W / / P T T S W Şekil 2.9 : Dizin ve Sayfa Elemanlarının İçeriği Dizin elemanının yüksek anlamlı 20 biti sayfa tablosunun, sayfa elemanının da yüksek anlamlı 20 biti sayfanın fiziksel bellekteki yerini göstermektedir. Burada yazılı olan adres ( CR3 kaydedicisinde olduğu gibi ) bir sayfa numarasıdır. Yani gerçek fiziksel adresleri bulabilmek için bu değerlerin 4096 ile çarpılması gerekir. Her iki eleman içinde geriye kalan düşük anlamlı 12 bit, istatistik ve koruma amaçlı kullanılır.[9] Şekilde serbest olarak gösterilen 9-10-11 bitleri sistem programcısı için ayrılmıştır. Bu bitler genellikle sayfa tablosuna ya da sayfaya erişim istatistiği yapmak amacıyla kullanılır. Örneğin işletim sistemi sayfaların ne kadar süredirbellekte olduğunu tesbit etmek için bu bitleri kullanabilir. Çünkü sayfa tabloları ve fiziksel sayfalar sanal bellek işlemine sokularak gerektiğinde diskte saklanabilirler. 8. bitin bir işlevi yoktur. 7. bit Pentium işlemcilerin dizin elemanlarında 4 MB’lık sayfaları belirtmekte kullanılır.[9] D ( Dirty ) biti : D biti dizin elemanları için tanımlı değildir, yalnızca sayfa elemanları için tanımlıdır. Bu nedenle dizin elemanlarında bu bit 0 olmalıdır. Sayfa içerisinde bir bölgeye yazma yapıldığında D biti işlemci tarafından 1 yapılır. Böylece sayfaya yazma yapılıp yapılmadığı herhangi bir zaman, sistem programcısı tarafından öğrenilebilir. İşletim sistemi sanal bellek kullanımında RAM’i boşaltmak amacıyla sayfayı diske yazacağı zaman güncelleme yapıp yapmayacağına bu bite bakarak karar verir. [8,13] A ( Access ) biti : Bu bit dizin elemanı için sayfa tablosuna, sayfa elemanı içinse fiziksel sayfaya erişilip erişilmediğinianlamakta kullanılır. İşlemci sayfa tablosuna her eriştiğinde buna karşı gelen dizin elemanının A bitini, benzer biçimde bir fiziksel sayfaya eriştiğinde de buna karşı gelen sayfa elemanının A bitini 1 yapar. A bitini 0 yapmak işlemcinin görevi değildir. İşletim sistemi belli periyotlarla bu biti istatistik amaçla sıfırlayabilir. Böylece bu biti inceleyen işletim sistemi hangi sayfalara ya da sayfa tablolarına hangi sıklıkla erişildiğini anlayarak sanal bellek için strateji belirleyebilir. İşletim sistemleri fiziksel bellekte yer olmadığı durumlarda genellikle en az kullanılan sayfaları yer değiştirme işlemine sokarlar.[9,8] PCD ( Page Cache Disable ) biti : PCD biti hem dizin elemanı hem de sayfa elemanı düzeyinde tamponlamayı ( cacheability ) kontrol eder. PCD = 0 ise işlemci içerisindeki tampon bellek ( internal cache ), sayfalar ya da sayfa tabloları için kullanılabilir. Ancak bu tampon belleğin kullanılması yalnızca PCD bitine bağlı değildir. İşlemcinin cache enable ucu CR0 kaydedicisindeki PCD ve NW ( no write through ) bitlerine de bağlıdır. Ancak tampon belleğin bir sayfa için kapatılması tek başına PCD = 1 ile de yapılabilir. Bu durumda cache enable ucunun, CD ve NW bitlerinin önemi yoktur.[13,7] PWT ( Page Write Though ) biti : İçsel tampon bellek için strateji belirlemekte kullanılır. PWT = 1 ise tampona yazamama stratejisi, PWT = 0 ise hem tampondan okuma hem de tampona yazma stratejisi kullanılır.[13] U/S ( User/Supervisor ) ve R/W ( Read/Write ) bitleri : Bu iki bit hem sistem hem de uygulama programcılarının erişim haklarını belirlemekte kullanılır. Uygulama programcıları CPL = 3 olan kullanıcılar, sistem programcıları ise CPL = 0, CPL = 1 ya da CPL = 2 olan kullanıcılar olarak tanımlanmıştır. U/S = 1 ise sayfa ya da sayfa tablosu uygulama programcısı modundadır. Bu durumda CPL = 3 olan uygulama programcıları sayfaya erişebilir. Uygulama programcısı modundaki sayfaya sistem programcısı her zaman erişebilir. Sayfaya erişim yalnızca okuma ya da hem okuma hem de yazma biçiminde yapılmaktadır. R/W = 1 ise sayfa hem okunabilir hem de yazılabilir. R/W = 0 durumunda sayfaya yazma yapılamaz. Sistem programcısı uygulama programcısı modundaki ( U/S = 1 ) sayfaya serbest bir biçimde okuma ve yazma yapabilir. U/S ve R/W bitlerinin aldığı dört durumu aşağıdaki şekilde görülebilir.[8,10] Tablo 2.5 : U/S ve R/W Bitlerinin Aldığı Durumlar U / S R / W Uygulama Programcısı Sistem Programcısı 0 0 Erişmez Okuyabilir / Yazabilir 0 1 Erişmez Okuyabilir / Yazabilir 1 0 Yalnız okuyabilir Okuyabilir / Yazabilir 1 1 Okuyabilir / Yazabilir Okuyabilir / Yazabilir Sistem programcısının R/W bitlerinden etkilenmediğini görüyorsunuz. Sistem programcısını sınırlamak için Pentium işlemcilerde CR0 kaydedicisi içerisindeki WP ( write protect ) biti kullanılmaktadır. WP = 1 ise sistem programcısı R/W = 0 durumunda sayfaya yazma yapamaz. WP bitini de dikkate alınarak oluşan durum aşağıdaki tabloda gösterilmektedir.
Tablo 2.6 : WP Bitinin Etkisi U / S R / W WP Uygulama Programcısı ( CPL = 3 ) Sistem Programcısı ( CPL = 0,1,2 ) 0 0 0 Erişmez Okuyabilir / Yazabilir 0 1 0 Erişmez Okuyabilir / Yazabilir 1 0 0 Yalnız okuyabilir Okuyabilir / Yazabilir 1 1 0 Okuyabilir / Yazabilir Okuyabilir / Yazabilir 0 0 1 Erişmez Yalnız okuyabilir 0 1 1 Erişmez Okuyabilir / Yazabilir 1 0 1 Yalnız okuyabilir Yalnız okuyabilir 1 1 1 Okuyabilir / Yazabilir Okuyabilir / Yazabilir Söz konusu sayfada segment varsa okuma işlemi aynı zamanda kodun çalıştırılması anlamına gelir. Çünkü kodun çalıştırılması da bir çeşit okuma işlemidir. Ayrıca, dizin elemanındaki alanlar sayfa tablosunun tümüne erişimi belirlemektedir.[13] P ( Present ) biti : Dizin ve sayfa elemanlarının en düşük anlamlı bitleri olan P, sayfa tablosunun ya da sayfanın o anda bellekte olup olmadığını anlamak için kullanılır. P = 1 durumu, dizin elemanı için ilgili tablonun, sayfa elemanı için de ilgili sayfanın o anda bellekte olduğunu anlatmaktadır. Sanal bellek kullanımında sayfalar geçici olarak diskte tutulabilirler. Yer değiştirme işlemini yapan işletim sistemi sayfanın bellekte olmadığını anlatmak amacıyla P bitini 0 durumuna getirecektir. P = 0 durumunda sayfa tablosuna ya da sayfaya erişim, sayfa hatasıyla (page fault) sonuçlanır. Sayfa hatası dahili bir interrupt oluşturarak disk ve bellek arasında yer değiştirme işlemine aracılık edebilir.[13,8] Aşağıdaki şekilde dizin ve sayfa elemanları ayrı ayrı gösterilmiştir. 31 12 11 10 9 8 7 6 5 4 3 2 1 0 Sayfa tablosunun P P U R fiziksel bellekteki Serbest 0 1 0 A C W / / P numarası T T S W Dizin Elemanları 31 12 11 10 9 8 7 6 5 4 3 2 1 0 Sayfanın P P U R fiziksel bellekteki Serbest 0 0 D A C W / / P numarası T T S W Sayfa Elemanları Şekil 2.10 : Dizin ve Sayfa Elemanları Örnek : Bir doğrusal adrese ilişkin dizin elemanlarının değeri ( F2000807 )16 olsun. Bu dizin elemanının gösterdiği sayfa elemanının ( 01000005 )16 değerine sahip olduğunu varsayalım. CR0 kaydedicisi içerisindeki WP biti 1 olduğuna göre erişim haklarını uygulama ve sistem programcısı için inceleyelim. Çözüm : Önce dizin elemanını ikilik sistemde ifade edelim. ( F2000807 )16 = 1111 0010 0000 0000 0000 1000 0000 0111 U/S ve W/R bitleri ( 1 ve 2 numaralı bitler ) = 11 olduğuna göre sayfa uygulama programcısı modundadır ve uygulama programcısı sayfa tablosuna hem yazma hem de okuma yapabilir. Uygulama programcısı modundaki sayfa tablolarına sistem programcısı her zaman erişebilir. WP = 1 olduğuna göre R/W bitleri sistem programcısının yazma hakkı üzerinde etkili olur. R/W = 1 ve WP = 1 durumunda okuma ve yazma hakkının sağlandığı yukarıdaki tablodan kontrol edilebilir. Şimdi de dizin tablosuna ilişkin sayfa elemanını ikilik sistemde ifade ederek sayfa erişimlerine bakalım. ( 01000005 )16 = 0000 0001 0000 0000 0000 0000 0000 0101 U/S ve R/W bitleri ( 1 ve 2 numaralı bitler ) = 10 olduğuna göre sayfa uygulama programcısı modundadır. R/W = 0 olduğundan uygulama programcısı yalnızca okuma yapabilir. WP = 1 olduğunda sistem programcısı da R/W bitine bağlı olarak yalnızca okuma yapabilir.[13] Pentium işlemcileri 386 / 486 işlemcilerinden farklı olarak 4 MB uzunluğundaki büyük sayfaları destekliyor. Bir sayfanın 4 MB’lık büyük sayfa olduğu, dizin elemanlarının 7. bitinden anlaşılır. 31 12 11 10 9 8 7 6 5 4 3 2 1 0 P P U R Fiziksel Sayfa Numarası Serbest 0 SIZ D A C W / / P T T S W Şekil 2.11 : Pentium İşlemcilerde Dizin Elemanları 7. biti 386 / 486 işlemcilerinde kullanılmamaktadır ve burada sıfır bulunur. Eğer SIZ biti 1 ise Pentium, sayfanın 4 MB uzunluğunda büyük bir sayfa olduğuna karar verir. Büyük sayfalarda sayfa tablosu dönüştürmesi yapılmaz. Yüksek anlamlı 10 bit doğrudan fiziksel bellekteki büyük sayfa numarasını gösterir. Yani SIZ = 1 ise Pentium işlemcisi, dizin tablosunun yüksek anlamlı 10 bitine bakarak sayfa tablosu kullanmadan büyük sayfanın fiziksel bellekteki başlangıç adresini hesaplayacaktır.[13,7] 31 12 11 10 9 8 7 6 5 4 3 2 1 0 SIZ P P U R Büyük sayfa numarası 0000000000 Serbest 0 1 D A C W / / P T T S W Şekil 2.12 : Büyük Sayfalı Dizin Elemanları Eğer SIZ = 0 ise Pentium işlemcisi yüksek anlamlı 20 bite bakarak sayfa tablosunun başlangıç adresini hesaplar.Bu dönüşüm tablosu yardımıyla yapılır. 31 12 11 10 9 8 7 6 5 4 3 2 1 0 SIZ P P U R Fiziksel Sayfa Numarası Serbest 0 0 D A C W / / P T T S W Şekil 2.13 : Normal Sayfalı Dizin Elemanları 4 MB’lık büyük sayfaların yalnızca dizin elemanları ile belirlenir. Şimdi de tersten hareketle işlemlerin nasıl yapıldığını görelim. Yani Pentium işlemcisi bir doğrusal adresi çevirmek istediğinde ne yapacak.[13,7,10] 1. Önce doğrusal adresin yüksek anlamlı 10 biti dizin indeksi biçiminde ayrıştırılır. CR3 kaydedicisi ile belirtilen yerden indekse ilişkin dizin elemanını çekilir. 2. Eğer dizin elemanının SIZ biti 1 ise bunun büyük sayfaya ilişkin olduğunu anlar ve dizin tablosu içerisindeki yüksek anlamlı 10 biti çeker. Bu 10 bit büyük sayfa numarasını gösterdiğine göre, fiziksel bellekte büyük sayfanın başlangıç adresi burada yazan sayının 4 MB (222 ) ile çarpımıyla bulunur. (Eğer SIZ = 0 ise dönüşüm sayfa tablosu ile normal olarak yapılacaktır. ) 3. Artık doğrusal adresin 22 biti 4 MB sayfa içerisinde offset belirtmektedir. Fiziksel adres büyük sayfa numarası ile doğrusal adresin düşük anlamlı 22 bitinin toplanmasıyla bulunur. Büyük sayfaya ilişkin bir doğrusal adresin 3 kısma değil de 2 kısma ayrıldığına dikkat ediniz. 31 22 21 Dizin Elemanı Büyük Sayfa Offseti Şekil 2.14 : Büyük Sayfaya İlişkin Doğrusal Adresin Kısımları Pentium işlemcisi 32 bit doğrusal adresin büyük sayfaya ilişkin mi, yoksa normal sayfaya ilişkin mi olduğunu dizin tablosuna bakmadan anlayamaz. Dolayısıyla bir doğrusal adresin 3 parçalı mı yoksa 2 parçalı mı olduğu da ancak dizin tablosuna bakıldıktan sonra anlaşılabilir.[13,7] Örnek : Pentium işlemcisinin bulunduğu bir sistemde ( 00FC1002 )16 adresine ilişkin dizin elemanı ( 00C000BF )16 biçimindedir. Doğrusal adresin büyük sayfaya ait olup olmadığını bulalım. Büyük sayfaya aitse fiziksel adres değerini de hesaplayalım. Çözüm : Doğrusal adresin yüksek anlamlı 10 bit değeri dizin indeksidir ve bu indeksten çekilen değer soruda verilmiştir. ( 00FC1002 )16 = 0000 0000 11 11 1100 0001 0000 0000 0010 Dizin İndeksi Diğer Bileşenler Şimdi de doğrusal adrese ilişkin dizin elemanını bitlerine ayrıştıralım. ( 00C000BF )16 = 0000 0000 11 00 0000 0000 0000 1 011 1111 Büyük Sayfa Numarası SIZ SIZ = 1 olduğuna göre adres büyük sayfaya ilişkindir. Büyük sayfa numarası 0000 0000 11 = 3 olduğuna göre ; Büyük sayfanın fiziksel bellekteki başlangıç adresi = 3 x 222 = 3 x 4194304 = 12582912’dir. Fiziksel adres, büyük sayfanın başlangıç adresine büyük sayfa offsetinin eklenmesiyle bulunur. Bu offset doğrusal adresin düşük anlamlı 22 bitidir ve şu biçimde verilmiştir.[13] 11 1100 0000 0000 0010 = 3936258 Bu durumda gerçek fiziksel adres : 12582912 + 3936258 = 16519170 biçiminde hesaplanır. 2.7. SAYFALAMA ÖZELLİĞİNİN ETKİN DURUMA GETİRİLMESİ VE KAPATILMASI Intel işlemcileri reset edildiğinde real modda çalışmaya başlar. Sayfalama özelliğinin etkinliği CR0 kaydedicisindeki PG bitine bağlıdır. 31 CR0 0 P G ………………………… Şekil 2.15 : CR0 Kaydedicisindeki PG Biti Sayfalama özelliğini etkin hale getirmek için PG biti 1 yapılır. Bu işlem diğer bitlere dokunmadan OR assembly komutuyla : MOV EAX, CR0 OR CR0, 80000000H MOV CR0, EAX biçiminde yapılabilir. Sayfalama özelliği protected mod ya da virtual 86 mod içerisinde de etkin hale getirilebilir, ancak real modda etkin hale getirilemez. Bu yüzden işlemciyi protected moda geçirdikten sonra sayfalama özelliği değiştirilmelidir. Benzer biçimde protected moddan real moda dönüşte de önce sayfalama özelliği kapatılmalı, daha sonra real moda dönüş işlemi yapılmalıdır.[10,7] Sayfalama özelliğini etkin hale getirmeden önce işlemci protected mod ya da virtual 86 modda olmak zorundadır. Yukarıda da belirttiğim gibi, sayfalama özelliğini etkin hale getirmek basit bir MOV komutuyla yapılabilir; ancak bu işlemden önce dizin tablosunun ve sayfa tablolarının hazırlanmış olması ve CR3 kaydedicisinin dizin tablosunun başlangıç adresiyle yüklü olması gerekmektedir.[8,9] • Dizin tablosunda Sayfa hatasına ( page fault ) yanıt verecek bir dizin elemanının olması gerekir. • Sayfa hatasına ilişkin interrupt kodunun bellekte hazır olması ve bu kodun fiziksel adreslerini gösteren elemanların sayfa tablosunda bulunması gerekir. • IDT’nin 14. interrupt elemanı, sayfa hatası kodunu gösteren bir tanımlayıcıya sahip olmalıdır. • Sayfalama özelliğini etkin hale getiren kod ve data bellekte hazır bulunmalı ve doğrusal adresleri fiziksel adreslere eşit olmalıdır. Sayfalama özelliği aşağıdaki komut dizisiyle etkin hale getirilebilir: MOV EAX, CR0 OR CR0, 80000000H MOV CR0, EAX JMP Herhangi bir yere Son JMP komutu ön alım kuyruğunu ( prefetch queue ) tazelemektedir. Bu komut ile belirtilen doğrusal adres sayfalama işlemlerine katılır. Bunu sağlamanın en iyi yolu geçiş kodunun doğrusal adresleri ile fiziksel adreslerinin eşit alınmasıdır.
|