Temel C Programlama -2- Bilgisayar Mimarisi Temelleri

Bilgisayar temellerini C programlamaya geçmeden önce sizlere kısaca anlatmak istiyoruz. Biz bilgisayarları kullanıcı olarak içini ve ayrıntısını pek bilmeden karşımıza gelen arayüzü kullanarak az veya çok kullanabiliyoruz. Fakat bir geliştiricinin bilgisayara bakış açısı bir kullanıcının bakış açısından çok daha geniş ve kapsamlı olmalıdır. Bir kullanıcı bakış açısıyla bilgisayara baktığımız sürece asla bir geliştirici olamayız. Bilgisayar sadece onu kullanabildiğimiz değil aynı zamanda ona hükmettiğimiz bir eşya olmalıdır. Bu aynı araba kullanıcısı ile otomobil tamircisi arasındaki fark gibidir. Kimse otomobil üretecek kadar bilgiye sahip olmasını beklemeyiz fakat bir uzmanın tüm ayrıntısını bilip ona söz geçirmesini bekleriz. Bizim geliştirici olarak belki bilgisayar üretecek kadar bilgiye sahip olmamız gerekmese de bilgisayarı kullanmak değil kontrol etmek noktasında bir bilgiye sahip olmamız gerekir. Hazır olan şeyi kullanana kullanıcı adı verilir, geliştirici değil. Bizim de bu noktadan itibaren bilgisayarı en iyi kullanıcıdan daha iyi kullanabilir olmamız gereklidir. Bazen mühendislik öğrencilerinin bile sürücüleri yükleyemediğini, basit hatalara çözüm bulamadığını görüyoruz. Bunlar bilgisayar kullanmayı iyi bilmemekten kaynaklanmaktadır. Biz de dersleri iyi bilgisayar kullananların bilgilerine biraz bilgi katmak amacıyla teknik bilgilere yer vererek devam edeceğiz.

Kullandığımız kişisel bilgisayarlar daha önce mikrodenetleyici mimarisini anlatırken size anlattığımız bilgisayar sistemlerinden çok farklı bir yapıda değildir. Yine merkezi bir işlem birimi olarak CPU, veri hafızası olarak RAM ve program hafızası olarak da Harddisk veya ROM türevi bellekler (SSD) kullanır. Yalnız gömülü sistemler ile kişisel bilgisayarların büyük bir farkı vardır. Bu fark da işletim sistemi (OS) kullanmalarıdır.

Gömülü sistemler de kendi içlerinde işletim sistemi kullanabilir. Üstelik RTOS ve gömülü Linux’ün kullanma oranı da son zamanlarda kapasitenin artmasıyla iyice artmıştır. Fakat gömülü sistemlere genel olarak baktığımızda tek bir program yazılır ve tek bir uygulamayı çalıştırır nitelikte sistemler olduğunu görürüz. Bunlar kişisel bilgisayarlar tarafından yazılan ve derlenen programları çalıştırırlar. Kendi kendilerine programı kendi içlerindeki derleyici ile yazmayız. Bilgisayarda ise bilgisayar uygulamaları “native” yani yerli uygulama özelliği taşımaktadır. Program yazacağımız program için yine kişisel bilgisayardaki programı kullanırız. Derleyici programların da uygulama programlarının da birlikte çalışmasını ve düzenlenmesini sağlayan “Ana program” ise işletim sistemidir.

Bilgisayar sisteminin merkezi işlem birimine bağlı ROM ve RAM bellekten meydana geldiğini size söylemiştik. Kişisel bilgisayarlarda bu ROM bellek birincil hafıza olarak yine kullanılmaktadır. Harddisk, SSD dediğimiz aygıtlar ikincil hafıza olup giriş ve çıkış birimleri vasıtasıyla sonradan okunmaktadır. Bu giriş ve çıkış birimlerini denetleyecek bir programa başlangıçta ihtiyaç duyulmaktadır. Bilgisayarın asıl işletim sistemi, ilk kullandığı program “BIOS” yani “Basic Input/Output Operating System” adıyla adlandırılır. Temel giriş ve çıkış işletim sistemi anlamına gelen “BIOS” bir rom bellekte anakartın bir köşesinde yer almaktadır. Bu BIOS önceleri bir defa programlanabilir PROM belleklerden olsa da artık Flash BIOS’lar ile yazılım vasıtasıyla BIOS yazılımını güncelleyebiliriz.

