12 puan yazan GN⁺ 2025-06-29 | 4 yorum | WhatsApp'ta paylaş
  • Üniversite yıllarındaki bir projede, bizzat tasarlanan RISC ISA tabanlı CPU ve özel olarak geliştirilen C derleyicisi kullanılarak Xv6 işletim sistemini port etme deneyimi paylaşılıyor
  • Proje, CPU tasarımı, C derleyicisi (Ucc) geliştirme, Xv6 portlama dahil tüm bileşenlerin doğrudan ekip tarafından üretildiği bir yapıda ilerledi
  • Ekip, OS çalıştırmak için kesmeler, sanal bellek, önbellek gibi temel donanım ve yazılım işlevlerini tasarlama zorluğunu üstlendi
  • Xv6 portlama sürecinde taşınabilirlik sorunları, hata ayıklamanın zorluğu, önbellek hataları gibi çeşitli engellerle karşılaşıldı ancak bunlar ekip içinde çözüldü
  • SL, Minesweeper, 2048 gibi etkileşimli uygulamalar ile bir ray-tracing programını çalıştırmayı da başararak eğitimsel ve teknik açıdan büyük bir kazanım elde edildi

Projeye genel bakış

  • Bu proje, Tokyo University bilgisayar bilimi bölümünün öne çıkan deneysel çalışmalarından biri olup, öğrencilerin merkezi işlem birimi (CPU) ve donanım tasarımı, derleyici geliştirme ve uygulama çalıştırma konularında deneyim kazanmasına odaklanıyor
  • Projenin amacı, özel tasarlanan CPU'nun ISA'sını FPGA üzerinde doğrudan gerçekleştirmek, buna yönelik C araç zincirini (Ucc) geliştirmek ve bunu XO6 benzeri bir işletim sistemi portlama çalışmasına kadar genişletmekti
  • Deney sürecinin büyük bölümü öz yönelimli öğrenme şeklinde yürütüldü

CPU deneyleri ve görevler

  • 4-5 kişilik ekipler, kendi CPU mimarilerini tasarlayıp FPGA üzerinde gerçeklemeye ve ilgili mimari için derleyici geliştirmeye katıldı
  • OCaml alt kümesi için bir derleyici yapıp ardından ray-tracing programı çalıştırmak zorunlu değerlendirme kalemiydi
  • Ek süre kaldığında özgün meydan okumalar belirlenebiliyor; bazı öğrenciler CPU hızlandırma, çok çekirdek geliştirme, müzik/oyun çalıştırma gibi genişletilmiş deneyler yaptı
  • Group 6 ekibi özellikle işletim sistemi portlamayı hedefledi ve bu noktadan sonra yeni bir ortak ekip olan Group X kuruldu

Xv6 OS ve portlama meydan okuması

  • Portlama hedefi olarak MIT tarafından eğitim amaçlı geliştirilen Xv6 (Unix v6 tabanlı, x86 için) seçildi
  • Xv6 basit bir Unix tabanlı işletim sistemi olsa da, gerçek donanımda çalıştırmak için C89 derleyicisi, özel kesmeler, sanal adres desteği, düşük taşınabilirlik gibi çeşitli sorunlar barındırıyordu
  • Xv6, C dilinde char için 1 bayt ve int için 4 bayt gibi x86 özelliklerini varsayacak şekilde yazıldığından portlama sırasında çok sayıda problem ortaya çıktı

Derleyici ve araç zinciri geliştirme (Ucc)

  • Mevcut deneylerde OCaml derleyicisi geliştirmek standarttı, ancak Xv6'yı çalıştırmak için C89 derleyicisi gerektiğinden bunun doğrudan geliştirilmesine karar verildi
  • Ekip üyelerinden birinin C derleyicisi prototipi temel alınarak yeni bir araç zinciri şirket içinde değil, ekip içinde sıfırdan kuruldu (Ucc)
  • Yalnızca derleyici değil, Primitive Linker ve hata ayıklama araçları da doğrudan tasarlandı

