İntel 386 Ailesi ve Korumalı Mod Yazılım Mimarisi

Ekim 21, 2009 at 4:46 am (Sistem Programlama) (, , , , )

Koruma kavramının ne olduğunu ve neden gerektiğini  “İşletim Sistemi Nedir” başlıklı yazımda kabaca anlatmıştım.

Bu yazıda ise intel işlemcilerinin korumalı mod mimarisini ve korumalı modla gelen yenilikleri inceleyeceğiz.

32 bit intel işlemcileri aynı zamanda birer 16 bitlik işlemci görevi görür . İntel,  geçmişe uyumluluğu korumak amacıyla işlemciyi çeşitli çalışma modlarına ayırmıştır.  Her 32 bit intel işlemcisi  çalışmaya gerçek modda, bir 8086 gibi başlar.

Korumalı moda geçmek programcının görevidir.

Gerçek Mod

Gerçek modda işlemci tipik bir 8086 gibi çalışır, 20 adres bacağı kullanır , 1 mb lik bellek adresleyebilir ve 16 bitlik yazmaçları kullanır.

Bellek erişimi 16 bitlik bir segment yazmacı ve 16 bitlik bir offset değeri ile sağlanır.

Bellek erişimi için toplamda 16+16= 32 bit kullanıldığı halde ram ile cpu arasında toplam 20 adres bacağı olduğu için ancak 2^20=1 mb lik bir adres kullanılabilir.

Segment yazmacı belleğin başından itibaren paragraf sayısını tutar. Bir paragraf 16 bayttır.  Offset ise bu taban adresinden itibaren 64 kb lik bir alanı gösterebilen 16 bitlik bir değerdir.

Yani gerçek modda belleğe erişebilmek için sagment yazmacındaki değeri 16 ile çarpılır ve  offset değeri buna eklenir. Böylece fiziksel adres elde edilir.

Örneğin segment yazmacındaki değer 100 ise bu, taban adres belleğin 100. paragrafı yani, 1600. baytıdır demektir.

Bellek  adresinin 16 ile çarpılması, hex(16 lık ) sistemde 0x10 ile çarpılması demektir. Yani sonuna bir sıfır eklenmesi..

O halde bellek adresini hexadecimal sistemde yazarsak, segment yazmacındaki değerin sonuna bir sıfır ekleyip offset değeri ile toplayınca gerçek fiziksel adresi elde ederiz.

Korumalı Mod

Korumalı mod, işlemcinin en gelişmiş modudur, işlemci bu modda 32 bitlik adresler ve yazmaçları kullanır,  4 GB fiziksel belleği adresleyebilir.

Korumalı modda bellek erişimi GDT, LDT  tabloları  aracılığıyla birkaç aşamada gerçekleşir.  Ayrıca sayfalama mekanizması aktifse, sayfa dizini ve sayfa tabloları da bellek erişiminde birer basamak olmaktadır.

Ayrıca bu modlar dışında virtual86 modu bulunmaktadır. Bu mod ise gerçek mod programlarının korumalı mod altında çalışabilmesi için düşünülmüştür.

I 386 Ailesi Genel Mimari

Yazmaçlar : 32 bit işlemcilerde 8086 dan kalan yazmaçlar genişletilerek 32 bit yapılmıştır.  Ancak genel amaçlı yazmaçların yine 16 bit ve 8 bitlik parçaları kullanılabilir.

Örneğin Eax  yazmacı 32 bitliktir, ancak 16 bitlik Ax parçası bağımsız olarak kullanılabilir. Yine 8 bitlik Ah ve Al parçaları bağımsız olarak kullanılabilir.

Eax’ in diğer 16 bitlik parçası ise bağımsız olarak kullanılamaz.

Segment yazmacları 16 bit olarak bırakılmıştır, ayrıca FS ve GS olmak üzere iki yeni segment yazmacı eklenmiştir.

Bunların haricinde korumalı moda özgü birçok yeni yazmaç eklenmiştir. Bunlar,

Koruma Yazmaçları: GDTR, LDTR, IDTR,TR yazmaçlarıdır.

Kontrol Yazmaçları: CR0,CR1,CR2,CR3,CR4 yazmaçlarıdır. (CR4 pentium işlemcileri ile eklenmiştir)

Debug Yazmaçları : DR0,DR1,DR2,DR3,DR4,DR5,DR6,DR7  olmak üzere 8 tanedir.

Test Yazmaçları : TR0,TR1,TR2,TR3,TR4 olmak üzere 5 tanedir. (TR2,TR3 ve TR4 486 işlemcileri ile eklenmiştir)

Şimdi bu yazmaçların ne işe yaradığını biraz daha ayrıntılı bir şekilde işleyelim.

GDTR, LDTR, IDTR,TR Yazmaçları

