10 poin oleh GN⁺ 12 hari lalu | Belum ada komentar. | Bagikan ke WhatsApp
  • 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:
    1. Porting Open Firmware
    2. Porting BootX
    3. 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_args dan dikirim ke kernel
    • Setelah itu kernel dapat mengenali tree dengan benar dan proses boot berlanjut

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: IOPCIBridgeIOPCIDeviceSomeEthernetCardIOEthernetInterface
    • Karena Wii memakai struktur SoC (Hollywood), bukan bus PCI, dibutuhkan driver kustom pengganti IOPCIFamily
  • Driver Hollywood

    • Driver NintendoWiiHollywood ditulis untuk dicocokkan dengan node “hollywood” pada device tree
    • Driver ini membuat dan mendaftarkan nub NintendoWiiHollywoodDevice untuk merepresentasikan hardware di bawahnya
    • Dengan begitu, driver perangkat turunan seperti kartu SD dapat terhubung
  • 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, dan WRITE
    • Untuk mengatasi masalah memori cache, digunakan buffer memori non-cache
    • Hasilnya, nub IOMedia berhasil dibuat sehingga filesystem root dikenali dan boot penuh menjadi mungkin
    • Pada log boot muncul BSD root: disk0s4
  • Driver framebuffer

    • Dengan mewarisi IOFramebuffer, area MEM1 Wii (0x01700000) ditetapkan sebagai framebuffer
    • Untuk perpindahan antara konsol teks awal dan GUI, isConsoleDevice() dibuat mengembalikan true
    • 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
  • 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 NintendoWiiHollywoodPCIDevice palsu 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

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”

Belum ada komentar.

Belum ada komentar.