2 puan yazan GN⁺ 2025-10-26 | 1 yorum | WhatsApp'ta paylaş
  • Bilgisayarda güç düğmesine basıldığı andan Linux çekirdeği çalışana kadar olan süreci adım adım anlatan teknik bir açıklama
  • CPU'nun real mode'da başlayıp protected mode ve long mode'a geçişini ayrıntılı biçimde ele alıyor
  • BIOS/UEFI firmware, bootloader (GRUB), çekirdeğin sıkıştırmasının açılması ve adres yeniden yerleştirme gibi her aşamanın rolünü ve çalışma mantığını detaylandırıyor
  • Bellek eşleme, interrupt, page table, kASLR gibi çekirdek başlatma için gerekli temel kavramları kısa örneklerle açıklıyor
  • Linux önyüklemesinin iç mekanizmasını anlayarak sistem mimarisi, güvenlik ve performans optimizasyonu konusunda içgörü sunuyor

Part 1 — Güç düğmesinden çekirdeğin ilk çalışmasına kadar

  • Güç düğmesine basıldığında CPU real mode'a sıfırlanır ve ilk komutları çalıştırır

    • Real mode, 8086 döneminden beri var olan basit bir adresleme düzenidir; fiziksel adresi hesaplamak için segment ve offset birleştirilir
    • Örnek: physical_address = (segment << 4) + offset
    • CPU, sıfırlamadan sonra 0xFFFFFFF0 adresine (reset vector) atlayarak denetimi firmware'e devreder
  • Register'lar CPU içindeki ultra hızlı depolama yuvalarıdır; CS (code segment), IP (instruction pointer) vb. bulunur

    • CS mevcut kodun konumunu, IP ise bir sonraki çalıştırılacak komutu gösterir

BIOS ve UEFI

  • BIOS, eski tip bir firmware'dir; POST (power-on self test) sonrasında önyükleme sırasını kontrol eder ve önyüklenebilir diski arar
    • Önyüklenebilir diskin ilk 512 baytlık sektörünün sonunda 0x55AA işareti bulunur
    • BIOS bu sektörü 0x7C00 adresine kopyalar ve oraya atlayıp çalıştırır
  • UEFI, modern bir alternatif olup dosya sistemini doğrudan anlayabilir ve daha büyük önyükleme programlarını yükleyebilir
    • BIOS'un aksine “ilk sektör” kısıtı yoktur ve işletim sistemine daha zengin sistem bilgisi aktarır
    Reklam

Bootloader

  • Bootloader, çekirdeği belleğe yükleyen ve çalışmaya hazırlayan programdır
    • En yaygın örnek GRUB'dur; yapılandırma dosyasını okur, çekirdeği ve başlangıç RAM diski initrd'yi belleğe yükler
    • Çekirdek dosyası, real mode için küçük bir kurulum programı ile sıkıştırılmış çekirdek gövdesinden oluşur
    • GRUB; çekirdeğin konumu, komut satırı, initrd konumu gibi bilgileri setup header yapısına yazar ve ardından çekirdek kurulum koduna atlar

Kurulum programı (setup code)

  • Çekirdek çalışmadan önce öngörülebilir bir çalışma alanı oluşturma görevini üstlenir
    • Segment register'larını (CS, DS, SS) hizalar ve bellek kopyalamanın tutarlı çalışması için direction flag'i temizler
    • Fonksiyon çağrılarında geçici verileri saklamak için stack oluşturur
    • BSS alanını (başlangıç değeri 0 olması gereken global değişken alanı) sıfırla başlatır
  • earlyprintk seçeneği varsa seri portu ayarlayarak erken hata ayıklama mesajları yazdırabilir
  • Firmware'den RAM haritasını (e820) isteyerek kullanılabilir ve ayrılmış bellek bölgelerini öğrenir
  • Tüm hazırlıklar tamamlandığında ilk C fonksiyonu olan main çağrılır ve ardından mod geçiş aşamasına girilir