CPU ve simülatör tasarımı

  • Donanım tanımlama dili (HDL; ör. Verilog / VHDL) ile CPU devresi tasarlanıp Vivado/Quartus gibi mantık sentezi süreçleri üzerinden gerçek FPGA'ya aktarıldı
  • Tekrarlanan mantık sentezi süreçleri çok uzun sürdüğü için pratikte ciddi bekleme süreleri oluştu
  • CPU'nun temel işlevlerinden sonra, OS çalıştırmak için gereken kesme, MMU, TLB gibi donanım destekleri de ayrıca tasarlandı
  • Sonuçta GAIA adlı CPU ortaya çıktı
  • Simülatöre gerçek kesmeler, sanal adres dönüşümü ve hata ayıklama araçları eklendi

Portlama sürecindeki sorunlar ve çözümler

  • Xv6'nın yetersiz taşınabilirliği nedeniyle CPU ve derleyici özelliklerine bağlı olarak anormal davranışlar görüldü
    • Örnek: char ve int türlerinin 32 bit olarak tanımlanması yüzünden işaretçi aritmetiği ve yığın yapısının bozulması
    • Ucc derleyicisinde char türü 8 bit olacak şekilde iyileştirme yapıldı
  • Kesme işleme en zor alanlardan biriydi; bu nedenle özel simülatöre disassembler, durum dökümü gibi hata ayıklama araçları eklendi
  • Önbellek aliasing sorunu, GAIA'nın önbellek indekslemesinde sanal adres kullanmasından kaynaklandı; bu durum Page Coloring tekniğiyle çözüldü

Nihai sonuç: OS ve uygulamaların çalıştırılması

  • 1 Mart'ta sonunda Xv6'yı hem simülatörde hem de gerçek CPU'da (donanımda) tamamen çalıştırmayı başardılar
  • Özel mini curses, SL komutu, Minesweeper, 2048 gibi etkileşimli uygulamalar başarıyla çalıştırıldı
    • Özellikle 2048 için non-canonical giriş desteği eklendi
    • Xv6 üzerinde yapılan değişikliklerle POSIX tarzı ioctl, termios benzeri işlevler de eklendi
    • Küçük bir assembler, mini vi gibi araçlar da geliştirildi ve fiilen bir gerçek zamanlı programlama ortamı oluşturuldu
  • Ray-tracing programı da işletim sistemi üzerinde çalıştırılarak başlangıçtaki deney hedefinin ötesine geçildi

Projenin önemi ve sonraki örnekler

  • Bu deneyin ardından farklı kuşaklardan öğrenciler kendi CPU'larını ve işletim sistemlerini yaparak çeşitli deneyleri sürdürdü
    • Örneğin RISC-V ISA benimsenmesi, özel OS geliştirme, Linux çalıştırma gibi alanlara genişleme görüldü
  • Uygulamalı çalışma sayesinde donanım/yazılım tüm yığınını doğrudan deneyimleyerek algoritmalar, donanım-yazılım entegrasyonu ve düşük seviyeli yapılar konusunda somut anlayış kazanıldı
  • “Tekerleği yeniden icat etmek” verimsiz diye eleştirilse de, gerçekten yaparak öğrenmenin etkisi ve keyfi çok büyük oldu

Gerçek deneyim ve kaynak kodu

Sonuç

  • “Bir şeyi bizzat yapmak kadar öğretici başka bir şey yoktur” dersiyle birlikte, donanım-yazılım entegrasyonu deneyiminin önemi vurgulanıyor
  • Sonraki öğrenciler de yeni hedeflere meydan okumayı sürdürürken, gelecekte özel ISA üzerinde Linux ya da VM çalıştırılabilmesi umuluyor
  • Hikâye, projeye katılan üyelerin isimleri anılarak sona eriyor

4 yorum

 
regentag 2025-07-01

Üniversitede böyle bir deneyim yaşanabilmesi gerçekten imrendirici. Çok eğlenceli gibi görünüyor..

 
qlghwp123 2025-06-30

Gerçekten çok eğlenceli olmuştur.

 
iolothebard 2025-06-30

Biraz daha aşağı inince…

