2 puan yazan GN⁺ 2025-10-26 | Henüz yorum yok. | 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

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

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

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

Ç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

Henüz yorum yok.

Henüz yorum yok.