En başından…
Bilgisayarında bir program çalıştırdığında tam olarak ne oluyor?
Soru masum görünüyor. Ama cevabı, diskte duran ölü bir dosyadan CPU’nun içindeki milyarlarca transistöre kadar uzanan koca bir zincir — ve o zinciri baştan sona, hiçbir halkasını atlamadan kurabilen şaşırtıcı derecede az insan var. Çoğumuz halkaların bir kısmını gayet iyi biliriz: derleyicinin ne yaptığını, RAM’in ne işe yaradığını, syscall’ın hangi başlık dosyasında durduğunu. Parçaları tek tek bilmek yetmiyor; asıl iş onları doğru sırayla birbirine bağlamak.
Bu kitap tam olarak o bağlantıyı kuruyor. Üç soruyu omurga olarak alıyorum:
- Programlar gerçekten doğrudan CPU üzerinde mi çalışıyor, yoksa arada başka katmanlar mı var?
- Syscall dediğimiz şey tam olarak nedir ve nasıl çalışır?
- Bir işlemci çekirdeği aynı anda yalnızca tek bir talimat akışını izleyebiliyorsa, birden fazla program nasıl aynı anda çalışıyor?

Bu konuyu tek parça hâlinde anlatan derli toplu bir kaynak, özellikle Türkçede neredeyse yok. Var olanlar ya tek bir katmana odaklanıyor — sadece CPU, sadece kernel, sadece derleyici — ya da okuru üç paragraf sonra kaynak kodun ortasında yalnız bırakıyor. Aradaki köprüyü kimse kurmuyor.
Anlatım sırasını buna göre kurdum: her bölüm bir öncekinin bıraktığı yerden başlıyor ve hiçbir kavramı, sana anlatmadan kullanmıyorum. Kitabı bitirdiğinde bilgisayarın açıldığı andan bir programın ilk talimatını yürüttüğü ana kadar olan zinciri kafanda baştan sona kurabiliyor olacaksın. Hedef bu, ölçü de bu.
Her Şeyin Tek Cümlelik Özeti
Bir uygulamaya çift tıkladığında ya da terminalde bir komut çalıştırdığında olay şuna benzer: programın dosyası diskten okunur, bellekte ona kendine ait bir çalışma alanı hazırlanır — varsayılan olarak o alan yalnızca ona görünür, başka bir program oraya kendiliğinden uzanamaz —, CPU o alandaki talimatları tek tek kendi içine çekip yürütür, kernel ise hem kaynakları paylaştıran hem de herkesin kendi sınırında kalmasını sağlayan hakem gibi davranır.
O tek cümlenin her kelimesini teker teker açacağız: CPU talimatları nasıl okur, RAM neden her programa sanki bilgisayardaki tek program oymuş gibi görünür, aynı anda birden fazla program nasıl çalışır, syscall neden gerekir ve Linux bir dosyayı gerçek bir programa nasıl dönüştürür?
Okurken Bilmen Gereken 6 Kavram
| Kavram | Tek cümlelik karşılığı |
|---|
| CPU | Talimatları okuyup uygulayan işlemci; bilgisayarın hesap yapan motoru. |
| RAM | Çalışan programların o anda kullandığı hızlı çalışma masası; elektrik kesildiği anda üzerindeki her şey silinir. |
| Disk/SSD | Programların ve dosyaların kapalıyken de durduğu kalıcı depo. |
| Kernel | İşletim sisteminin merkezindeki program; donanımı, belleği ve diğer programları yönetir. |
| Process | Çalışan bir programın işletim sistemi tarafından takip edilen örneği. |
| Syscall | Programın kernel’dan dosya okuma, bellek ayırma gibi kontrollü yardım istemesi. |
Program mı, process mi?
Kitap boyunca en çok karıştırılan ayrım bu, o yüzden baştan netleştirelim. Program, diskte duran ölü bir dosyadır; kimse çalıştırmadığı sürece hiçbir şey yapmaz. Process ise o dosyanın çalışır hâle gelmiş, kendi belleği ve kendi durumu olan canlı bir örneğidir. Aynı programdan aynı anda beş process çalıştırabilirsin: beşi de aynı dosyadan doğar, ama beşinin de belleği ayrıdır ve birbirlerinden habersizdirler.
Bu Kitap Hangi Makineyi Anlatıyor?
Bir zinciri baştan sona göstermenin bedeli, o zinciri belirli bir makinede göstermek zorunda olmandır. Her cümlede “Windows’ta şöyle, ARM’da böyle, BSD’de bambaşka” demeye kalksam anlatı ilk bölümde dağılırdı. O yüzden baştan söylüyorum: bu kitabın örnek makinesi Linux çalıştıran bir x86-64 bilgisayardır. Program dosyaları ELF biçimindedir, C kütüphanesi glibc, derleyici GCC ya da Clang’dır.
Bu seçim neyi kapsıyor, neyi kapsamıyor — ayrımı yapmak önemli:
- Fikirler taşınır. Ayrıcalık seviyesi, sanal bellek, cache hiyerarşisi, preemption, kilit, spekülatif yürütme… Bunların hepsi macOS’ta da Windows’ta da ARM’da da vardır. İsimleri ve ayrıntıları değişir, mekanizma değişmez.
- Komutlar ve biçimler taşınmaz.
/proc altındaki dosyalar, strace, ELF başlıkları, syscall numaraları — bunlar Linux’a özgüdür. macOS Mach-O kullanır, Windows PE kullanır. Windows’tan okuyorsan: bir komutun PowerShell’de doğrudan çalışan karşılığı varsa yanında söylüyorum. Söylemediğim yerlerde karşılığı ya yok ya da ayrıca bir şey kurmayı gerektiriyor; komutları olduğu gibi çalıştırmak istersen en pürüzsüz yol WSL, çünkü Windows üzerinde gerçek bir Linux kernel’ı açıyor. - Fark önemliyse söylüyorum. Bir konu platformdan platforma ciddi biçimde değişiyorsa bunu geçtiğim yerde belirtiyorum; sessizce genelleme yapmıyorum.
Sayılar için de aynı sözleşme geçerli. Kitap boyunca göreceğin gecikme süreleri, boyutlar ve yüzdeler mertebe vermek içindir: “cache RAM’den yaklaşık yüz kat hızlıdır” cümlesi taşınabilir bir bilgidir, “L3 tam olarak 27 nanosaniyedir” değildir. Gerçek değerler işlemci nesline, iş yüküne ve ölçüm yöntemine göre değişir. Kendi makinenin sayılarını merak edersen bölümlerin içinde onları ölçecek komutları da veriyorum — orası tahmin yapılacak yer değil.
Yol Haritası
Bölümlerin içinde yer yer katlanmış Derinleşme panelleri göreceksin. Onlar ana anlatının dışında duran, isteğe bağlı derinliktir: tasarım gerekçeleri, tarihsel kararlar, kernel kaynağı. Hiçbirini açmadan kitabın tamamını anlayabilirsin; konuya zaten hâkimsen de seni asıl şaşırtacak yerler çoğu zaman oralardır. Yolda anlamını unuttuğun bir terim olursa Sözlük her terimi kısa bir tanımla ve ilk anlatıldığı bölümle birlikte listeler; bütün bölümlerin alt başlıklarıyla dökümü de İçindekiler sayfasındadır.
Bir şeyi ancak başka birine anlatabildiğinde gerçekten anlarsın. Bu kitabın ölçüsü de bu: son sayfayı kapattığında, bilgisayarında bir programın nasıl çalıştığını baştan sona bir başkasına anlatabiliyor olacaksın.
1. bölüme devam et: Sayılar: Bit'ten Kayan Noktaya»