38 puan yazan GN⁺ 2025-09-16 | Henüz yorum yok. | WhatsApp'ta paylaş
  • RISC-V mimarisinde bir zaman paylaşımlı işletim sistemi prototip çekirdeği geliştirme deneyimi paylaşılıyor
  • Zaman paylaşımlı (time-sharing) çekirdeğin kavramı ve çalışma biçimi, uygulama odaklı olarak anlatılıyor; C yerine Zig ile gerçeklenerek yeniden üretilebilirlik artırılıyor
  • Çekirdek ile kullanıcı kodunu tek bir ikili dosyada birleştiren unikernel yaklaşımı benimseniyor; konsol çıktısı ve zamanlayıcı denetimi için OpenSBI kullanan bir katmanlama tercih ediliyor
  • İş parçacıkları kullanıcı modunda (U-mode) çalışıyor; çekirdek ise gözetmen modunda (S-mode) zamanlayıcı kesmeleri üzerinden bağlam değişimi yapıyor ve sistem çağrıları ile sınırı aşıyor
  • Temel fikir, kesme prolog/epilogunun yığına koyduğu stack frame'i değiştirmek; böylece başka bir iş parçacığının yazmaç kümesi ve CSR değerleri geri yüklenerek akış başka yere geçiriliyor
  • QEMU sanal makinesi ve güncel OpenSBI temelinde herkesin yeniden üretebileceği bir öğrenme ortamı sunuluyor; ayrıca iş parçacığı·süreç·konteyner gibi sanallaştırma spektrumunu kavramsal olarak bağlayarak eğitim ve pratik amaçları için uygun bir temel kaynak değeri taşıyor

Genel bakış

  • RISC-V mimarisinde zaman paylaşımlı bir işletim sistemi çekirdeğinin doğrudan nasıl geliştirildiği anlatılıyor
  • Hedef okur kitlesi; sistem yazılımı ve bilgisayar mimarisine yeni başlayanlar, öğrenciler ve düşük seviye çalışma prensiplerini anlamak isteyen mühendisler
  • Bu deneyde mevcut C dili yerine Zig dili kullanılarak pratiğin yeniden üretilebilirliği artırılmış ve kurulum basitleştirilmiş
  • Nihai kod popovicu/zig-time-sharing-kernel deposunda açık olarak yayımlanmış; içerikle arasında küçük eşzaman farkları olabilir
    • Koddaki alıntılar yerine depo sürümünün tek güvenilir kaynak olarak görülmesi öneriliyor
    • Uygulama sırasında ortamı deponun linker script'leri ve derleme seçeneklerine göre eşleştirme kolaylığı sağlanıyor

Önerilen okuma

  • Yazı; yazmaçlar, bellek adresleme, kesmeler gibi bilgisayar mimarisi temellerini ön koşul kabul ediyor
    • Ön hazırlık için Bare metal on RISC-V, SBI önyükleme süreci, zamanlayıcı kesmesi örneği öneriliyor
    • Mikro Linux dağıtımı yazısı, çekirdek ve kullanıcı alanı ayrımı felsefesini anlamak için isteğe bağlı olarak yararlı

Unikernel

  • Uygulama ile OS çekirdeğini tek bir çalıştırılabilir dosyada bağlayan unikernel yapısı benimseniyor
    • Çalışma zamanı yükleyici/bağlayıcı karmaşıklığından kaçınılıyor ve kullanıcı kodunun çekirdekle birlikte belleğe yüklenmesiyle sadeleşme sağlanıyor
    • Eğitim ve yeniden üretim amaçları açısından dağıtım sadeliği ve ortam tutarlılığı avantajı sunuyor

SBI katmanı

  • RISC-V, M/S/U modlarından oluşan bir yetki modeli kullanıyor; bu deneyde OpenSBI M-modunda konumlanırken çekirdek S-modunda çalışıyor
    • Konsol çıktısı ve zamanlayıcı aygıtı denetimi SBI'ye devredilerek taşınabilirlik sağlanıyor
    • SBI mevcut değilse geri dönüş olarak UART MMIO kullanılıyor; ancak pratikte güncel OpenSBI kullanılması öneriliyor

