23 puan yazan GN⁺ 2025-10-28 | 2 yorum | WhatsApp'ta paylaş
  • 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, sub ile toplama/çıkarma işlemleri ve taşma davranışının öğrenilmesi
  • Bit işlemleri: and, or, xor, sll, srl, sra gibi bit düzeyinde mantıksal işlemler ve kaydırma komutları uygulamaları
  • Karşılaştırma komutları: slt, sltu ile 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, jalr ile koşullu/koşulsuz dallanma ve fonksiyon çağrı mekanizması
  • Bellek erişimi: lw, sw, lb, lh, sb, sh komutları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: auipc komutu 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, csrrc ile kontrol yazmaçlarını okuma/yazma ve bit alanı manipülasyonu
  • İstisna işleme: mcause, mepc, mtval, mstatus CSR’leri üzerinden istisna bilgisini inceleme ve handler yazma
  • Mod geçişi: mret komutuyla User moduna girme ve geri dönme, mscratch kullanarak context switching yapma

Son proje: çok küçük bir OS

  • Sistem çağrısı uygulaması: ecall komutuyla User modundan Machine moduna trap oluşturarak putchar/exit iş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ığı: mcause ile 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

 
lsdcnu 2025-11-06

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!!!

 
GN⁺ 2025-10-28
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

    • Neden doğrudan beyninle yapmıyorsun ki?
  • 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

    • Muhtemelen RISC-V, RISC-1’e daha yakındır. Patterson’ın bunu bizzat anlattığı bir yazı var: How close is RISC-V to RISC-I, RISC on a Chip
    • Ben de RISC-V ile MIPS arasındaki benzerliği hissettim. Nintendo 64 homebrew geliştirme yaparken sık sık “Bu, daha önce Ares+Godbolt’ta kurcaladığım şeyle neredeyse aynı, sadece delay slot yok” diye düşündüm
    • İnsanlar, AArch64 tasarımının nereden geldiği ve hangi felsefeyle oluşturulduğu konusunda belirsiz birçok nokta olduğunu pek fark etmiyor
    • Komut eklemek kolay, kaldırmak ise zordur. RISC-V başlangıçta asgari komut kümesiyle başladı ve sonrasında kademeli olarak genişliyor. Yeni bir komut önermek için onun maliyetini ve somut faydasını kanıtlamak gerekir
    • Computer Architecture: A Quantitative Approach kitabında da RISC-V ile MIPS’in benzerliği hakkında bir bölüm olduğunu hatırlıyorum. Kitap şu an bir kutuda olduğu için tam sayfayı bilmiyorum
  • 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 auipc yerine lui kullanılması gerekmez mi, öyle olsa 0x3004 çıkardı diye merak ediyorum

    • Hayır. lui mutlak adres üretir ama auipc/addi birleşimi konumdan bağımsız adres üretir. auipc 0 adresindeyse sonuç aynı olur, ancak gerçekte mevcut komut adresine eklenen bir değerdir
  • Bu 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

    • RISC-V assembly genel olarak kolay ama komut kısaltmaları çok fazla olduğu için rahatsız edici. lw yerine load4, j yerine jump gibi daha sezgisel isimler kullanılabilirdi; delikli kart çağında yaşamıyoruz, neden her şey bu kadar kısa yazılıyor anlamıyorum
  • Bu 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

    • Donanımı doğrudan Rust ile ele almıyor ama OS temellerini anlatan iyi bir eğitim var: Operating System in 1000 Lines
      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

    • VisionFive 2 Lite da yakında çıkacak, onu da merakla bekliyorum. Sürücü ve performans açısından biraz zayıf ama OS geliştirme için yeterli gibi görünüyor
      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ı
    • Muhtemelen ESP-32 ile başlamak daha kolay olabilir. Çünkü çok daha yaygın bulunuyor
  • 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