Bu yazmaçlar işletim sistemi için hayati önem taşıyan tablolara işaret eder.

GDTR : Global Descriptor Table Register, adından da anlaşılacağı üzere global tanımlayıcı tablosuna(GDT)  işaret eder. Yani bu yazmaç GDT’nin adresini tutmaktadır.

Global tanımlayıcı tablosu bellekteki segmentlerin bilgilerini tutan tanımlayıcılardan (Descriptor) oluşur. Her tanımlayıcı bellekteki bir segmentin taban adresi , limiti (uzunluğu) , erişim hakları gibi kritik bilgileri tutmaktadır. Sistemde bir tane GDT vardır.

LDTR : Local Descriptor Table Register, bu yazmaç aslında Global Tanımlayıcı Tablodaki (GDT) bir tanımlayıcıyı gösterir. Bu tanımlayıcı ise yerel tanımlayıcı tablosu(LDT) nun adresini taşır. Yani LDTR, GDTR gibi doğrudan tabloya işaret etmez, o sadece GDT içindeki bir tanımlayıcıya işaret eder. LDT nin asıl adresi bu tanımlayıcıdadır.

LDT sistemde hiç olmayabilir ya da tüm süreçler birtane LDT yi paylaşabilir.

GDT ve LDT tabloları en fazla 8192 adet tanımlayıcı içerebilir. Bunun sebebi daha sonra anlatılacaktır.

IDTR : Interrupt Descriptor Table Register,  Bu yazmaç IDT tablosuna işaret eder, IDT (kesme tanımlayıcı tablosu) tablosunun temel  görevi sistemde oluşan  kesmeleri yönetecek olan fonksiyonların bellek adresini tutmaktır.

IDT tablosu içerisindeki her bir tanımlayıcıya gate denilmektedir,  Bir kesme oluştuğu zaman gerçek moddaki gibi kesme vektöründen kesme yönetici fonksiyonunun adresi alınmaz. Buna karşılık , IDTR yazmacı aracılığıyla IDT tablosuna erişilerek ilgili kesme yönetici fonksiyonunun bellek adresi elde edilir ve fonksiyon çağırılır.

Şunu da belirtelim, IDT deki gateler kesme fonksiyonunun offsetini ve bir de GDT tablosu indexi tutarlar. Adres önce GDT den taban adres alınıp offset ile toplanarak bulunur.

IDT tablosu en fazla 256 girdi içerir. Toplam kesme sayısının 256 olduğunu hatırlayın.

TR : Task Register, Bu yazmaç o an çalışan sürecin TSS denilen yapısına işaret eder.  TSS yapısı süreç ile ilgili tüm bilgileri tutar.

Aslında TR yazmacındaki 16 bitlik seçici yardımıyla GDT den TSS bilgilerini tutan bir tanımlayıcı seçilir ve TSS ye o şekilde erişilir.

Bu bölümde sadece bu yazmaçları tanıttığım için tam olarak anlamadığınız yerleri kafanıza takmayın. Bellek erişimi bölümünde bu yazmaçların kaç bit olduğu, hangi bitlerin ne bilgiler tuttuğu gibi konuları ayrıntılı biçimde işleyeceğiz.

Bu arada Register,Yazmaç,Kaydedici aynı kavramlardır. Bazen birbiri yerine kullanabilirim, kavram karmaşası oluşmasın.

Evet şimdi de kontrol yazmaçlarını inceleyelim.

CR0 : Control Register 0 ,Bu kaydedici bence işlemcinin en önemli kaydedicisidir :). Çünkü yazının başından beri bahsettiğimiz, korumalı mod, sayfalama mekanizması gibi kavramlar sadece bu yazmacın bir bitine bağlıdır.

CR0 yazmacının PG biti (31. bit) 1 yapılırsa sayfalama aktif hale geçer. Aynı şekilde PE biti ( ilk bit) 1 yapılarak gerçek moddan korumalı moda geçilir. Tabiki korumalı moda geçmeden önce bazı hazırlıkların yapılmış olması gereklidir.(GTD IDT gibi tabloların doldurulması A20 adres bacağının aktiflenmesi vs.)

Bu arada PG-Paging , PE ise Protected Enable  demektir.  CR0 ın diğer bitleri de çok önemlidir ancak bunları ayrıntısıyla açıklamayı sonraya bırakıyorum.

CR1 : Control Register 1, bu yazmaç hiç bir işe yazamaz, intel rezerve etmiştir. Ancak siz isterseniz kernel modda genel amaçlı yazmaç olarak kullanabilirsiniz  :)

CR2 : Control Register 2, bu yazmaç sayfalama hatası oluştuğunda hata oluşan sayfanın adresini tutar. Sayfalama aktif değilse bir işe yaramaz.

