Bölüm 12: Son Söz
CPU'ya“Sen”iKatmak yazısının parçası: bilgisayarının programları nasıl çalıştırdığına doğru inen uzun bir teknik tavşan deliği.
Tebrikler. Artık “sen”i CPU’nun içine epey sağlam bir şekilde yerleştirmiş olduk. Umarım keyif almışsındır.
Kapanırken tekrar vurgulamak istediğim şey şu: Bu makaledeki bilgiler gerçek ve yaşayan şeyler. Bir dahaki sefere bilgisayarının nasıl aynı anda birden fazla uygulama çalıştırabildiğini düşündüğünde, umarım timer chip’leri ve hardware interrupt’ları gözünün önüne gelir. Süslü bir programlama diliyle bir şey yazıp linker hatası aldığında, o linker’ın aslında ne yapmaya çalıştığını da biraz olsun hissedersin.
Bu bölümde neyi kapatıyoruz?
- Büyük resmi tekrar zihne yerleştiriyoruz.
- Birkaç ilginç yan not paylaşıyoruz.
Büyük Resim: Bilgisayarın Açılışından Program Yürütmeye
Şimdiye kadar öğrendiklerimizi tek bir zincirde özetleyelim. Bilgisayarını açtığında şu sırayla olur:
- Firmware (BIOS/UEFI) donanımı başlatır ve bootloader’ı RAM’e yükler.
- Bootloader (GRUB vb.) kernel’ı diskten bulur, RAM’e yükler ve çalıştırır.
- Kernel (kernel mode’da) kendi sayfa tablolarını kurar, interrupt handler’larını hazırlar, driver’ları yükler.
- Kernel init process‘ini (PID 1) başlatır. Artık user space’teyiz.
- Init (systemd, OpenRC vb.) servisleri ve grafik ortamını başlatır.
- Bir program çalıştırmak istendiğinde çoğu Unix-benzeri akışta parent process
fork()/clone()ailesiyle child üretir; bellek eşlemeleri COW sayesinde baştan kopyalanmaz. - Child
execve()ile yeni programa dönüşür; kernel ELF’yi ayrıştırır,PT_LOADsegmentlerini sanal belleğe haritalar ve gerekirsePT_INTERPdynamic loader’ını devreye sokar. - Fiziksel RAM adresleri MMU + sayfa tabloları + TLB ile çözülür; demand paging sayesinde bazı sayfalar ancak erişildiğinde RAM’e gelir.
- CPU, user mode’da talimatları fetch-execute cycle ile yürütür; cache, pipeline, branch prediction ve çok çekirdek gibi teknikler bu yürütmeyi hızlandırır.
- Sistem çağrısı gerektiğinde syscall giriş yolu ile kernel mode’a geçilir, iş bitince user mode’a dönülür.
- Birden fazla program aynı anda çalışıyorsa timer interrupt ve scheduler başka process/thread’e geçer (context switch). Container’lar ise bu process dünyasının üstüne namespace, cgroup, seccomp ve capabilities katmanları ekleyerek modern izolasyon sağlar.
Bu zincirin her halkasını artık biliyorsun. Kendi kendine “Peki ya…?” diye sormaya devam et; işin en güzel yanı her cevabın yeni bir soru getirmesi.
Bu makalenin asıl eseri Lexi Mattick ve Hack Club’a ait; Türkçe adaptasyon ve güncel notlar Emircan Demir tarafından düzenlendi. İçerikte hata, eksik ya da daha iyi anlatılabilecek bir yer görürsen Türkçe adaptasyon reposunda issue/PR açabilir veya adaptasyon sahibine ulaşabilirsin. Upstream eserle ilgili özgün geri bildirimler için kaynak projedeki iletişim kanallarını kullanmak daha doğru olur.

… ama dur, daha bitmedi.
Bonus: Küçük Notlar
Bunları ana akışta koyacak tutarlı bir yer bulamadım ama ilginçler, o yüzden buraya bırakıyorum.
Linux kullanıcılarının çoğunun yeterince ilginç bir hayatı vardır; page table’ların kernel içinde nasıl temsil edildiğini hayal etmeye fazla zaman ayırmazlar.
Hardware interrupt’lar için alternatif bir görselleştirme:

Bazı syscall’ların kernel space’e sıçramak yerine vDSO adlı bir teknik kullandığını da not düşeyim. Burada buna girmeye vaktim olmadı ama konu oldukça ilginç; istersen buradan, buradan ve buradan devam edebilirsin.
Unix’e özgü detaylar konusunda son bir dürüstlük notu: anlatının önemli bir kısmı Unix dünyasına ait. macOS ya da Linux kullanıyorsan bu gayet iyi, ama aynı CPU mimarisi üzerinde dursa bile Windows’un programları nasıl yürüttüğü ya da syscall’ları nasıl yönettiği hakkında sana doğrudan aynı resmi vermez. İleride bu işin Windows tarafını anlatan ayrı bir yazı yazmayı çok isterim.