1 puan yazan GN⁺ 2024-07-16 | 1 yorum | WhatsApp'ta paylaş
  • İnsanlar karmaşık olanla sadece karışık olanı ayırt eder. Karmaşıklık ilgi çekici görülürken, karışıklık zararlı kabul edilir. x86_64 CPU kurulum süreci ise çoğunlukla karışıktır.
  • BIOS tarafından yüklenen bir önyükleme sektöründen CPU’nun 16 bit gerçek moddan 64 bit long mode’a nasıl geçirileceğini anlatır. Bu kurulum temeldir ve yapılması gereken daha çok iş vardır.
  • Intel 64 ve IA-32 Architecture Software Developer’s Manual, bir assembler (nasm kullanılır) ve QEMU gereklidir. x86 assembly ve nasm sözdizimini bilmek gerekir.

Başlangıç noktası: BIOS

  • Sıfırlamadan sonra x86 CPU "gerçek mod"dadır. Bu mod 16 bit varsayılan işlenen boyutuna sahiptir. Segmentasyon kullanarak 1MB belleği adresleyebilir.
  • BIOS’tan sonra çalıştırılan ilk kod önyükleme sektöründedir. BIOS, sistemde 0xaa55 ile biten ilk sektörü bulur ve ilgili önyükleme sektörünü 0x7c00 bellek adresine yükler.
  • BIOS 512 bayt sağlar; bununla önyükleyicinin geri kalan kısmını bootstrap etmek gerekir.

Önyükleme sektörünü hazırlama

  • Basit bir önyükleme sektörü kurup BIOS rutinlerini kullanarak ekrana bir mesaj yazdırır ve ardından durdurur. Böylece araçların çalıştığı doğrulanabilir.
  • Assembly kodu ve Makefile kullanılarak önyükleme sektörü hazırlanır.

1. aşama – 2. aşamayı diskten yükleme

  • Önyükleyici iki aşamaya ayrılabilir. 1. aşama, BIOS’un yüklediği her şey olan önyükleme sektörü kodudur. 1. aşamanın tek amacı 2. aşamayı belleğe yüklemektir.
    1. aşamada 16 bit gerçek moddan 32 bit korumalı moda geçilir. Korumalı modda BIOS rutinleri kullanılamaz. Diskten sektör yüklemek çok daha karmaşık hale gelir.
  • BIOS kullanarak diske nasıl erişileceği açıklanır.

32 bit korumalı mod

  • CPU, gerçek moddan (16 bit) korumalı moda (32 bit) geçirilir. Korumalı modda bellek koruması segmentasyon kullanılarak uygulanır.
  • Korumalı moda geçmeden önce Global Descriptor Table (GDT) tanımlanmalıdır. GDT, bellekte ardışık bir yapı olarak tanımlanır.
  • GDT’nin nasıl tanımlanacağı ve korumalı moda nasıl geçileceği açıklanır.

64 bit long mode

  • Long mode’a geçmeden önce CPU korumalı modda olmalı ve paging etkinleştirilmelidir. Korumalı mod zaten ayarlanmıştır, ancak paging gerekir.
  • Paging, sanal adres alanını, izinleri ve benzerlerini yönetmek için segmentasyonun yerini alır. Long mode’a geçiş için sayfa tablolarının nasıl oluşturulacağı açıklanır.
  • Long mode geçişi için GDT’nin nasıl tanımlanacağı ve korumalı moddan long mode’a nasıl geçileceği açıklanır.

GN⁺ özeti

  • Bu yazı, x86_64 CPU’yu 16 bit gerçek moddan 64 bit long mode’a geçirme sürecini ayrıntılı biçimde açıklar. Bu sayede önyükleyici ve işletim sistemi çekirdeği geliştirme konusundaki anlayışı artırabilir.
  • BIOS, önyükleme sektörü, korumalı mod, long mode gibi çeşitli kavramları ele alır ve her aşama için gerekli assembly kodunu ve yapılandırma yöntemlerini sunar.
  • Bu yazı, işletim sistemi geliştirmeyle ilgilenen kişiler için yararlıdır; özellikle x86 mimarisi hakkında derin bir anlayış sağlar. Benzer işlevlere sahip projeler arasında "Writing a Simple Operating System – from Scratch" bulunur.

1 yorum

 
GN⁺ 2024-07-16
Hacker News görüşleri
  • Doğrudan korumalı moda geçmeden de long mode'a geçmenin bir yolu var
    • Önyükleme sektörüne küçük bir 64 bit çekirdek yükleyen bir önyükleyici yapılmış
    • Sürece diskteki çekirdeği yükleme ve VESA modunu ayarlama da dahil
  • 80286'da 16 bitlik bir register olan MSW vardı ve 80386 bunu 32 bitlik CR0'a genişletti
    • 64 bit long mode, EFER MSR'ını ekledi ve CR0'ı 64 bite genişletti
    • Şu anda yalnızca CR0'ın 11 biti ile EFER'in 8 biti kullanılıyor
    • Intel/AMD'nin neden mevcut register'lardaki boş bitleri kullanmadığı merak ediliyor
  • Bu yazıdaki gereksiz yere en karmaşık kısım Makefile ve linker script
    • NASM düz binary çıktı üretebilir ama görünüşe göre bunu kullanmak fazla "hacky" bulunuyor
  • CPU'yu doğru moda geçirmek için gereken tüm adımlar gereksiz yere karmaşık
    • Bunların hepsi geriye dönük uyumluluk için gerekli görünüyor
    • Intel en baştan doğru modda başlatacak bir flag ya da komut sağlayabilirdi
    • Ya da tüm geriye dönük uyumluluğu kaldırabilirdi
    • ARM64'te de benzer bir sorun olup olmadığını araştırdığını hatırlayan biri var
    • En baştan 64 bit olarak tasarlanmış bir CPU olup olmadığı merak ediliyor
    • Itanium'un hedefi/tasarımı muhtemelen buydu
  • Neden yeni bir önyükleyici yaklaşımı geliştirildiğini anlamayan UEFI destekçileri olabilir
    • Yazarın dediği gibi, "buraya kadar geldiyseniz bu harika bir iş"
  • UEFI'nin ne kadar eski olduğu merak ediliyor
    • BIOS'un long mode ile birlikte kaldırılmamış olması üzücü bulunuyor
  • Bu önyükleme prosedürünün EFI/UEFI ile uyumlu olup olmadığı merak ediliyor
    • UEFI firmware'inin gerçek donanımda real mode/protected mode/long mode'u emüle edip etmediği soruluyor
  • ARM'de bu sürecin daha basit olup olmadığı merak ediliyor