Çekirdeğin hedefi

  • Basitleştirme adına yalnızca statik iş parçacıkları destekleniyor ve iş parçacıkları sona ermeyen fonksiyonlar olarak kuruluyor
    • İş parçacıkları U-modunda çalışıyor ve S-modu çekirdeğe sistem çağrısı gönderiyor
    • Her zamanlayıcı tikinde başka bir iş parçacığına geçilebilmesi için tek çekirdekli bir zaman paylaşımlı zamanlama gerçekleniyor

Sanallaştırma ve iş parçacığı tam olarak nedir

  • Zaman paylaşımlı iş parçacığı modeli, programlama modelini değiştirmeden tek çekirdekte birden çok işi eşzamanlıymış gibi yürüten bir sanallaştırma biçimi
    • İşbirlikçi zamanlamadan farklı olarak, açık bir yield olmadan zamanlayıcı kesmesi ile geçiş oluşuyor
    • Her iş parçacığının, başkalarının dokunamayacağı yazmaç kümesi ve yığını bulunuyor; diğer bellek ise paylaşılabiliyor

Yığın ve bellek sanallaştırması

  • İş parçacıkları ayrı bir yığına sahip olmalı; çağrı kuralı gereği yerel değişkenler, ra koruması gibi yürütme bağlamının korunması için bu zorunlu
    • Sanallaştırma spektrumu iş parçacığı < süreç < konteyner < VM şeklinde ilerliyor; yalıtım seviyesi ve görünüm (view) değişiyor
    • Linux'ta konteynerler, chroot, cgroups gibi çekirdek mekanizmalarının birleşimi ile kuruluyor

Bir iş parçacığını sanallaştırmak

  • Bu deneyin asgari sanallaştırma hedefleri: programlama modelinin değişmemesi, yazmaçlar ile bazı CSR'lerin korunması, ayrı yığın tahsisi
    • Yazmaç görünümü korunmazsa anlamlı hesaplama yapılamayacağının altı çiziliyor
    • Başlangıçta a0 gibi değerler yığına tohumlanarak iş parçacığı başlarken argüman aktarımı sadeleştiriliyor

Kesme bağlamı

  • Kesmeler; prolog/epilog ile yazmaçların yığına kaydedilip geri alındığı fonksiyon çağrısına benzer bir model olarak düşünülebilir
    • Eşzamansız zamanlayıcı kesmesinin yazmaçları bozmaması için koruma sözleşmesine uyulması zorunlu
    • Örnek assembly, x0–x31 korumasına ek olarak sstatus, sepc, scause, stval gibi CSR'leri de kaydedip geri yüklüyor

Gerçekleme (üst düzey)

Kesme yığını sözleşmesinden yararlanma

  • Kesme yordamının gövdesi prolog ile epilog arasında yer alıyor; burada sp başka bir bellek alanıyla değiştirilirse başka bir bağlamın yazmaç kümesi geri yüklenmiş oluyor
    • Bu da doğrudan bağlam değişimi anlamına geliyor ve deneydeki zaman paylaşımlı gerçekleme için temel fikir bu
    • Zamanlayıcı kesmesi periyodik olarak araya girerek ana akış ile kesme akışını dönüşümlü çalıştırıyor

Çekirdek/kullanıcı alanı ayrımı

  • S-modu çekirdeği / U-modu kullanıcı sınırı korunuyor; kesme ve sistem çağrısı işlemleri S-modu trap handler içinde yürütülüyor
    • Önyükleme sırası M-modundaki OpenSBIS-modu çekirdek başlatmaU-modu iş parçacığını başlatma şeklinde ilerliyor
    • Periyodik zamanlayıcı kesmeleri zamanlama ve bağlam değişimini mümkün kılıyor

Gerçekleme (kod)

