Bilgisayarın çalışma mantığı nedir?

Bilgisayarın çalışma mantığı nedir?

Nasıl oluyor da çalışıyor bu bilgisayarlar?

Klavyeden A harfine bastım. Ekrana A yazdı. Peki nasıl oluyorda bu olay gerçekleşiyor. Teknik olarak internet üzerinde konuyu anlatan dokümanlar var ve fakat birkaç satır sonrasında tekniğin batağına saplanıyor. Şimdi biz, hayali değerler ve yapılar üzerinden bilgisayarın işleyişini inceleyelim. Bu değerler tamamen kafadan atılmıştır. Fotoğrafçıların bir sözü vardır. Tekniğin batağına saplanmadan, rastgele.. Evet başlayalım..

Şimdi 8 tane ampul hayal edelim ve bu ampuller birbirine bağlı olsun.. Ampullere elektrik verildiğinde ampulün değeri 1, elektrik verilmediğinde 0 olsun..

8 tanesine birden elektrik verdiğimizde toplamda 1 1 1 1 1 1 1 1 değeri ortaya çıkacaktır. Bu değer aslında hiçbir şeyi ifade etmez.

Ampulün yanık/sönük sıralamasını şöyle yapalım. 0 1 1 0 0 0 0 1

Evet biz bu sıralamayı bu şekilde yaptığımızda A harfini tarif edelim dersek ve bunun standartlaştırırsak bu sıralamayı gören herkes A harfi olduğunu anlayacaktır.(Bu değer Binary koddur ve gerçekten de A harfini ifade eder..) Değerler ve binary karşılıkları şöyledir.
http://sticksandstones.kstrom.com/appen.html.

Şimdi biz 01100001(sönük.yanık.yanık.sönük……yanık) ampulleri bu şekilde ayarladık peki bunu nasıl kullanırız? Bunu için bir yorumlayıcı gerekir ve ampullerin durumlarına göre elektronik olarak bazı işlemler yapabilir. Mesela 00000001 dizilimi yapıldığında elektronik olarak başka odada bulunan bir lamba yakılabilir. Yada 00000010 dizilimde diğer odadaki kırmızı lamba yanacak şekilde anahtarlanabilir..

0/1 değerlerinin yanık sönük olmasına göre bazı komutlar verebildiğimize göre işlemi biraz daha genişletelim.

İki adet 8 lambalı grup oluşturalım ve bu lambaların kombinasyonlarına göre işlemler yaptıralım. Tabi ki bu işlemler tamamen elektronik alanına girmektedir.

Şöyle bir örnek dizilim yapalım.

00000001 01100001

İlk sekiz hane komut/bilgi olsun. Şu odadaki şu ampulü yak, onu söndür diğer odadaki başka bir ampul grubunu yak vs..

İlk sekizli grubun ilk 3 hanesi komut olsun. Geri kalan 5 hane de adres(hangi oda, hangi ampul grubu?) olsun. İkinci sekiz grubumuz ise aktaracağımız değer olsun. Buradaki değer A harfine karşılık gelen 0–1 dizilimidir.

Sonuç olarak şöyle bir gruplama ortaya çıktı.

001 00001 01100001

İlk üç hanemizin değeri 001 ise mutfaktaki 00001(1) nolu gruptaki 8 li ampul grubunu yak. Yak ama dizilim ikinci sekizli gruptaki gibi olsun

Şimdi mutfaktaki 1 nolu ampul grubunun dizilimi şöyle oldu. 01100001

Bir komut daha verelim.

001 00010 01100001 = Mutfaktaki 2 nolu ampul grubunun değeri 01100001 oldu.

İlk komut 010 ise yatak odasındaki ilk ampul grubunun değerini değiştir diyelim.

010 00001 01100001 = Yatak odasındaki 1 nolu ampul grubunun dizilimi 01100001 oldu.

110 Komutu da Mutfaktan gelen değerleri aynı odada bulunan koltuktaki gruba atasın(registry)

110 000001 00000001 = Mutfaktaki 1 nolu grubun değerlerini al ve aynı odada bulunan 1 nolu koltuğun ampulleri ona göre ayarla..

110 000011(3) 00000010(2) = Mutfaktaki 3 nolu grubun değerini al ve 2 nolu koltuktaki lambaları gelen dizilime göre yak.

Kısaca bizim komutlarımız şöyle oldu.

001 . . . . . Mutfaktaki ampullere değer ata

010 Yatak odasındaki ampullere değer ata..

110 Mutfaktan gelen değerleri al ve koltukta sakla(Registry)