Interrupt

  • Interrupt, CPU'nun mevcut işi kısa süreliğine durdurup acil bir işlemi yerine getirmesini sağlayan mekanizmadır
    • Klavye girişi ve zamanlayıcı gibi donanım olayları tipik örneklerdir
    • Maskelenebilir interrupt geçici olarak engellenebilirken NMI (Non-Maskable Interrupt) her zaman işlenir
    • Mod geçişi sırasında beklenmeyen interrupt'ları önlemek için bunlar geçici olarak engellenir

Part 2 — Real mode'dan 32 bit'e, ardından 64 bit'e

  • Modern Linux, x86_64 mimarisinin long mode'unda çalışır
    • Bu nedenle real mode → protected mode → long mode sırasıyla aşamalı geçiş gerekir
    Reklam

Protected mode

  • 1980'lerdeki sınırlamaları aşmak için getirilen 32 bit moddur ve iki temel yapıya sahiptir
    • GDT (Global Descriptor Table): segmentlerin başlangıç adresini, boyutunu ve izinlerini tanımlar
      • Linux, tüm 32 bit adres alanını tek bir sürekli bölge gibi sadeleştiren flat model kullanır
    • IDT (Interrupt Descriptor Table): bir interrupt oluştuğunda çağrılacak işleyicinin adresini tutar
      • Önyükleme sırasında yalnızca asgari IDT yüklenir, çekirdek başlatıldıktan sonra tam IDT kurulur

Mod geçiş süreci

  • Kurulum kodu önce interrupt'ları devre dışı bırakır, PIC yongasını durdurur, A20 hattını etkinleştirir ve matematik yardımcı işlemcisini başlatır
    • A20 hattı, 1MB adres sarmalanması sorununu çözmek için kalmış tarihsel bir mekanizmadır
  • Asgari GDT ve IDT yüklendikten sonra CR0 register'ındaki PE biti ayarlanır ve far jump yapılır
    • Böylece protected mode'a girilir; segmentler ve stack pointer yeni adresleme düzenine göre yeniden ayarlanır
Reklam

Control register'lar

  • CR0: protected mode'u etkinleştirir
  • CR3: page table'ın en üst düzey adresini tutar
  • CR4: PAE gibi genişletilmiş özellikleri etkinleştirir

Long mode'a giriş hazırlığı

  • 64 bit moda geçmek için iki koşul gerekir
    • Paging etkin olmalı: sanal adres ile fiziksel adres arasında eşleme yapılır
    • EFER register'ındaki LME (Long Mode Enable) biti ayarlanmalıdır
  • Page table'lar 4KB birimindeki sayfaları eşler; ilk önyükleme aşamasında genellikle 2MB biriminde identity map ile basit bir yapı kurulur

Paging'i etkinleştirme adımları

  • PAE özelliği CR4 üzerinden açılır ve düşük adres bölgesini 2MB birimlerle kapsayan asgari page table oluşturulur
  • En üst tablo adresi CR3'e yazıldıktan sonra paging etkinleştirilir
  • EFER içindeki LME biti ayarlanır ve 64 bit koda atlanarak long mode'a geçilir
  • Adresler ve register'lar 64 bit genişliğe ulaştığında çekirdeği çalıştırmak için hazırlık tamamlanmış olur

Part 3 — Çekirdeğin sıkıştırmasını açma, adres düzeltme ve kendini taşıma

  • Bu noktada CPU 64 bit modundadır ve bellekte sıkıştırılmış çekirdek imajı bulunur
    • Küçük bir 64 bit stub, çekirdeği açma ve adresleri ayarlama işini üstlenir