CR3 : Control Register 3, bu yazmaç Sayfa Dizin Tablosunun “fiziksel” adresini tutar. Ayrıca bazı bitleri cache mekanizması ile ilgilidir.

Bu yazmaç sayfa dizin tablosunun adresini 4 kb nin katı olarak tutmaktadır. Yani 20 bit ile sayfa dizin tablosunun kaçıncı çerçevede (frame) olduğunu tutar. Örneğin buradaki değer 50 ise 50*4kb=200kb yani tablo 200kb fiziksel adresindedir.

Bellek erişimi bölümünde sayfa dizin tablosunun ne olduğunu çok daha iyi anlayacaksınız.

CR4 : Control Register 4,  pentiumlarla birlikte eklenen ve modele has bazı özellikler sunan bir yazmaçtır. Bizi ilgilendirmez :)

Debug kaydedicilerinden bahsedelim. Bu kaydediciler debug işlemi için düşünülmüşlerdir. DR4 ve DR5 ise rezerve edilmiştir Bu yazmaçlar bizim de pek işimize yaramaz ( debugger yazmayacaksak).

Test yazmaçları ise işlemcinin cache işlemlerini yönetmek için kullanılır. Biz pek kullanmayacağız.

Sonraki yazılarda, segmantasyon, sayfalama yollarıyla bellek erişimi, segment-sayfa düzeyinde koruma , Ayrıcalık düzeyleri gibi konuları işleyeceğim.

Reklamlar

10 Yorum

  1. emretinaztepe said,

    Eline sağlık, gayet açıklayıcı yazmışsın Kutalmış. Üçümüzün günlüğünü takip eden birisi bu işe rahatça başlayabilir sanırım:):):)

  2. kutalmis said,

    Sağol emre, benim de sizden öğrenecek çok şeyim var, özellikle NT kernel mod, kernel hook konularında.
    Açıkçası bugüne kadar hep sıfırdan bir OS nasıl yazılır konusunda çalıştım ancak ibrahim ve senin sayende ddk ya da başlamış bulunuyorum :))

  3. İbrahim Akgül said,

    Sağol dostum valla okuyupda darılmaz inş ama Kaan Aslan hocamızın “Intel İşlemcileri Korumalı Mod Yazılım Mimarisi” adlı kitabını baştan sona 4 kez okudum bu kadar hızlı kavrayamamıştım.

    • kutalmis said,

      Çok sağol hocam güzel yorumun için. Aslında bildiğim herşeyi Kaan Aslan’a borçluyum desem herhalde abartmış olmam :) Onun bilgisine gerçekten çok şaşıyorum. Derneğe üye ya da öğrenci olmadığım halde hiç yardımını esirgemedi, dernek kaynaklarını istediğim gibi kullandım vs.
      Ama yüz yüze olmadığın zaman çok satıcı bir insan, telefonda hemen sana örnek kod atıyorum e postayla deyip günlerce e posta adresimin karşısında uyuya kalmamı da sağlamıştır :)

  4. İbrahim Akgül said,

    Bende kendisiyle çok tanışmak istemiştim, hatta dernekle aramda 1 dolmuş mesafesi yol var yani o kadar yakınım ama bi türlü fırsat bulup gidemedim. Tanışabildiğim tek şeyi bahsettiğim kitabı oldu onla idare ediyoruz :) Kaynak konusuna gelince bana aynı şekilde davranmadılar. Yeni geliştirdikleri os’nin source code’larını telefonla arayıp istediğimde gazoz ağacında yetişiyor demişlerdi :) O zamandan beri gazoz ağacı arıyorum :p

  5. kutalmis said,

    :))

  6. emretinaztepe said,

    Tam yol devam, çok tamamlayıcı gittiğimizi düşünüyorum. Ben daha yeni geldim, gelir gelmez de sizin bloglara baktım. Çok güzel konulara değinmişsiniz. Ayrıca Korumalı Mod kitabını da sayenizde geçen gün bağlantılara bakarken öğrendim. Batıya döner dönmez alıp okuyacağım. Bu arada sitelerimizdeki görüntülenme sayıları da artıyor farkettiniz mi? Her gün konu ile alakalı daha fazla arama motoru sorgusu görüyorum. Hadi hayırlısı:)

    Saygılar, Emre

  7. kutalmis said,

    Umarım birgün sistem programcıları ortak bir çatı altında, sistem programlama konusunda ciddi başarılara imza atar. Ülkemizin buna ihtiyacı var.
    Eğer başka insanlardan da destek alabilirsek birgün neden olmasın :)

  8. mrti14 said,

    Bende sistem programlama öğrenmek istiyorum.Fakat öncelikle programlamada ve hazır gelen kütüphanelerde kendimi geliştirmek istiyorum.Gtk ve opengl öğrendikten sonra assembly öğrenmek istiyorum.

  9. okanakyuz said,

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

%d blogcu bunu beğendi: