- Ü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
Üniversitede böyle bir deneyim yaşanabilmesi gerçekten imrendirici. Çok eğlenceli gibi görünüyor..
Gerçekten çok eğlenceli olmuştur.
Biraz daha aşağı inince…
8 bit CPU yapmak…?
https://eater.net/8bit
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ı
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
kprintfdebug etmediysen, henüz gerçek düşük seviye tadını almamışsındırMagic-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