Eveet şimdi ampulleri ayarladığımız oda(salon) işlemci oluyor. Mutfak Ram. Yatak odası ve diğer odalar da I/O(Ekran kartı, Ses Kartı, Hdd, vs..)

İşlemciler tasarlanırken de aynen bu şekilde komutlar ile tasarlanır. Bu komutları işlemci üreten firma paylaşır ve insanlar bu komut yapısına göre makineye komutlar verirler.. Temelde işlemcinin anlayacağı tek komut seti 0 ve 1 dir.

İşi anlamlı kılan bu 0 ve 1 lerin dizilimidir. Onlara yüklenen anlamlardır.

Mesela php de ekrana a harfini yazdıracağız

echo “a”;

Ne kadar bazit değil mi? Peki bu komut sonrasında temel olarak neler oluyor. Derleyici program bunu nasıl makine diline çeviriyor?

İlk olarak kodlar makine diline çevrilir ve hafızaya yüklenir. Hafızada değerler(“A,b,3,2,4”) saklananabileceği gibi komutlar da saklanır. İşlemci çalıştıracağı komutları sırasıyla hafızadan çeker.

Şimdi diyelim ki hafızanın 11 nolu adresine “A : 01100001 “ değeri yüklendi..

12 nolu adreste de 11 nolu adreste bulunan değerin ekran kartına gönderilmesi gerektiği komutu yazıldı.

Peki işlemci bunun komut mu değer mi olduğunu nereden bilecek? İşte bunun için 0–1 dizilimlerinde komutu ifade eden değerler yer alır. Örneğin hafızadaki ilk değer 0 ise bu bir değerdir. Yok eğer 1 ise bu bir komuttur ve bu komut işlemci tarafından işlenmelidir.

Şimdi hayali olarak hafızadaki değerlerimizi yeniden planlayalım.

11 nolu adres 00000000 01100001 : Bu bir değerdir ve a herfini içerir.

12 nolu adres 011 00001 00001011 : Bu bir komuttur ve 11 nolu adresten değerleri alıp ekran kartına gönderir.

011 : Ekran kartına gönder.

000001 : Komut

00001011 : hafıza adres birimi (11 nolu adres alanı)

İşlemci sırasıyla hafızadaki adreslere bakar ve komut olup olmadığunı kontrol eder. Eğer komutsa o adresteki lamba dizilimini kendi üzerine alır. Bu dizilimde elektronik olarak ne ayarlanmış ise elektronik olarak o işlem gerçekleşir. Gelen komut 011 ise çocuk odasında(ekran kartı) , 001 ise mutfağa (ram) iletir.

Peki iletim işlemleri tamam, hafızadan alıyor, hafızaya yazıyor ve komuta göre dağıtım işlemi yapıyor..

Hesap işlemini nasıl yapıyor?

echo 2+3;

dediğimizde ekrana 5 yazacak ama nasıl?

Makine kodu:

(değer) 16 nolu hafıza adresine 2 değerini atar. — Mutfak

001 10000 00000010

(001:hafızaya ata , 10000 : 16 nolu hafıza birimine, 00000010: 2 değerini)

(değer)17 nolu hafıza adresine 3 değerini atar — Mutfak

001 10001 00000011

(001:hafızaya ata , 10001 : 17 nolu hafıza birimine, 00000011 : 3 değerini)

(komut)18 nolu hafıza adresinde : hafızanın 16 nolu alanında bulunan değeri işlemcideki 1. registry alanına ata. — 1. Koltuk

110 00001 0001000

(110:Registrye ata, 00001: 1 nolu registrye, 00010000: 16 değerini)

(komut)19 nolu hafıza adresinde : hafızanın 17 nolu alanında bulunan değeri 2. registry alanına ata . — 2. Koltuk.

110 00011 0001001

(110:Registrye ata, 000011: 2 nolu registrye, 00010001: 17 değerini)

(komut) 1. registry ve 2. registry alanında yer alan lamba dizilimlerini and işlemine sok(topla) ve sonucu hafızanın 20 nolu alanına yaz.

(010 00001 00000010)

(010: topla, 00001:bir nolu reg. alanındaki değer,00000010: iki nolu reg. alanındaki değer.)

011 10100 00000101

(011: Hafızaya yaz, 10100: 20 nolu adrese,00000101: 5 değerini )

(komut) Hafızanın 20 nolu alanındaki değeri ekran kartına gönder.

Görüldüğü gibi işlemci, bizim anlamlandırdığımız 0 ve 1 leri depolatıyor, işliyor ve sonucunu ilgili birime gönderiyor. İlgili birim de gelen değerleri çözümleyerek görevini yapıyor.