Resimde gördüğümüz BIOS çipinin bir ROM türü bellek olup bilgisayarın ilk açılış programını içinde barındırdığını söylemiştik. Bu açılık programı aynı mikrodenetleyicilerdeki program hafızasına benzer. Bu program hafızası bilgisayarların ayarlarını yapar, giriş ve çıkış birimlerini çalıştırır ve harddiskten işletim sistemi dosyalarını okuyup RAM belleğe aktarır ve bizim ana programımız olan işletim sistemi (Windows, DOS, Linux gibi) çalışır. İşletim sistemleri gömülü sistemlerde yazdığımız programlardan farklı olarak olay ve görev tabanlı çalışmaktadır. Yani pek çok küçük program bu ana program üzerinde çalışır ve görev olarak adlandırılır. Ayrıca bilgisayara giren girişler ve bilgisayardan alınan çıkışlar kesmelere benzer bir yapıda olan “olaylar” tarafından değerlendirilir. Yani bilgisayar bizim fare’nin sol tuşuna tıklamamızı sürekli kontrol etmez fakat fare sol tuşuna tıkladığımızda sinyal bilgisayara gider ve işletim sistemi ilgili görevi yerine getirir. İşletim sistemleri doğrudan donanım ile muhatap olan yazılımlar olduğu için en alt seviye programlama dillerinde yazılan programlar üzerine bina edilmiştir. İşletim sistemlerini farklı platformlarda çalıştırmak istediğimizde mimari engeli ile karşılaşmamız bu yüzdendir. Bilgisayar üzerinde işletim sistemi yazmak için x86 mimarisine ve x86 Assembly diline hakim olmak gerekir. Aynı zamanda en karmaşık sistemlerde Assembly dili kullanıldığı için x86 Assembly programcıları dünya üzerinde oldukça sayılıdır.

Bir donanım üzerinde C dilinde programlama yapabilmek için de önce Assembler adı verilen çevirici program tarafından yazılan C derleyicisine ihtiyaç duyulur. C derleyicisi en basit haliyle C dilinde sembolleştirilen komutları donanıma uygun Assembly diline çevirir ve sonrasında çevirici program bunu makine diline çevirmektedir. Biz C dilinde program yazarken işletim sistemi için yazılan grafik, giriş ve çıkış ve fonksiyonları içeren kütüphaneleri de kullanmamız gerekecektir. Donanıma müdahale için tek başına C dilini değil işletim sisteminin dosyalarını da C diliyle beraber kullanmamız gerekir. Yine gömülü sistemler üzerinde çalışırken yazmaçlar ve belli bellek adreslerine müdahale ile donanıma erişim sağlarız. Bu C dilinde operatörleri kullanarak adreslere değer atamakla da olmaktadır. Gömülü sistemler ile kişisel bilgisayarlar arasında işletim sistemi farkı olmasından dolayı gömülü sistemlerde donanıma müdahaleyi genelde adresler vasıtasıyla yaparken kişisel bilgisayarlarda işletim sistemi dosyaları vasıtasıyla yaparız. Örneğin bir grafik programı için DirectX veya OpenGL kütüphane dosyalarını kullanırız. Pencere ve temel arayüz yazılımı için windows.h kütüphane dosyasını kullanırız. C dilinde her sistem için standartlaşan stdio kütüphanesi ile temel giriş ve çıkış işlemlerini gerçekleştiririz.

Bilgisayar anakartına baktığımızda yukarıda bahsettiğimiz BIOS (ROM), RAM ve CPU’dan başka bileşenlerin olduğunu da görürüz. Bu bileşenler gömülü sistemlerde bilgisayar sistemleri olmasına rağmen karşımıza çıkmamaları sistemlerin karmaşıklığından dolayı olmaktadır. Şimdi orta seviye ve biraz da eski diyebileceğimiz bir anakartın resmine bakalım ve bileşenlerini inceleyelim.

Bir bilgisayar anakartı bilgisayar sisteminin en kalabalık ve temel parçası olsa da anakartın üzerindeki parçaların görevlerini anlamak çok zor değildir. Öncelikle merkezi işlem birimini tutan bir soket, ram belleklerin takıldığı slotlar ve güç girişi bilgisayar sisteminin asgari elemanlarıdır. Burada I/O portu olarak gördüğümüz PCI, IDE ve SATA portları ikincil cihazların bağlanmasını sağlayan konnektörlerdir. Bu I/O portları I/O denetimcisi olan kuzey ve güney köprüleri ile irtibat halindedir. Kuzey ve güney köprüleri gelişmiş giriş ve çıkış çipleri olup bilgisayarın işlemcisi ile bu elemanlar arasındaki bağlantıyı sağlar. Bundan başka görüntü elde etmek için görüntü işlemcisi ve belleğini bulunduran ekran kartı bu anakartın üzerine takılmaktadır. Çoğu ağ ve ses denetleyicileri tek entegre olarak kart üzerinde lehimli halde gelir. Bu entegreler de giriş ve çıkış denetimcileri ile irtibat halinde olup donanım sürücüleri vasıtasıyla kullanılabilir hale gelir. BIOS sistemini anakart üreticilerinin yazıp karta entegre etmesinin sebebi ise bütün bu giriş ve çıkış denetiminin sorumluluğunun kendi üzerlerinde olmasıdır. İşlemci üreticisi sadece işlemciyi üretse de bu işlemcinin düzgün çalışabilmesi için anakart üreticilerinin düzgün bir anakart tasarlaması gereklidir.

Bu yazıdan bilgisayar mimarisini ve işletim sisteminin prensibini çok özet bir şekilde öğrendik. Bilgisayar mimarisini ve donanımını anlatacağımız ayrı bir yazı dizisi düşünüyoruz fakat şimdilik programlamaya başlayacakların fikir edinmesi ve ufkunun açılması için bundan kısaca bahsettik. Bir sonraki yazıda işin yazılım tarafıyla daha çok ilgileneceğiz ve ardından programlama mantığını anlatmaya başlayacağız.

Last updated