8 bit CPU yapmak…?
https://eater.net/8bit

 
GN⁺ 2025-06-29
Hacker News yorumu
  • Eskiden üniversite yıllarında üç kişiyle 3 hafta süren bir grup projesi yapmıştık, onu hatırlattı. Çeşitli konular arasından oldukça temel bir işletim sistemini doğrudan yapmak gibi seçenekler de vardı; biz de hocalara Raspberry Pi’ye MINIX3 port etmemize izin verip vermeyeceklerini sorduk ve onay aldık (MINIX3’ün zaten BeagleBoard için bir ARM portu olduğu için mümkün görünüyordu).<br>Beklediğimizden çok daha zordu ve hayal bile etmediğimiz teknik sorunlar yağdı. Özellikle Raspberry Pi 3’ün supervisor modu yerine hypervisor modunda açılması bizi çok uğraştırdı ve QEMU’nun Raspberry Pi emülasyonunun doğruluğu o kadar kötüydü ki OS geliştirmede neredeyse işe yaramıyordu. Çözüm bulmak için düşük seviye donanım debug işiyle bir hafta uğraştık. <br>Sonunda UART, GPIO ve framebuffer sürücülerini içeren çalışan bir port yaptık ve Raspberry Pi 2 ile 3’te çalıştırmayı başardık. Sunumu gerçek donanım üzerinde yaptık; shell script ile ramdisk imajını yazdırdık, GPIO pinlerini izleyerek slaytları ileri geri aldırdık ve bir bıçakla pinleri kısa devre ettirerek bunu doğrudan kontrol ettik. Özgünlük açısından ezici derecede havalı bir sunumdu ve o SD kart imajı hâlâ bendedir diye düşünüyorum

    • Harika bir deneyim gibi görünüyor<br>MINIX3’ü Raspberry Pi’ye port edelim dediğiniz anda, hocalar başarısız olmanızı beklemiş olabilir<br>QEMU’nun Raspberry Pi emülasyon doğruluğu zayıf olduğunda ben, önce OS’yi QEMU’da çalışır hâle getirip sonra donanımda biraz şansa bırakma stratejisini kullandım. Yine de fena değildi<br>Gerçek Raspberry Pi üzerinde nasıl debug yaptığınızı merak ediyorum

    • GPIO’yu kısa devre ettirmek için bıçak kullandığını duyunca, ATX anakartta güç düğmesi olmadan açmak için iki güç pinini kısa devre ettiğim zamanlar aklıma geldi<br>Yine de senin kurduğun düzen çok daha havalı. Eline sağlık

  • SFU’da 25~30 yıl önce benzer bir şey yapmıştım. OS ve derleyici kurma kısmını yapmadım, takım projesi de değildi<br>Böyle deneylere ilginiz varsa, rehberleri ve erişilebilir araçları olan Turing Complete’i öneririm. Birkaç kapıdan başlayıp gerçek bir bilgisayara kadar ilerleyebiliyorsunuz. Toplulukla ve bileşenlerle paylaşım da mümkün, bir RiscV çekirdeği de var. Gerçekten çok eğlenceli, Steam’de denemenizi tavsiye ederim<br>Turing Complete Steam bağlantısı

    • Bunu görünce, zamanında çok keyif alarak yaptığım nand2tetris’in oyun versiyonu gibi geldi. Bu da denemeye değer bir öneri
  • Bu yazı bana nedense benzer bir akademik(?) projeyi hatırlattı. En azından özel yapım bir C derleyicisi ve özel yapım bir OS vardı diye hatırlıyorum. Adını tam anımsayamıyorum

  • Daha önce açılmış ilgili başlık için bkz. önceki yazı bağlantısı

  • CPU + derleyici + OS’yi doğrudan kendin yaptığında, altta duran bir platform diye bir şey yok. Platform benim.<br>Hata, sistemin kuralı hâline geliyor. Normalde başkasının kurduğu soyutlama katmanlarında debug yaparsın; burada ise o kuralları bile ben tanımlıyorum. OP, kendi kurallarını bizzat debug etmiş sayılır

  • Gerçekten etkileyici. Düşük seviye tarafta çalışmak genelde sıkıcıdır ve çok zaman alır; özellikle debugger gibi zorunlu araçlar yoksa daha da zorlaşır

    • Osiloskopla garip bir kprintf debug etmediysen, henüz gerçek düşük seviye tadını almamışsındır
  • Magic-1 ve BMOW da geçmişte benzer şeyler yapmıştı<br>Ayrıntılar için homebrewcpu.com bkz.<br>Ev yapımı CPU yapan sitelerin listesi için homebrewcpuring.org bkz.

  • Artık FPGA üzerinde uygulamak yerine yarı iletken laboratuvarına koşup CPU’yu doğrudan üretmelerini isteme zamanı geldi