İlk temizlik ve güvenlik düzenekleri

  • Stub, gerçek çalışma konumunu hesaplar; çekirdek çakışıyorsa self-relocation ile kendisini güvenli bir konuma taşır
  • Kendi BSS alanını sıfırlar, basit bir IDT yükler (page fault ve NMI işleyicileri dahil)
    • Page fault oluşursa eksik eşleme hemen eklenerek kurtarma yapılır
  • Çekirdek, boot parametreleri, komut satırı tamponu gibi gerekli alanlar için identity mapping oluşturur
Reklam

Çekirdeğin sıkıştırmasını açma

  • extract_kernel fonksiyonu çalıştırılarak çekirdeğin sıkıştırması açılır
    • gzip, xz, zstd, lzo gibi çeşitli sıkıştırma algoritmaları desteklenir
    • Açma işleminden sonra ELF header okunur ve kod/veri bölümleri doğru adreslere kopyalanır
  • Çekirdeğin derlendiği adres ile gerçek yükleme adresi farklıysa relocation yapılır
    • Adres içeren komutlar ve pointer'lar gerçek bellek konumuna uyacak şekilde düzeltilir
  • Her şey hazır olduğunda start_kernel fonksiyonuna atlanır ve asıl çekirdek başlatma süreci başlar

Çekirdeğin kendi yerini rastgeleleştirmesi (kASLR)

  • kASLR (Kernel Address Space Layout Randomization), çekirdeğin fiziksel ve sanal adreslerini rastgeleleştirerek saldırıları zorlaştırır
    • Önyükleme sırasında iki temel değer rastgele seçilir
      • Fiziksel taban: çekirdeğin RAM'de gerçekten yerleşeceği adres
      • Sanal taban: çekirdeğin kullanacağı sanal adres aralığının başlangıcı
  • Seçim süreci
    • Bootloader, initrd, komut satırı tamponu gibi korunması gereken alanların listesi hazırlanır
    • Firmware'in bellek haritası taranarak yeterince büyük boş alan aranır
    • Donanımsal rastgele sayı komutları gibi kaynaklardan elde edilen entropy ile rastgele yuva seçilir
  • Uygun alan bulunamazsa varsayılan adrese dönülür; nokaslr seçeneği verilirse rastgeleleştirme devre dışı kalır

Terim özeti

  • Hexadecimal (onaltılık): 0x önekiyle gösterilir, donanımın bit yapısı ve hizalama için uygundur
  • Register: CPU içindeki geçici depolama alanı (CS, DS, SS, IP, SP vb.)
  • Segment/Offset: real mode adres hesaplama yöntemi (segment * 16 + offset)
  • BIOS/UEFI: sistemi başlatan ve boot programını yükleyen firmware
  • Bootloader (GRUB): çekirdeği yükler ve sistem bilgisini iletir
  • Stack/BSS: fonksiyonlar için geçici depolama alanı ve sıfırla başlatılan global değişken bölgesi
  • Interrupt/NMI: donanım ve yazılım olaylarını işleme mekanizması
  • GDT/IDT: segment ve interrupt tanım tabloları
  • A20 Line: 1MB adres sarmalanmasını önleyen anahtar
  • Protected Mode/Long Mode: 32 bit ve 64 bit çalışma modları
  • Paging/Page Tables: sanal adresler ile fiziksel adresler arasında eşleme

