Easy RISC-V: Etkileşimli RISC-V Assembly Programlamaya Giriş Eğitimi
(dramforever.github.io)- Web tarayıcısında çalışabilen bir emülatör üzerinden RISC-V assembly dilini adım adım öğrenmeyi sağlayan etkileşimli bir eğitim; Nick Morgan’ın Easy 6502 projesinden ilham alınarak hazırlanmış
- RV32I_Zicsr komut setindeki 45 temel komutu ve ayrıcalıklı mimarinin temel kavramlarını ele alarak, derleyici hedefi olarak yeterince tam bir komut seti öğretiyor
- Aritmetik/mantıksal işlemler, dallanma/atlama, bellek erişimi, fonksiyon çağrı kuralları, stack yönetimi gibi assembly programlamanın temellerini uygulamalı örneklerle sunuyor
- Machine modu ile User modu arasında ayrıcalık seviyesi geçişi, istisna işleme ve CSR (kontrol ve durum yazmaçları) kullanımını gerçek kodla açıklıyor
- Eğitimin nihai hedefi, sistem çağrıları ve istisna işlemeyi destekleyen çok küçük bir işletim sistemini doğrudan yazmak; böylece RISC-V düşük seviye geliştirme akışının tamamı deneyimlenebiliyor
Eğitimin yapısı ve başlıca öğrenme konuları
Temel komutlar ve işlemci kavramları
- İşlemci durumu: program sayacı (pc), 31 genel amaçlı yazmaç (x1~x31) ve özel sıfır yazmacı (x0) kavramları
- Aritmetik komutlar:
add,addi,subile toplama/çıkarma işlemleri ve taşma davranışının öğrenilmesi - Bit işlemleri:
and,or,xor,sll,srl,sragibi bit düzeyinde mantıksal işlemler ve kaydırma komutları uygulamaları - Karşılaştırma komutları:
slt,sltuile işaretli/işaretsiz tamsayı karşılaştırması ve koşul mantığı kurma
Kontrol akışı ve bellek
- Dallanma ve atlama:
beq,bne,blt,jal,jalrile koşullu/koşulsuz dallanma ve fonksiyon çağrı mekanizması - Bellek erişimi:
lw,sw,lb,lh,sb,shkomutlarıyla word/halfword/byte düzeyinde load/store işlemleri - Memory-mapped I/O: belirli adreslere okuma/yazma yaparak dış aygıtlarla iletişim kurma yöntemi
- Konumdan bağımsız kod:
auipckomutu ve PC-göreli adresleme ile yeniden konumlandırılabilir kod yazma teknikleri
Fonksiyonlar ve çağrı kuralları
- Yazmaç takma adları:
a0~a7(argüman),s0~s11(korunan),t0~t6(geçici),ra(dönüş adresi),sp(stack pointer) gibi roller - Stack yönetimi: fonksiyon girişinde yazmaçları kaydetme, stack alanı ayırma/serbest bırakma, dönüş adresini koruma ve geri yükleme kalıpları
- Özyinelemeli fonksiyonlar: Fibonacci dizisi uygulamasıyla özyinelemeli çağrılar ve stack frame yönetimi pratiği
Ayrıcalıklı mimari ve işletim sistemi
- Ayrıcalık seviyeleri: Machine modu (seviye 3) ile User modu (seviye 0) arasındaki farklar ve yalıtım mekanizması
- CSR komutları:
csrrw,csrrs,csrrcile kontrol yazmaçlarını okuma/yazma ve bit alanı manipülasyonu - İstisna işleme:
mcause,mepc,mtval,mstatusCSR’leri üzerinden istisna bilgisini inceleme ve handler yazma - Mod geçişi:
mretkomutuyla User moduna girme ve geri dönme,mscratchkullanarak context switching yapma
Son proje: çok küçük bir OS
- Sistem çağrısı uygulaması:
ecallkomutuyla User modundan Machine moduna trap oluşturarakputchar/exitişlevleri sağlama - Yazmaç kaydetme/geri yükleme: tüm genel amaçlı yazmaçları stack’e yedekleyen ve geri yükleyen trap handler yapısının tamamı
- İstisna işleme mantığı:
mcauseile istisna nedenini belirleme, sistem çağrısı numarasına (a7) göre dispatch etme ve hata mesajı yazdırma - Çalıştırılabilir kod: web emülatöründe doğrudan çalıştırılabilen eksiksiz OS çekirdeği giriş/çıkış kodu
Referanslar ve lisans
- Eğitim ve kodun tamamı CC0 public domain veya 0-clause BSD lisansı altında
- Kaynak metin ve kod deposu: https://github.com/dramforever/easyriscv
- RISC-V öğrenimi için eğitim, araştırma ve simülasyon ortamı kurulumuna uygun
2 yorum
Vay be
Bölüm dersinde öğrendiğimiz RISC-V assembly’ye ilgi duymaya başlamıştım.. ayrıca kitap alıp bakmaya çalışsam da sadece ARM mimarisi görünüyordu, RISC-V yoktu; neye bakmam gerektiğini düşünüyordum, tam da bu sırada çalışmak için çok iyi bir kaynak bulmuşum gibi geliyor
Teşekkürler!!!
Hacker News yorumu
Gerçekten çok iyi bir rehbermiş
İlk “My first RISC-V assembly program” emülatör ekranının rehberin en başında olmasını isterdim. Yoksa okurlar, başlıktaki ‘interactive’ ifadesine rağmen bunun sadece metinden oluşan bir giriş olduğunu sanabilir
Önümüzdeki birkaç gün daha zaman ayırmayı planlıyorum. RISC-V’e oldukça ilgi duyuyorum ve parlak bir geleceği olduğunu düşünüyorum
Eğer bunu okuyan bir yapay zeka uzmanı varsa, Replit veya Lovable gibi bir platformda Core War’ı RISC-V assembly ile yeniden yaparsa gerçekten harika olur
Assembly’yi Patterson ve Hennessy’nin Computer Organization And Design kitabıyla öğrendim; RISC-V’nin MIPS’ten ne kadar çok şey aldığını açıkça hissettiriyor
Her iki ISA’da da aynı kişiler yer aldı ve MIPS’teki delay slot gibi hatalardan kaçınıldı. MIPS deneyiminiz varsa, RISC-V assembly neredeyse aynı hissettiriyor
Bu aralar AArch64’e de bakıyorum; RISC-V kadar temiz değil ama pratik tasarımı etkileyici. Hatta RISC-V’nin fazla muhafazakar tasarlanmış olup olmadığını da düşündürüyor
TCP Socket in RISC-V Assembly’yi bizzat yazdım
RV64I ISA kullandım ve linker relaxation kavramını anlamanız gerekiyor. Referans materyalleri de ekledim
Position Independence bölümünde bir hata var gibi görünüyor
Örnek kodda
auipcyerineluikullanılması gerekmez mi, öyle olsa 0x3004 çıkardı diye merak ediyorumluimutlak adres üretir amaauipc/addibirleşimi konumdan bağımsız adres üretir.auipc0 adresindeyse sonuç aynı olur, ancak gerçekte mevcut komut adresine eklenen bir değerdirBu içeriğin interaktif kurgusu gerçekten çok başarılı
Bir C/C++ geliştiricisi olarak assembly bana hep zor gelirdi ama bu yaklaşım sayesinde çok daha net anlaşılıyor
lwyerineload4,jyerinejumpgibi daha sezgisel isimler kullanılabilirdi; delikli kart çağında yaşamıyoruz, neden her şey bu kadar kısa yazılıyor anlamıyorumBu yazı bana yeniden düşük seviye programlama deneme isteği verdi
Üniversitede mekatronik okurken C ve assembly ile mikrodenetleyicilerle çalışıyordum ama şimdi web geliştirmeye geçtim
RISC-V donanımını öğrenmek için güvenilir kaynaklar olup olmadığını merak ediyorum. Mümkünse bunu Rust ile yapmak isterim
Bir de Rust tabanlı bir OS eğitimi vardı ama şu an linkini bulamıyorum
Gerçek donanım istiyorsanız neorv32’yi öneririm — dokümantasyonu iyi: resmi doküman, GitHub deposu. VHDL ile yazılmış bir RISC-V çekirdeği
RISC-V donanımı kolayca bulunabiliyor
Bkz. RISC-V on Raspberry Pi Pico 2
Bkz. Kickstarter sayfası
Ayrıca RISC-V ile FPGA’yı birlikte kurcalamak istiyorsanız PolarFireSoC da var. AMD/Xilinx’ten çok daha ucuz ve gayet kullanılabilir. Geliştirme ortamı biraz eski usul ama hızlı, dokümantasyon dağınık ama çoğu şey bir yerlerde mevcut
geliştirme kiti bağlantısı
İşin komik yanı, geliştirme kartının çipin kendisinden daha ucuz olması
Tesadüfen bu hafta C dersinde assembly’ye giriş bölümüne geçtik; bunu RISC-V ile öğrenirsek CPU farklılıkları sorunundan kaçınabiliriz diye düşünmüştüm
Ama birisi çıkıp bunu zaten kusursuz biçimde toparlayan bir kaynak hazırlamış. Gerçekten minnettarım
“0’dan çıkarınca negatif olur” örneğinde, 0x123’ün negatifi 0xfffffedd’dir
Emülatörün 0xfffffccd gösterdiği söylenmişti ama aslında doğru değer 0xfffffedd. Kendim hesapladım ve emülatör doğru çalışıyor
İyi bir RISC-V emülatörü arıyorsanız RARS’ı öneririm