38 puan yazan GN⁺ 2025-09-16 | 1 yorum | 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
Reklam

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
Reklam

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
    Reklam

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
    Reklam

Ç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

1 yorum

 
GN⁺ 2025-09-16
Hacker News görüşleri
  • Benzer bir çalışmayı "Operating System in 1000 Lines of Code" içinde bir 'paket' halinde deneyimleyebilirsiniz; ben zamanında bunu Zig ile takip etmiştim (C kod parçacıklarını Zig'e çevirerek ilerledim) ve çok eğlenceliydi, kodum ve VOD burada: https://github.com/kristoff-it/kristos/

    • Bu alıştırmayı yapabilmek için Zig'i ne kadar bilmek gerektiğini merak ediyorum; özellikle de Zig'e hiç dokunmamış biri için, C++ geçmişi olduğu varsayımıyla buna gerçekçi biçimde nasıl yaklaşılabileceğine dair tavsiye almak isterim
  • Bu, yazının yazarının ayrıca gönderdiği içerik: https://news.ycombinator.com/item?id=45236479, yazar Tiny OS Kernel'i bizzat yeniden yapmış; özellikle RISC-V ve OpenSBI ortamında denemeler yapmak istemiş ve geleneksel C yerine Zig kullanmış, gerçi C ya da Rust ile de kolayca takip edilebileceğini düşünüyor, tüm süreç biraz kaba saba olsa da OS Kernel geliştirme ve bilgisayar mimarisini öğrenmek için ilk adım niteliğinde bir deney ve giriş çalışması, hafta sonunda eğlenerek kurcalanabilecek bir proje gibi görünüyor, tam walkthrough ve Github bağlantısı yukarıda mevcut

  • Bu tür projeler gerçekten etkileyici, Linux da sonuçta sadece bir kernel ama o çalışma açık kaynak Unix'in milyarlarca cihaza kurulmasının önünü açtı, bence gerçekten harika bir şey

    • Daha da eğlenceli olan, Linux ilk dağıtıldığında Torvalds'ın bir e-postada "sadece bir hobi, GNU kadar büyük ve profesyonel olmayacak" diye yazmış olması: https://groups.google.com/g/comp.os.minix/c/dlNtH7RRrGA/m/SwRavCzVE7gJ

    • Ben bu tür projelerin <i>inanılmaz derecede</i> etkileyici olduğunu düşünmüyorum; minimal bir çoklu görev kernel'inin nasıl yapılacağı onlarca yıl önce zaten ortaya konmuş bir yol, boot eden ve yalnızca basit işler yapan bir kernel yazmak belli ölçüde zeka ve istikrarı olan herkesin başarabileceği bir şey, bunu RISC-V üzerinde yapmak x86'a göre biraz daha karmaşık olsa da donanım başlatma bilgisi kolayca bulunabiliyor (https://wiki.osdev.org/RISC-V_Meaty_Skeleton_with_QEMU_virt_board bakılabilir), bu projede de yazar zaten bunun "işletim sistemleri dersinde yaptığı alıştırmayı yeniden yapmak" olduğunu açıkça söylemiş, yazılım mühendisliği diploması olan herkesin yapabileceği düzeyde olduğunu düşünüyorum, elbette bug'lar ya da eksik kısımlar olabilir ama çoklu süreç ya da MMU ile süreç izolasyonu yapmak artık zor bir iş değil

    • Linux kadar, Stallman'ın 1984'te C derleyicisi ve Unix araçlarını yapmaya başlaması da açık kaynak Unix'in milyarlarca makineye kurulmasının yolunu açtı

  • Zig işletim sistemi geliştirme için gerçekten çok iyi, RISC-V de öyle, ben de aynı ödeve x86 ile başlamıştım ama legacy boilerplate çok fazla olduğu için çabucak yoruldum, RISC-V tarafında bunların neredeyse hiçbiri yok, geliştirmeye başlamak çok daha kolaylaşıyor https://github.com/Fingel/aeros-v

    • x86 ile başlarsanız, bootloader'ı iyi kullandığınız sürece boilerplate'in çok fazla olmadığını düşünüyorum, multiboot loader genelde real mode'da bırakılır ve çoğu insan protected mode istediği için birkaç tablo kurup atlamak yeterli olur, eski interrupt controller'ı kapatmak istiyorsanız biraz daha uğraşmanız gerekir ama masaüstü PC'de boot edebilme avantajı vardır (console interface konusunda dikkatli olmak gerekir), benim hobi amaçlı OS'im BIOS boot ve bazı VGA özelliklerini kullanıyordu, sonra uyumluluk sorunları yüzünden epey uğraştım; serial console çok daha kolay ama günümüzde birçok bilgisayarda serial port yok

    • Esasen Object Pascal ya da Modula-2'nin güvenliğini geri getirip C sözdizimiyle yeniden paketlemek gibi; C'nin Unix lisansı sayesinde yaygınlaşmış olmasının dışında özel bir yanı yoktu

    • Ben de bunu kendim denemek istiyorum ama RISC-V kernel'ini hangi ortamda çalıştırdığınızı merak ediyorum; sadece Qemu mu kullanıyorsunuz, yoksa önereceğiniz gerçek donanımlar da var mı?

  • Bence RISC-V ISA gerçekten çok erişilebilir, dokümantasyonu harika, örnek sayısı çok fazla, emülatörleri de oldukça bol, sıkıştırılmamış machine code'u okumak da kolay, kızım için bizzat bir kitap yazıyor ve Forth ile time-sharing içeren küçük bir OS yapıyorum: https://punkx.org/projekt0/book/part1/os.html, x86 olsaydı buna hiç girişemezdim diye düşünüyorum, bu süreçte aynı anda hem Forth hem de RISC-V assembly öğreniyorum ve gerçekten keyif alıyorum, sıfırdan oyuncak bir OS yapmak istiyorsanız bunun için tam doğru zaman olduğunu söyleyebilirim (1980'ler kadar heyecan verici), ucuz bir RISC-V kartı (rp2350 vb.) alın ve ilgili kılavuz bölümlerini Claude gibi bir yapay zekaya yükleyin; takıldığınız yerlerde çok yardımcı oluyor

    • Az önce kendi ülkemde kart fiyatlarına baktım ve düşündüğümden çok daha ucuz olduklarına şaşırdım, sırf eğlencesine bir tane alıp kurcalamayı %90 ciddi düşünüyorum
  • Bu tür denemeler her zaman eğlenceli ve ilginçtir, insanları kendi şifrelemelerini ya da başka zor şeyleri de denemeye teşvik etmek isterim, “kendi kriptonuzu yazmayın” tavsiyesi pratikte doğrulanmamış bir şeyi kullanmayın demektir, deney/araştırma amaçlı kullanımda tehlikeli değildir, o yüzden gönlünüzce deneyin, daha fazla işletim sistemine ve daha fazla seçeneğe ihtiyacımız var

  • (İspanyol mahkeme kararından alıntı) HTTP engellemesini bir yere kadar anlayabilirim ama bu fazla olmuş...

    • İspanya'da Cloudflare'ın (ve muhtemelen başkalarının da) futbol yayınlarıyla ilgili bir mesele yüzünden yanlışlıkla engellendiğini duydum, bunun etrafından nasıl dolaşıldığını merak ediyorum, VPN mi kullanıyorlar? Önemli IP'ler engellenirse iş de etkilenir herhalde

    • (Kararda) bunun İspanya Profesyonel Futbol Ligi ile Telefónica Audiovisual Digital tarafından başlatıldığını görünce bu insanların suçlu olduğunu düşünüyorum

    • ...Ne? İspanyol futbol kuruluşunun ülke çapında internet erişimini kısıtlama yetkisi mi var?

  • Ucuz RISC donanımını nasıl bulabileceğimi merak ediyorum

    • AliExpress'te 10 dolara Milk-V Duo S adlı bir kart satılıyor, son zamanlarda önerilerimde sık sık çıkıyor, temel özellikleri arasında yükseltilmiş SG2000 master ve 512MB RAM, daha geniş IO, bazı modellerde WI-FI6/BT5 (512M-Basic/eMMC modelleri hariç), USB 2.0 host portu, PoE destekli 100Mbps Ethernet, çift MIPI CSI, RISC-V ve ARM boot geçiş anahtarı desteği var: https://aliexpress.com/w/wholesale-Milk%2525252dV-Duo-S.html

    • Zaten birkaç kartım var ama ilginç bulup fonladığım şey VisionFive 2 Lite oldu: https://www.kickstarter.com/projects/starfive/visionfive-2-lite-unlock-risc-v-sbc-at-199/description, birinci nesil VisionFive2 bende yok ama hakkında iyi şeyler duydum ve ekosistemi giderek büyüyor deniyor, hâlâ tamamlanmamış tarafları var ama yakında gönderilmesini umuyorum, benim kişisel olarak kullandığım şey ise PolarFire SoC Discovery Kit, içinde quad-core RISC-V ve FPGA bulunan bir kart, biraz pahalı (130 dolar) ve herkese uygun değil ama ilginç olan, kartın çipin kendisinden daha ucuz olması: https://www.microchip.com/en-us/development-tool/MPFS-DISCO-KIT, Microchip'in dokümantasyonu ve toolchain'i eski kafalı ve pek iyi değil ama alışınca bare-metal RISC-V kodu çalıştırmak gerçekten kolay, Linux/bare-metal örnekleri de yardımcı oluyor

    • Şimdilik gerçek donanım olmadan da x86 ya da Apple makinelerde bir emülatör üzerinde denemenin iyi olacağını öneririm, geliştirme hızı gerçek karta göre daha yüksek oluyor ve QEMU gibi bir şeyle hemen başlayabilirsiniz: https://www.qemu.org/docs/master/system/target-riscv.html

    • Raspberry Pi Pico 2 de RISC-V desteği sunduğu için fena değil: https://www.raspberrypi.com/products/raspberry-pi-pico-2/

    • Cevap veren herkese teşekkürler, soruya downvote atanlara ise teşekkür etmek için bir neden göremiyorum