1 yorum

 
GN⁺ 2025-10-26
Hacker News görüşleri
  • Gerçekten çok iyi bir yazıydı. Ben de birkaç ay önce Linux önyükleme süreci hakkında bir yazı yazmıştım; daha çok disk G/Ç tarafına (diskte ne olduğu ve bunun nasıl yüklendiği) odaklanmıştım Yazımı Booting x86-64 adresinde görebilirsiniz
  • Sayfa kaynağında şöyle bir kod vardı
    
      uwu
    
    
    “Bu da ne?” hissi uyandırdı
    • Hâlâ üzerinde çalışılan bir özellik
  • UEFI, ürün yazılımının uyguladığı bir arayüzdür. Yani ürün yazılımının kendisi değil, ürün yazılımıyla iletişim kurmak için kullanılan standart bir arayüz anlamına gelir “UEFI makineyi başlatır” ifadesi biraz hatalı bir terminoloji kullanımı. Aslında makineyi başlatan ürün yazılımıdır ve biz ürün yazılımıyla UEFI üzerinden iletişim kurarız Bu yazı modern ürün yazılımlarının ilginç kısımlarının çoğunu atlıyor. Örneğin ExitBootServices() çağrıldığında zaten long mode içine girilmiş olur. Real/protected mode geçiş sürecinden geçmeye gerek yoktur
    • Bunun gibi konuları daha fazla okuyabileceğim kaynaklar nerede, merak ediyorum
  • Güç düğmesinin gerçekten CPU’yu doğrudan açıp açmadığını merak etmiştim. Muhtemelen Intel Management Engine (veya AMD’nin benzer özelliği) her zaman açık kalıyor ve güç düğmesi sinyalini alıp CPU’yu başlatıyor olabilir
    • Bence bu rolü Embedded Controller (EC) üstleniyor. Bu, önyükleyici CPU’yu ayağa kaldırmadan önce çalışan kısım Chromebook’larda bu bölüm coreboot önyükleyicisiyle birlikte açık kaynak olarak yayımlanıyor İlgili belgeleri Chromium EC Zephyr README adresinde bulabilirsiniz
  • Bu yazıdan biraz daha ayrıntılı bir sürümünü arıyorum. Mikroişlemci veri sayfalarını baştan sona okumak istemiyorum ama UEFI/BIOS öncesi aşamaları da daha derin ele alan kaynaklar olsa iyi olurdu
  • Yazı ilgi çekiciydi ama bir yandan da neden onaltılık (HEX) açıklamasına kadar girildiğini sorguladım. Böyle bir düzeydeki yazıyı okuyan birinin bunu bilmemesi bana pek olası gelmedi Bir diğer merak ettiğim nokta da fiziksel güç düğmesine basıldığı anda bunun nasıl reset vector’a bağlandığı. Bu, donanım ve elektronik devrelerin sihirli dünyasına giriyor
    • HN sadece BT uzmanlarının takıldığı bir yer değil. Linux önyükleme sürecini merak eden ama onaltılık kavramını bilmeyen ya da unutmuş kişiler de olabilir
  • Konu ilginç ama fazla başlangıç seviyesi geldi
    • “Güç kararlı hâle gelince CPU real mode’da sıfırlanır” gibi açıklamaları görünce, “Benim büyükannem bunu anlayacak kadar yetkin biri mi?” diye düşündüm
    • Üniversitede hedef kitle analizi (audience analysis) öğrenmiştim; hangi bilginin zaten bilindiğini varsayacağınızı ve hangi terim ya da kısaltmaları açmanız gerektiğini belirlemek önemli. Teknik yazımda bu biraz sanat işi
  • Mobilde okuması zordu. Yazı rengi fazla soluktu
    • Masaüstü tarayıcıda da stil pek iyi değildi. Firefox veya Firefox Mobile’ın okuyucu modu ile çok daha rahat okunuyor
    • Biraz kendini küçümseyen bir tasarım gibi görünüyordu
  • GRUB’dan bahsedilmişti ama ayrıntılı ele alınmamıştı Bununla ilgili olarak Pixelbeat’in disk yapısı belgesi yardımcı olabilir
  • Bu yazı bana eski bir Facebook teknik mülakatını hatırlattı. 2010 civarında Production Engineer pozisyonu için bir telefon mülakatıydı ve “Bir Linux sunucusunun önyükleme sürecini açıklayın” sorusu sorulmuştu Daha derine inerek anlatmam gerektiğine dair ipucu dışında hiçbir yardım verilmemişti. Sonunda Dublin’e taşınmadım ve işte, surveillance capitalism falan derken üzümler hâlâ koruk kaldı sayılır