Assembly başlangıcı

  • startup.S içinde BSS başlatma ve ilk stack pointer ayarı sonrası Zig'in main fonksiyonuna sıçrayan asgari bir dizi kuruluyor
    • Çekirdek giriş noktası, C ABI ile bağlantı için export kuralını kullanıyor

Ana çekirdek dosyası ve G/Ç sürücüleri

  • kernel.zig içindeki main, önce OpenSBI konsol işlevini sınayıp başarısız olursa UART MMIOya geri dönüyor
    • sbi.debug_print, ECALL protokolüne uygun şekilde a0/a1/a6/a7 yazmaçlarını ayarlayıp çağrı yapıyor
    • Zamanlayıcı ayarından sonra S-modu kesme işleyicisi kaydediliyor ve tikler etkinleştiriliyor

S-modu işleyicisi ve bağlam değişimi

  • İşleyici, Zig'in naked kuralıyla yazılarak CSR koruması da dahil tam prolog/epilog elle kuruluyor
    • Gövde içinde handle_kernel(sp) çağrılıyor ve dönen sp ile değiştirilerek geçiş yapılıp yapılmayacağı belirleniyor
    • scause üzerinden bunun U-modu ECALL mi yoksa zamanlayıcı kesmesi mi olduğu ayırt edilerek dallanılıyor

Kullanıcı alanı iş parçacıkları

  • Kullanıcı kodu çekirdekle birlikte tek bir ikili dosya içinde yer alıyor; örnek iş parçacıkları metin yazdırma → gecikme döngüsü tekrarını yapıyor
    • syscall.debug_print, a7'ye 64 sistem çağrısı numarasını, a0/a1'e tampon ve uzunluğu koyup ECALL yürütüyor
    • İş parçacığı başlatılırken yığına dönüş adresi ve ilk yazmaç değerleri tohumlanıyor; böylece ilk dönüşte argümanlar hemen kullanılabiliyor

Çekirdeği çalıştırma

  • Derleme zig build, çalıştırma ise QEMU üzerinde virt machine + nographic + OpenSBI fw_dynamic belirtilerek yapılıyor
    • Önyüklemede OpenSBI banner sonrasında iş parçacığı kimliklerine göre periyodik çıktıların dönüşümlü geldiği görülüyor
    • -Ddebug-logs=true ile derlenirse kesme kaynağı, mevcut yığın, kuyruğa alma/çıkarma günlükleri ayrıntılı gösteriliyor

Sonuç

  • Bu deney, RISC-V + OpenSBI + Zig birleşimiyle eğitim amaçlı bir çekirdeği modernleştirerek yeniden üretilebilirlik ve okunabilirlik kazandırıyor
    • Asgari hata işleme ve aşırı tahsisli yığın gibi sadeleştirmeler bulunsa da odak, bağlam değişiminin özü ve yetki ayrımı öğreniminde
    • Gerçek makineye taşınabilirlik; linker, sürücü sabitleri ve SBI erişilebilirliği uygunlandığında mümkün olabilir

Ek not: sanallaştırma spektrumunun özeti

  • Threads: daha çok yazmaç ve yığın sanallaştırmasına dayanır, belleğin paylaşılma olasılığı yüksektir
  • Process: adres alanı sanallaştırması ile bellek yalıtımı sağlar, içinde birden çok iş parçacığı barındırabilir
  • Container: dosya sistemi ve ağ namespace'leri gibi ortam görünümünü birleştirerek kurulan bir yalıtım birimidir
  • VM: donanımın genelinde tam sanallaştırmayı hedefler

Temel gerçekleme noktalarının özeti

  • Kesme yığını değişimi ile bağlam değişimi sağlanır
  • S-modu trap handler içinde CSR dahil tüm durum korunur ve geri yüklenir
  • Önce SBI, geri dönüşte UART MMIO ile çiftli çıktı yolu kullanılır
  • Statik iş parçacıkları, tek çekirdek, zaman dilimi odaklı sade zamanlama
  • ECALL tabanlı sistem çağrıları ile U/S sınırı netleştirilir

Henüz yorum yok.

Henüz yorum yok.