Berhasil Menjalankan Mac OS X 10.0 (Cheetah) di Nintendo Wii
(bryankeller.github.io)- Proyek porting untuk menjalankan Mac OS X 10.0 (Cheetah) secara native dengan memanfaatkan perangkat keras berbasis PowerPC milik Wii telah rampung
- Kernel Darwin/XNU dimodifikasi agar sesuai untuk Wii, dan bootloader, device tree, serta driver ditulis langsung hingga berhasil boot sampai lingkungan GUI
- Driver IOKit kustom yang mendukung kartu SD, framebuffer, dan perangkat input USB diimplementasikan untuk mencapai operasi sistem yang lengkap
- Struktur khas Wii turut diakomodasi, seperti perbaikan konflik pengaturan BAT, pembangunan lapisan driver untuk Hollywood SoC, dan framebuffer konversi RGB→YUV
- Setelah lebih dari 10 tahun percobaan, proyek ini mewujudkan boot penuh dan pengoperasian Mac OS X di Wii, sekaligus membuktikan nilai tantangan dari proyek yang tampak mustahil
Gambaran proyek menjalankan Mac OS X di Wii
- Proyek porting dilakukan untuk menjalankan Mac OS X 10.0 (Cheetah) secara native di Nintendo Wii
- Wii sebelumnya sudah pernah menjadi target porting OS seperti Linux, NetBSD, dan Windows NT, dan kini Mac OS X ikut ditambahkan ke daftar itu
- Dengan memanfaatkan perangkat keras berbasis PowerPC milik Wii, proyek ini menjalankan kernel Darwin/XNU dan menulis sendiri driver serta bootloader yang dibutuhkan
- Hasilnya, Wii berhasil melakukan boot penuh hingga lingkungan GUI Mac OS X, lengkap dengan dukungan input keyboard dan mouse
Meneliti kelayakan
- CPU PowerPC 750CL pada Wii merupakan penerus PowerPC 750CXe yang digunakan pada G3 iMac/iBook, sehingga tidak ada masalah kompatibilitas CPU
- RAM 88MB pada Wii (MEM1 24MB + MEM2 64MB) memang lebih kecil dari spesifikasi resmi (128MB), tetapi pengujian QEMU menunjukkan sistem tetap bisa boot dengan 64MB
- Perangkat keras yang didukung meliputi USB Gecko (debugging serial), kartu SD, interrupt controller, output video framebuffer, dan port USB
- Jika inti open source Mac OS X, yaitu Darwin (kernel XNU, IOKit), dimodifikasi agar sesuai dengan Wii, maka lapisan GUI di atasnya juga dapat berjalan
- Wii memungkinkan eksekusi kode buatan sendiri melalui Homebrew Channel dan BootMii, sehingga cocok untuk eksperimen porting
Pendekatan porting
- Dipilih satu dari tiga strategi boot:
- Porting Open Firmware
- Porting BootX
- Menulis langsung bootloader kustom
- Sebuah bootloader khusus Wii ditulis dari nol untuk melakukan inisialisasi hardware, memuat kernel, membuat device tree, dan menyerahkan kendali ke kernel
- Setelah kernel berjalan, kode bootloader tidak lagi diperlukan, dan tahap berikutnya berfokus pada patch kernel serta penulisan driver
Menulis bootloader
- Berdasarkan kode contoh ppcskel, diimplementasikan inisialisasi Wii serta fungsi kartu SD, framebuffer, dan debugging USB
- Kernel XNU berformat Mach-O dimuat ke memori lalu dijalankan dengan lompat ke entry point yang ditentukan
- Untuk memastikan kernel benar-benar berjalan, disisipkan patch kedipan LED guna melacak tahap masuk ke kernel
- Dengan menelusuri balik jalur eksekusi kernel, ditemukan exception 300 pada tahap device_tree.c → disadari perlunya mengirim device tree
-
Membuat dan mengirim device tree
- Dibangun tree minimum yang di-hardcode berdasarkan struktur hardware Wii yang tetap (
/cpus,/memory) - Pointer device tree dimasukkan ke struktur
boot_argsdan dikirim ke kernel - Setelah itu kernel dapat mengenali tree dengan benar dan proses boot berlanjut
- Dibangun tree minimum yang di-hardcode berdasarkan struktur hardware Wii yang tetap (
Patch kernel
- Pengaturan BAT (Block Address Translation) pada XNU bentrok dengan peta memori Wii sehingga sumber kernel perlu dimodifikasi
- Lingkungan build kernel disusun di guest Mac OS X Cheetah (QEMU)
- Setelah perbaikan BAT dan penambahan redirect output konsol ke USB Gecko, proses debugging menjadi memungkinkan
- Berikutnya memori virtual, IOKit, dan subsistem BSD berhasil diinisialisasi dengan normal
- Pada log boot muncul pesan “Still waiting for root device” → menandakan perlunya driver kartu SD
Menulis driver
-
Memahami struktur IOKit
- IOKit adalah framework ekstensi kernel berbasis C++ yang merepresentasikan lapisan hardware melalui struktur driver-nub
- Contoh:
IOPCIBridge→IOPCIDevice→SomeEthernetCard→IOEthernetInterface - Karena Wii memakai struktur SoC (Hollywood), bukan bus PCI, dibutuhkan driver kustom pengganti IOPCIFamily
-
Driver Hollywood
- Driver
NintendoWiiHollywoodditulis untuk dicocokkan dengan node “hollywood” pada device tree - Driver ini membuat dan mendaftarkan nub
NintendoWiiHollywoodDeviceuntuk merepresentasikan hardware di bawahnya - Dengan begitu, driver perangkat turunan seperti kartu SD dapat terhubung
- Driver
-
Driver kartu SD
- Akses kartu SD Wii diimplementasikan dengan mewarisi
IOBlockStorageDevice - Komunikasi dengan kartu SD dilakukan memakai perintah IPC milik MINI (koprosesor Starlet), yaitu
IPC_SDMMC_SIZE,READ, danWRITE - Untuk mengatasi masalah memori cache, digunakan buffer memori non-cache
- Hasilnya, nub
IOMediaberhasil dibuat sehingga filesystem root dikenali dan boot penuh menjadi mungkin - Pada log boot muncul
BSD root: disk0s4
- Akses kartu SD Wii diimplementasikan dengan mewarisi
-
Driver framebuffer
- Dengan mewarisi
IOFramebuffer, area MEM1 Wii (0x01700000) ditetapkan sebagai framebuffer - Untuk perpindahan antara konsol teks awal dan GUI,
isConsoleDevice()dibuat mengembalikantrue - Karena hardware video Wii memakai format YUV, diimplementasikan double framebuffer untuk konversi RGB→YUV
- Melalui loop konversi, konversi warna dilakukan pada 60Hz → GUI tampil dengan warna normal
- Dengan mewarisi
-
Dukungan input USB
- Untuk menjalankan kontroler USB 1.1 OHCI milik Wii, dicoba penggunaan
AppleUSBOHCI - Masalah 1: tidak ada source IOUSBFamily, sehingga debugging tidak bisa dilakukan
- Masalah 2: ketergantungan pada IOPCIDevice, sehingga dibuat
NintendoWiiHollywoodPCIDevicepalsu khusus Wii - Masalah 3: ketidakcocokan endian (Wii memakai reversed-little-endian), sehingga byte-swap software perlu dihapus
- Setelah memperoleh source IOUSBFamily untuk Mac OS X Cheetah melalui IRC, source tersebut dimodifikasi dan berhasil di-build
- Hasil akhirnya, input keyboard dan mouse USB berfungsi, dan Wii bekerja sebagai sistem Mac OS X yang lengkap
- Untuk menjalankan kontroler USB 1.1 OHCI milik Wii, dicoba penggunaan
Penyempurnaan bootloader dan kernel
-
Penyempurnaan bootloader
- Ditambahkan pencarian partisi kartu SD dan menu boot, serta diimplementasikan parsing Apple Partition Map (APM)
- Ekstensi kernel (kext) dimuat dari bootloader lalu didaftarkan ke node
/chosen/memory-map - Dengan cara ini, sistem dapat boot menggunakan image instalasi Mac OS X yang tidak dimodifikasi
-
Penyederhanaan kernel
- Modifikasi kernel khusus Wii diminimalkan:
- perbaikan pengaturan BAT
- pengenalan alamat I/O berbasis node “hollywood”
- perbaikan koherensi cache framebuffer
- Driver dipisahkan dari kernel untuk meningkatkan efisiensi build dan kemudahan pemeliharaan
Penutup
- Proyek yang pertama kali dibayangkan saat kuliah pada 2013 akhirnya selesai lebih dari 10 tahun kemudian
- Tantangan ini terinspirasi dari kasus porting Windows NT ke Wii
- Pada akhirnya berhasil dicapai boot penuh dan pengoperasian GUI Mac OS X 10.0 di Wii
- Ditekankan pelajaran bahwa “semakin mustahil sebuah proyek terlihat, semakin layak ia untuk dicoba”
3 komentar
Tulisan yang enak dibaca dengan penulis yang keren juga….
Kebangetan, ternyata yang paling niat di antara para geek memang orang Barat..
Komentar Hacker News
Proyek ini benar-benar pekerjaan yang luar biasa. Tulisannya sendiri juga sangat memikat sehingga saya terus terhanyut sampai selesai
Bagian yang paling berkesan adalah, “WindowServer menunjukkan keluhan, dan untuk mengatasinya saya harus menulis driver framebuffer sendiri”
Saya terkejut melihat lapisan abstraksi I/O Kit di MacOS benar-benar menjalankan fungsinya. Tepuk tangan untuk para pengembang NeXT
Saya tidak punya pengalaman pengembangan driver di platform lain jadi sulit membandingkannya, tetapi dari sisi struktur rasanya cukup menarik
Dulu para pengembang NetBSD juga pernah menjalankan PPC Darwin di atas lapisan kompatibilitas Mach/IOKit sampai bisa menampilkan Xquartz. Menarik bahwa NetBSD menerjemahkan pemanggilan IOKit
Masih sulit dipercaya bahwa sebanyak ini OS bisa berjalan di atas Wii
Sebenarnya perbedaan antara abstraksi yang baik dan buruk bergantung pada seberapa baik abstraksi itu dijelaskan
Rekayasanya sendiri sudah hebat, tetapi yang benar-benar mengesankan adalah penulisnya mengembangkan ini di kursi kelas ekonomi
(Setelah dicek lagi, foto pertama di bus, yang kedua di pesawat)
Sebagai penulis port NetBSD untuk Wii dan Wii U, saya mengucapkan selamat yang tulus atas proyek ini
Saya menantikan melihat masalah apa saja yang dihadapi dan bagaimana semuanya diselesaikan
Dulu saya juga penggemar Mac yang hardcore, dan pernah membuat “aplikasi iOS” tidak resmi pada masa awal lewat rekayasa balik
Tetapi proyek ini melampaui semuanya. Menjalankan MacOS di Wii saja sudah luar biasa, tetapi tulisannya sendiri juga sangat rapi dan menarik
Baru sekarang saya tahu bahwa RAM Wii hanya 88MB. Untung game-game saat itu tidak berbasis elektron
Kebutuhan minimum Vista adalah 512MB, tetapi kebanyakan PC saat itu punya memori lebih sedikit dari itu
Sekarang 8GB mulai terasa kecil dan 16GB menjadi standar, dunia memang sudah banyak berubah
Sebelum memulai proyek ini, saya sempat mengecek, “Apa ini memang mungkin dilakukan?” lalu menemukan komentar Reddit tahun 2021 yang bilang "kemungkinannya 0%"
Justru itu yang memotivasi saya. Dari situ saya mulai dengan menganalisis perangkat keras Wii. Benar-benar lucu
Orang sering mengira dirinya skeptis yang berprinsip, padahal sebenarnya mereka cuma menganggap hal yang ‘hampir mustahil’ sebagai sesuatu yang pasti tidak akan pernah terjadi
Saya berpikir, “Masa sih?” lalu mengonfigurasi ulang port UART dan memasang ESP32
Masalahnya, tidak ada konsep tentang sinisme yang lahir dari ketidaktahuan
Membayangkan seseorang duduk di kursi ekonomi pesawat sambil melakukan debugging kernel panic di Wii benar-benar di luar nalar, tingkat konsentrasinya sulit dibayangkan
Kebanyakan orang bahkan susah membaca satu buku di pesawat
Proyek yang sangat keren. Ini mengingatkan saya pada masa keemasan pengembangan level rendah dulu
Dulu inisialisasi VGA dan menggambar piksel itu mudah, dan chip seperti 6502 juga sangat mudah diakses
Tetapi sekarang sistem sudah terlalu kompleks sehingga hambatan masuknya jadi tinggi
Ditambah lagi AI justru berpura-pura menyederhanakan pengembangan sambil membuat aksesibilitas makin buruk
Saya juga sedang mencoba mem-porting Mac OS 9 ke Wii U
Melihat proyek ini benar-benar membuat saya terkesan, dan setiap kali muncul pikiran “ini tidak mungkin”, saya jadi mendapat keberanian lagi
Tulisannya bagus, tetapi memasukkan video
.movdengan tag<video>menimbulkan masalah kompatibilitas browserDi Chrome atau Firefox videonya tidak bisa diputar