Şu anda Lana del rey — Video Game açtım. aslında bu mp3 dosyasının içindeki değerler işlemci için bir anlam ifade etmiyor. Winamp(evet hala..), dosyayı açtığımızda mp3 içindeki makine kodunu hafızaya yüklüyor ve işlemciye şu hafıza adreslerindeki değerleri ses kartına gönder diyor..Sonrasında ses kartı denetleyicisi bunu analog sinyallere dönüştürüyor ve müzik..

Peki işlemci kendine verilen komutları hangi i/o kartına ileteceğini nereden biliyor? Örneğimizde yanan ampullerin dizilimlelerini komutlara göre ilgili odalara iletmiştik ve bu odaların i/o kartlarına karşılık geldiğini söylemiştik. İşte bu her odanın bir tanımlayıcısı vardır. Sistem veri yolundan bu adreslere ulaşılır. Bu adreslerde şöyledir. http://en.wikipedia.org/wiki/Input/output_base_address

Listede görüldüğü üzere her kart denteleyicisinin bir adresi vardır. İşlemcilere verilen komutlarda bu adresler ile iletim yapılır.

İşletim sistemleri.

İşte bu noktadan sonra işletim sistemlerini de konuşabiliriz. İşletim sistemleri işlemci üzerinden tam hakimiyet kurarlar ve tüm komutlarını çalıştırabilirler. İşlemci, hafıza ve diğer donanımlara makine kodu ile hükmetmek çok zor olduğundan ve aynı zamanda son kullanıcı açısından tehlikeli olduğundan dolayı araya katmanlar geliştirilmiştir. Donanımın hemen üstünde bulunan katman işletim sistemi çekirdeğidir(Kernel). Bu çekirdek kullanıcıdan girdileri alır ve donanıma iletir. Yani biz hafızanın şu adresinden değeri al şu io kartına gönder dediğimizde bu işlem işletim sisteminin onayından geçer. Bir de diske şu bilgiyi yaz dediğimizde işletim sisteminin komutlarını kullanırız. Biz bazı noktalarda işletim sistemini aracı bazı noktralarda da bir iletişim aracı olarak kulanırız. Mesela programımıza diskten şu dosyayı oku dediğimizde bunu işletim sisteminin ilgili sistem çağrısını kullanarak yaparız. İki sayıyı topla dediğimizde ise işletim sistemini araç olarak kullanırız, bizim yerimize komutları işletim sistemi cpu’ya gönderir. Gıcık olduğu komutları da engeller.

İşlemcilerde bulunan kernel mode tanımı işletim sisteminin işlemci üzerinde tam hakimiyete sahip olduğunu, user mode ise bazı işlemci komutlarının kernel haricinde çalıştırılmayacağını belirtir.

Peki Kernel haricinde donanıma erişim engellendiyse bizler bu donanımlara direk veri göndermek/almak için ne yapmalıyız?

Bu noktada aygıt sürücüler devreye girer. İşletim sisteminde kernel modda çalışan bu sürücü yazılımları donanım ile kullanıcı arasında köprü olurlar. Yani biz git lpt portuna şu değeri gönder dediğimizde bunu lpt portunun aygıt sürücüsüne iletmiş oluruz ve bu sürücü gereken işlemi yapar. Aynı zamanda bu sürücü yazılımları donanıma ait özel komutları da ihtiva eder. Yani lpt portuna sadece veri gönderir alırız ama crdom için bunun yanıdan bir eject işlemi yapmamız gerekir. İşte Cdrom device driver’a oku/yaz gibi bilgilerin yanında eject işlemini yapacak bir komut da gönderilebilir. Bu komut ve bilgileri işletim sisteminde aygıt sürücüler yapar.

Keza programla dilleri açısından bakacak olursak, derleyiciler i/o işlemleri için işletim sisteminin ilgili sistem çağrısını devreye sokarak işlemlerini hallederler.. Mesela bir socket programı yazdınız ve 998 nolu porttan gelen istekleri dinleyeceksiniz..Bunu programlama dili işletim sisteminin network card i/o sistem çağrısı ile yapar. Kısacası siz aslında burada işletim sisteminin network ile ilgili sistem çağrısını kullanırsınız..

Burada bahsi geçen konuların(cpu tasarımı, ram, i/o, işletim sistemi çağrıları vs..) herbiri ciltlerce kitap ile anlatılabilecek konulardır aslında.. Biz hayali örneklerle çalışma prensiplerini anlayama çalıştık sadece..

Dokümana katkı veya eleştiriniz olursa lütfen yorum yazın..