Linux önyükleme süreci: Güç düğmesinden çekirdeğe
(0xkato.xyz)- 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
0xFFFFFFF0adresine (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
0x55AAişareti bulunur - BIOS bu sektörü
0x7C00adresine kopyalar ve oraya atlayıp çalıştırır
- Önyüklenebilir diskin ilk 512 baytlık sektörünün sonunda
- 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ı,
initrdkonumu gibi bilgileri setup header yapısına yazar ve ardından çekirdek kurulum koduna atlar
- En yaygın örnek GRUB'dur; yapılandırma dosyasını okur, çekirdeği ve başlangıç RAM diski
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
earlyprintkseç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
- GDT (Global Descriptor Table): segmentlerin başlangıç adresini, boyutunu ve izinlerini tanımlar
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_kernelfonksiyonu ç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_kernelfonksiyonuna 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ı
- Önyükleme sırasında iki temel değer rastgele seçilir
- 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
- Bootloader,
- Uygun alan bulunamazsa varsayılan adrese dönülür;
nokaslrseç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.