10 puan yazan GN⁺ 21 일 전 | 3 yorum | WhatsApp'ta paylaş
  • 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:
    1. Open Firmware portu
    2. BootX portu
    3. Ö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_args yapısına eklenerek çekirdeğe aktarıldı
    • Sonrasında çekirdek ağacı düzgün biçimde tanıyıp önyüklemeye devam etti

Ç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: IOPCIBridgeIOPCIDeviceSomeEthernetCardIOEthernetInterface
    • 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 NintendoWiiHollywood sürücüsü yazıldı
    • Alt donanımı temsil eden NintendoWiiHollywoodDevice nub nesneleri oluşturulup kaydedildi
    • Böylece SD kart gibi alt aygıt sürücüleri bağlanabildi
  • SD kart sürücüsü

    • Wii SD kart erişimi için IOBlockStorageDevice sı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 IOMedia nub 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: disk0s4 görüldü
  • Framebuffer sürücüsü

    • IOFramebuffer sı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() fonksiyonu true dö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 AppleUSBOHCI kullanı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 NintendoWiiHollywoodPCIDevice yazı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ı

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-map düğü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

 
ffdd270 21 일 전

Lezzetli bir yazıya ne kadar da harika bir yazar yakışmış....

 
jjpark78 21 일 전

Meraklıların en meraklısı yine Batılı meraklılar derler ya..

 
GN⁺ 21 일 전
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ış

    • Ben de benzer hissettim. İlk kez sürücü yazan biri olarak öğrenme eğrisi dikti ama sistemin canlanışını görünce IOKit yaklaşımını anlamaya başladım
      Başka platformlarda sürücü geliştirme deneyimim olmadığı için karşılaştırmak zor ama yapısal olarak oldukça çekiciydi
    • IOKit’in OS X için sıfırdan yapıldığını, NeXT döneminde ise DriverKit adlı farklı bir model kullanıldığını duymuştum
      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ç
    • Linux yığınıyla da birçok benzer yönü var; bu yüzden Linux on Wii projesine bakıp framebuffer sorununu nasıl ele aldıklarını karşılaştırmayı düşünüyorum
      Wii üzerinde bu kadar çok işletim sisteminin çalışabiliyor olması hâlâ inanılmaz geliyor
    • OPENSTEP döneminden beri birden fazla mimari ve işletim sistemini hedeflemiş olmaları, muhtemelen bu soyutlamaya yardımcı olmuştur
    • “MacOS’un ne kadar iyi soyutlandığı şaşırtıcı” sözüne katılıyorum
      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

    • Benim için ekonomi sınıfında dizüstünü düzgün kullanmak bile zor; bir de Wii bağlayıp hata ayıklamış olması akıl almaz
    • Bir zamanlar Apple’ın uçakta kurgu yapan birini gösteren bir reklamı vardı (YouTube bağlantısı)
    • Yan koltuktaki kişi muhtemelen “Bu da ne?” diye düşünüp telefonuna bakmaya devam etmiştir. Ben olsam dayanamaz sorardım
    • Fotoğrafa bakınca otobüs gibi de uçak gibi de görünüyordu. Her durumda hareket hâlindeyken Wii ile geliştirme yapmış olması inanılmaz odak ve adanmışlığın göstergesi
      (Sonradan baktım; ilk fotoğraf otobüs, ikincisi uçaktı)
    • Yolculuk sırasında böyle karmaşık bir projeye gömülebilmek şaşırtıcı. Fotoğrafa tekrar baktım, tren ya da otobüs gibi de olabilir. Her hâlükârda müthiş bir gösteriş
  • 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

    • Portunuz büyük bir ilham kaynağı oldu. Bu alana yaptığınız katkılar için teşekkürler
  • 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

    • Güzel sözlerin için teşekkürler :)
  • Wii’nin RAM’inin sadece 88MB olduğunu ilk kez öğrendim. Oyunların elektrona dayalı olmamasına sevindim

    • İlginç bir tarihsel ayrıntı: Wii’nin çıktığı ay Windows Vista da Kuzey Amerika’da piyasaya sürülmüştü
      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
    • Wii ayarlar menüsünün HTML web sayfalarından oluşması komik. 2006 konsolları bile web’in elinden kaçamamış
  • 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

    • Böyle projelerin değeri, bu tür “kesinlikle imkânsız” lafları ebediyen kayda geçirmekte yatıyor
      İnsanlar ‘neredeyse imkânsız’ şeylerin asla olmayacağını kesin hükme bağlayıp kendilerini ilkeli şüpheciler sanıyor
    • Eski bir Linux şakasını hatırlattı. “Linux’ta X nasıl yapılır?” diye sormayın; “Linux’ta X imkânsız” deyin, biri hemen nasıl yapılacağını gösterir derlerdi
    • Ben de Adafruit MacroPad belgelerinde “BLE ya da WiFi eklenemez” cümlesini görünce projeye başlamıştım
      “Gerçekten mi?” deyip UART portlarını yeniden yapılandırarak bir ESP32 bağladım
    • “Her şey macenta” olan hata ayıklama sahnesi de komikti
    • İnternetteki birçok yorumcu bu şekilde sinizmi içgörü sanıyor
      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

    • Gerçekten harika. Mac OS 9 kapalı kaynak olduğu için daha da zor bir meydan okuma gibi görünüyor
    • XNU ya da Darwin kaynaklarının olmaması dezavantaj ama sızdırılmış System 7.1 kaynakları, Ghidra ve MCP gibi araçlarla bunun bir kısmı telafi edilebilir. Bol şans
  • Yazı da harikaydı ama .mov videolarını <video> etiketiyle eklemek tarayıcı uyumluluğu açısından sorunlu
    Chrome ya da Firefox’ta oynatılmıyor

    • Chrome ve Firefox’ta çalışmıyorsa, pratikte neredeyse hiçbir tarayıcıda çalışmıyor demektir
    • Teşekkürler! Bunu zaten düzelttim