Nintendo Wii'de Mac OS X 10.0 (Cheetah) Çalıştırma Başarıldı
(bryankeller.github.io)- Wii’nin PowerPC tabanlı donanımını kullanarak Mac OS X 10.0 (Cheetah) sistemini yerel olarak çalıştıran port projesi tamamlandı
- Darwin/XNU çekirdeği Wii’ye uygun şekilde değiştirildi; bootloader, device tree ve sürücüler doğrudan yazılarak GUI ortamına kadar önyükleme başarıldı
- SD kart, framebuffer ve USB giriş aygıtlarını destekleyen özel IOKit sürücüleri uygulanarak sistemin tam çalışması sağlandı
- BAT ayarı çakışmasının düzeltilmesi, Hollywood SoC için sürücü katmanı kurulması, RGB→YUV dönüşümlü framebuffer gibi Wii’ye özgü yapılar yansıtıldı
- 10 yılı aşkın denemenin ardından Wii’de Mac OS X’in tam açılışı ve kullanımı gerçekleştirildi; böylece imkânsız görünen projelerin denemeye değer olduğu kanıtlandı
Wii'de Mac OS X çalıştırma projesine genel bakış
- Mac OS X 10.0 (Cheetah) sistemini Nintendo Wii üzerinde yerel olarak çalıştırmak için bir port projesi yürütüldü
- Wii için daha önce Linux, NetBSD ve Windows NT gibi işletim sistemlerine port örnekleri vardı; şimdi buna Mac OS X de eklendi
- Wii’nin PowerPC tabanlı donanımından yararlanılarak Darwin/XNU çekirdeği çalıştırıldı ve gerekli sürücüler ile bootloader doğrudan yazıldı
- Sonuç olarak Wii’de Mac OS X GUI ortamına kadar tam önyükleme başarıldı ve klavye-fare girişi de desteklendi
Çalıştırılabilirlik incelemesi
- Wii’nin PowerPC 750CL CPU’su, G3 iMac/iBook’larda kullanılan PowerPC 750CXe’nin halefi olduğundan CPU uyumluluğu açısından sorun yoktu
- Wii’nin 88 MB RAM’i (MEM1 24 MB + MEM2 64 MB) resmî gereksinim olan 128 MB’tan düşük olsa da, QEMU testi ile 64 MB’ta da önyüklemenin mümkün olduğu doğrulandı
- Desteklenen donanımlar: USB Gecko (seri hata ayıklama), SD kart, kesme denetleyicisi, framebuffer video çıkışı ve USB portları
- Mac OS X’in açık kaynak çekirdeği olan Darwin (XNU çekirdeği, IOKit) Wii’ye uygun şekilde değiştirilirse üstteki GUI katmanının da çalışabileceği görüldü
- Wii, Homebrew Channel ve BootMii üzerinden özel kod çalıştırabildiği için port deneyleri için uygundu
Port yaklaşımı
- Üç önyükleme stratejisinden biri seçildi:
- Open Firmware portu
- BootX portu
- Özel bir bootloader’ı doğrudan yazmak
- Wii’ye özel yeni bir bootloader yazılarak donanım başlatma, çekirdeği yükleme, device tree oluşturma ve kontrolü çekirdeğe devretme işlemleri gerçekleştirildi
- Çekirdek çalıştıktan sonra bootloader koduna artık gerek kalmadı; sonraki aşamalar çekirdek yamaları ve sürücü geliştirmesi etrafında ilerledi
Bootloader yazımı
- ppcskel örnek kodu temel alınarak Wii başlatma ile SD kart, framebuffer ve USB hata ayıklama işlevleri uygulandı
- Mach-O biçimindeki XNU çekirdeği belleğe yüklendi ve belirtilen entry point’e atlanarak çalıştırıldı
- Çekirdeğin çalışıp çalışmadığını doğrulamak için LED yanıp sönme yaması eklenerek çekirdeğe giriş aşaması izlendi
- Çekirdek yürütme yolu geriye izlenerek device_tree.c aşamasında 300 istisnası oluştuğu görüldü → device tree aktarımının gerekli olduğu anlaşıldı
-
Device tree oluşturma ve aktarma
- Wii’nin sabit donanım yapısına göre sabit kodlanmış asgari bir ağaç kuruldu (
/cpus,/memory) - device tree işaretçisi,
boot_argsyapısına eklenerek çekirdeğe aktarıldı - Sonrasında çekirdek ağacı düzgün biçimde tanıyıp önyüklemeye devam etti
- Wii’nin sabit donanım yapısına göre sabit kodlanmış asgari bir ağaç kuruldu (
Çekirdek yamaları
- XNU’daki BAT (Block Address Translation) ayarları Wii bellek haritasıyla çakıştığı için çekirdek kaynak kodunda değişiklik gerekti
- Mac OS X Cheetah guest (QEMU) ortamında çekirdek derleme sistemi kuruldu
- BAT düzeltmesi ve USB Gecko konsol çıktısı yönlendirmesi eklenerek hata ayıklama yapılabildi
- Ardından sanal bellek, IOKit ve BSD alt sistemi düzgün biçimde başlatıldı
- Önyükleme günlüğünde “Still waiting for root device” mesajı görüldü → SD kart sürücüsüne ihtiyaç olduğu anlaşıldı
Sürücü yazımı
-
IOKit yapısını anlama
- IOKit, C++ tabanlı bir çekirdek eklenti çerçevesidir ve donanım katmanlarını driver-nub yapısıyla ifade eder
- Örnek:
IOPCIBridge→IOPCIDevice→SomeEthernetCard→IOEthernetInterface - Wii, PCI veri yolu yerine SoC (Hollywood) yapısı kullandığından IOPCIFamily yerine geçecek özel sürücüler gerekti
-
Hollywood sürücüsü
- Device tree’deki “hollywood” düğümüyle eşleşen
NintendoWiiHollywoodsürücüsü yazıldı - Alt donanımı temsil eden
NintendoWiiHollywoodDevicenub nesneleri oluşturulup kaydedildi - Böylece SD kart gibi alt aygıt sürücüleri bağlanabildi
- Device tree’deki “hollywood” düğümüyle eşleşen
-
SD kart sürücüsü
- Wii SD kart erişimi için
IOBlockStorageDevicesınıfından türeyen bir sürücü uygulandı - SD kartla iletişim için MINI (Starlet yardımcı işlemcisi) üzerinden IPC komutları (
IPC_SDMMC_SIZE,READ,WRITE) kullanıldı - Önbellekli bellekten kaynaklanan sorunları çözmek için önbelleksiz bellek arabelleği kullanıldı
- Başarıyla
IOMedianub oluşturuldu; böylece kök dosya sistemi tanındı ve tam önyükleme mümkün oldu - Önyükleme günlüğünde
BSD root: disk0s4görüldü
- Wii SD kart erişimi için
-
Framebuffer sürücüsü
IOFramebuffersınıfından türeyen sürücüyle Wii’nin MEM1 alanı (0x01700000) framebuffer olarak atandı- İlk metin konsolu ile GUI arasında geçiş için
isConsoleDevice()fonksiyonutruedöndürecek şekilde ayarlandı - Wii’nin video donanımı YUV biçimi kullandığından RGB→YUV dönüşümü için çift framebuffer uygulandı
- Dönüştürme döngüsüyle 60 Hz’de renk dönüştürmesi yapıldı → GUI doğru renklerle görüntülendi
-
USB giriş desteği
- Wii’nin OHCI USB 1.1 denetleyicisini çalıştırmak için
AppleUSBOHCIkullanılması denendi - Sorun 1: IOUSBFamily kaynak kodu yoktu, bu yüzden hata ayıklama yapılamadı
- Sorun 2: IOPCIDevice bağımlılığı nedeniyle Wii için sahte bir
NintendoWiiHollywoodPCIDeviceyazıldı - Sorun 3: endianness uyumsuzluğu (Wii reversed-little-endian kullanıyor) nedeniyle yazılımsal byte-swap işlemlerinin kaldırılması gerekti
- IRC üzerinden Mac OS X Cheetah için IOUSBFamily kaynak kodu edinildi; ardından değiştirilip başarıyla derlendi
- Sonuç olarak USB klavye ve fare girişi çalıştı ve Wii tam işlevli bir Mac OS X sistemi gibi davrandı
- Wii’nin OHCI USB 1.1 denetleyicisini çalıştırmak için
Bootloader ve çekirdekte iyileştirmeler
-
Bootloader iyileştirmeleri
- SD kart bölüm tarama ve önyükleme menüsü eklendi, Apple Partition Map (APM) ayrıştırması uygulandı
- Kernel extension (kext) bileşenleri bootloader’dan yüklenip
/chosen/memory-mapdüğümüne kaydedildi - Böylece değiştirilmemiş Mac OS X kurulum görüntüsüyle önyükleme mümkün oldu
-
Çekirdeğin sadeleştirilmesi
- Wii’ye özel çekirdek değişiklikleri en aza indirildi:
- BAT ayarlarının düzeltilmesi
- “hollywood” düğümüne dayalı I/O adres tanıma
- Framebuffer önbellek tutarlılığı düzeltmesi
- Sürücülerin çekirdek dışına ayrılmasıyla derleme verimliliği ve bakım kolaylığı artırıldı
Kapanış
- Üniversite yıllarında 2013’te tasarlanan proje 10 yılı aşkın sürenin ardından tamamlandı
- Bu girişim, Windows NT’nin Wii’ye port edilmesi örneğinden ilham aldı
- Sonuç olarak Wii’de Mac OS X 10.0’ın tam önyüklemesi ve GUI kullanımı başarıldı
- “İmkânsız görünen projeler en çok denemeye değerdir” dersi vurgulandı
3 yorum
Lezzetli bir yazıya ne kadar da harika bir yazar yakışmış....
Meraklıların en meraklısı yine Batılı meraklılar derler ya..
Hacker News yorumları
Bu proje gerçekten inanılmaz bir iş olmuş. Yazının kendisi de o kadar sürükleyiciydi ki sonuna kadar içine çekti
Özellikle “WindowServer şikayet ediyordu ve bunu çözmek için doğrudan bir framebuffer sürücüsü yazmak gerekti” kısmı etkileyiciydi
MacOS’un I/O Kit soyutlama katmanının gerçekten işini yaptığını görmek şaşırtıcıydı. NeXT geliştiricilerine alkış
Başka platformlarda sürücü geliştirme deneyimim olmadığı için karşılaştırmak zor ama yapısal olarak oldukça çekiciydi
Eskiden NetBSD geliştiricileri Mach/IOKit uyumluluk katmanı üzerinde PPC Darwin’i çalıştırıp Xquartz’ı bile açmıştı. NetBSD’nin IOKit çağrılarını çevirmiş olması ilginç
Wii üzerinde bu kadar çok işletim sisteminin çalışabiliyor olması hâlâ inanılmaz geliyor
Aslında iyi soyutlama ile kötü soyutlama arasındaki fark, ne kadar iyi açıklandığına bağlıdır
Mühendisliğin kendisi zaten etkileyici ama yazarın ekonomi sınıfında geliştirme yapıyor olması gerçekten ayrı bir seviye
(Sonradan baktım; ilk fotoğraf otobüs, ikincisi uçaktı)
NetBSD Wii ve Wii U portunun yazarı olarak bu projeyi içtenlikle tebrik ediyorum
Bundan sonra hangi sorunların nasıl çözüldüğünü görmeyi merakla bekliyorum
Eskiden ben de koyu bir Mac meraklısıydım ve tersine mühendislikle ilk dönem gayriresmî “iOS uygulamaları”ndan bazılarını yapmıştım
Ama bu proje onların hepsini aşmış. Wii’de MacOS çalıştırmak zaten etkileyici ama yazının kendisi de son derece özenli ve ilgi çekici
Wii’nin RAM’inin sadece 88MB olduğunu ilk kez öğrendim. Oyunların elektrona dayalı olmamasına sevindim
Vista’nın asgari sistem gereksinimi 512MB idi ama çoğu PC’de bundan daha az bellek vardı
Bugün 8GB’ın az gelmeye başlayıp 16GB’ın standart hâline gelmesi dünyayı ne kadar değiştirdiğimizi gösteriyor
Projeye başlamadan önce “Bu gerçekten mümkün mü?” diye baktım ve 2021’de yazılmış bir Reddit yorumunda “%0 ihtimal” denildiğini gördüm
Bu beni tersine daha da motive etti. Sonra Wii donanımını analiz ederek başladım. Gerçekten komikti
İnsanlar ‘neredeyse imkânsız’ şeylerin asla olmayacağını kesin hükme bağlayıp kendilerini ilkeli şüpheciler sanıyor
“Gerçekten mi?” deyip UART portlarını yeniden yapılandırarak bir ESP32 bağladım
Sorun, cahil sinizm diye bir kavramın kabul edilmemesi
Wii’de kernel panic hata ayıklarken uçakta ekonomi sınıfında oturuyor olmak... O odaklanma düzeyini hayal etmek bile zor
Çoğu insan uçakta bir kitap bitirmekte bile zorlanır
Gerçekten harika bir projeydi. Eski düşük seviye geliştirmenin altın çağını hatırlattı
Eskiden VGA başlatıp piksel çizmek kolaydı, 6502 gibi çiplere erişmek de rahattı
Ama bugün sistemler öyle karmaşıklaştı ki giriş eşiği çok yükseldi
Üstelik yapay zeka da geliştirmeyi basitleştiriyormuş gibi yaparken erişilebilirliği daha da azaltıyor
Ben de benzer şekilde Mac OS 9’u Wii U’ya port etmeyi deniyorum
Bu projeden çok etkilendim ve “imkânsız” diye düşündüğüm her anda yeniden cesaret buluyorum
Yazı da harikaydı ama
.movvideolarını<video>etiketiyle eklemek tarayıcı uyumluluğu açısından sorunluChrome ya da Firefox’ta oynatılmıyor