- 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 OpenSBI → S-modu çekirdek başlatma → U-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.