Nintendo Wii पर Mac OS X 10.0 (Cheetah) को चलाने में सफलता
(bryankeller.github.io)- Wii के PowerPC-आधारित हार्डवेयर का उपयोग करके Mac OS X 10.0 (Cheetah) को नेटिव रूप से चलाने वाला पोर्टिंग प्रोजेक्ट पूरा
- Darwin/XNU kernel को Wii के अनुरूप संशोधित किया गया, और bootloader·device tree·drivers खुद लिखकर GUI environment तक boot करने में सफलता मिली
- SD card·framebuffer·USB input devices को सपोर्ट करने वाले कस्टम IOKit drivers लागू कर पूरा सिस्टम कार्यशील बनाया गया
- BAT settings conflict fix, Hollywood SoC के लिए driver layer, RGB→YUV conversion framebuffer जैसी Wii-विशिष्ट संरचनाओं को दर्शाया गया
- 10 से अधिक वर्षों के प्रयास के बाद Wii पर Mac OS X का पूरा boot और operation संभव कर, असंभव लगने वाले प्रोजेक्ट्स की चुनौतीपूर्ण अहमियत साबित की गई
Wii पर Mac OS X चलाने वाले प्रोजेक्ट का अवलोकन
- Mac OS X 10.0 (Cheetah) को Nintendo Wii पर नेटिव रूप से चलाने के लिए पोर्टिंग प्रोजेक्ट चलाया गया
- Wii पर पहले से Linux, NetBSD, Windows NT जैसे OS पोर्ट किए जा चुके थे, और अब इसमें Mac OS X भी जुड़ गया
- Wii के PowerPC-आधारित हार्डवेयर का उपयोग कर Darwin/XNU kernel चलाया गया, और ज़रूरी drivers और bootloader सीधे लिखे गए
- नतीजतन Wii पर Mac OS X GUI environment तक पूरा boot सफल हुआ, और keyboard·mouse input भी सपोर्ट हुआ
व्यवहार्यता की जाँच
- Wii का PowerPC 750CL CPU, G3 iMac/iBook में इस्तेमाल हुए PowerPC 750CXe का successor है, इसलिए CPU compatibility में कोई समस्या नहीं थी
- Wii की 88MB RAM (MEM1 24MB + MEM2 64MB) आधिकारिक requirement (128MB) से कम है, लेकिन QEMU test से 64MB पर भी boot संभव होना पुष्टि हुई
- समर्थित हार्डवेयर में USB Gecko (serial debugging), SD card, interrupt controller, framebuffer video output, USB ports शामिल थे
- Mac OS X के open-source core Darwin (XNU kernel, IOKit) को Wii के अनुरूप संशोधित किया जाए तो ऊपरी GUI layer भी चल सकती थी
- Wii में Homebrew Channel और BootMii के ज़रिए अपना code execution संभव है, इसलिए यह पोर्टिंग प्रयोगों के लिए उपयुक्त था
पोर्टिंग का दृष्टिकोण
- तीन boot strategies में से चयन किया गया:
- Open Firmware porting
- BootX porting
- कस्टम bootloader सीधे लिखना
- Wii-विशेष bootloader नया लिखकर hardware initialization, kernel load, device tree generation, kernel को control handoff किया गया
- kernel चलने के बाद bootloader code की ज़रूरत नहीं रहती, और उसके बाद का चरण kernel patching और driver development पर केंद्रित रहा
bootloader लिखना
- ppcskel example code के आधार पर Wii initialization तथा SD card·framebuffer·USB debugging सुविधाएँ लागू की गईं
- Mach-O format वाले XNU kernel को memory में load कर निर्धारित entry point पर jump करके चलाया गया
- kernel execution की पुष्टि के लिए LED blink patch डाली गई, ताकि kernel entry चरण को ट्रैक किया जा सके
- kernel execution path को reverse-trace करने पर device_tree.c चरण में 300 exception होने की पुष्टि हुई → device tree pass करने की ज़रूरत समझी गई
-
device tree बनाना और पास करना
- Wii की fixed hardware structure के आधार पर hardcoded minimal tree बनाया गया (
/cpus,/memory) boot_argsstruct में device tree pointer शामिल करके kernel को पास किया गया- इसके बाद kernel ने tree को सही तरह पहचाना और boot आगे बढ़ा
- Wii की fixed hardware structure के आधार पर hardcoded minimal tree बनाया गया (
kernel patching
- XNU की BAT (Block Address Translation) settings Wii memory map से टकरा रही थीं, इसलिए kernel source में बदलाव ज़रूरी था
- Mac OS X Cheetah guest (QEMU) environment में kernel build system तैयार किया गया
- BAT fix और USB Gecko console output redirection जोड़कर debugging संभव हुई
- इसके बाद virtual memory, IOKit, BSD subsystem सामान्य रूप से initialize हुए
- boot log में “Still waiting for root device” संदेश आया → SD card driver की ज़रूरत स्पष्ट हुई
driver development
-
IOKit संरचना को समझना
- IOKit एक C++-आधारित kernel extension framework है, जो driver-nub संरचना के माध्यम से hardware layer को व्यक्त करता है
- उदाहरण:
IOPCIBridge→IOPCIDevice→SomeEthernetCard→IOEthernetInterface - Wii, PCI bus की जगह SoC (Hollywood) संरचना का उपयोग करता है, इसलिए IOPCIFamily को बदलने के लिए कस्टम driver चाहिए था
-
Hollywood driver
NintendoWiiHollywooddriver लिखा गया, जो device tree के “hollywood” node से match करता है- अधीनस्थ hardware को दर्शाने वाले
NintendoWiiHollywoodDevicenub बनाए और register किए गए - इससे SD card जैसे अधीनस्थ device drivers को attach करना संभव हुआ
-
SD card driver
IOBlockStorageDeviceको inherit करके Wii SD card access लागू किया गया- MINI (Starlet coprocessor) के IPC commands (
IPC_SDMMC_SIZE,READ,WRITE) का उपयोग कर SD card से संचार किया गया - cached memory समस्या के समाधान के लिए uncached memory buffer इस्तेमाल किया गया
- सफलतापूर्वक
IOMedianub बना, जिससे root filesystem पहचान और पूर्ण boot संभव हुआ - boot log में
BSD root: disk0s4की पुष्टि हुई
-
framebuffer driver
IOFramebufferको inherit करके Wii के MEM1 region (0x01700000) को framebuffer के रूप में सेट किया गया- शुरुआती text console और GUI switch के लिए
isConsoleDevice()कोtruereturn कराया गया - Wii का video hardware YUV format उपयोग करता है, इसलिए RGB→YUV conversion के लिए double framebuffer लागू किया गया
- conversion loop के माध्यम से 60Hz पर रंग रूपांतरण किया गया → सही रंगों के साथ GUI output सफल हुआ
-
USB input support
- Wii के OHCI USB 1.1 controller को चलाने के लिए
AppleUSBOHCIउपयोग करने की कोशिश की गई - समस्या 1: IOUSBFamily source की अनुपस्थिति के कारण debugging संभव नहीं थी
- समस्या 2: IOPCIDevice dependency की वजह से Wii के लिए नकली
NintendoWiiHollywoodPCIDeviceलिखा गया - समस्या 3: endianness mismatch (Wii is reversed-little-endian) के कारण software byte-swap हटाना पड़ा
- IRC के माध्यम से Mac OS X Cheetah के लिए IOUSBFamily source प्राप्त करने के बाद संशोधन और build सफल हुआ
- नतीजतन USB keyboard·mouse input काम करने लगा, और Wii एक पूर्ण Mac OS X सिस्टम की तरह चलने लगा
- Wii के OHCI USB 1.1 controller को चलाने के लिए
bootloader और kernel में सुधार
-
bootloader सुधार
- SD card partition scanning और boot menu जोड़ा गया, तथा Apple Partition Map (APM) parsing लागू की गई
- kernel extensions (kext) को bootloader से load कर
/chosen/memory-mapnode में register किया गया - इससे बिना संशोधित Mac OS X installation image से boot करना संभव हुआ
-
kernel सरलीकरण
- Wii-विशेष kernel modifications को न्यूनतम रखा गया:
- BAT settings fix
- “hollywood” node के आधार पर I/O address पहचान
- framebuffer cache consistency fix
- drivers को kernel के बाहर अलग कर build efficiency और maintainability बेहतर की गई
समापन
- 2013 में कॉलेज के दौरान सोचा गया प्रोजेक्ट 10 से अधिक वर्षों बाद पूरा हुआ
- Windows NT Wii porting case से प्रेरणा लेकर यह चुनौती ली गई
- नतीजतन Wii पर Mac OS X 10.0 का पूरा boot और GUI operation हासिल किया गया
- इस सीख पर ज़ोर दिया गया कि “जो प्रोजेक्ट असंभव लगते हैं, वही चुनौती देने लायक होते हैं”
3 टिप्पणियां
स्वादिष्ट लेख पर कमाल के लेखक भी हैं….
कहते हैं कि शौकीनों में भी सबसे बड़े शौकीन विदेशी शौकीन होते हैं..
Hacker News की राय
यह प्रोजेक्ट वाकई हैरान कर देने वाला काम था। लेख खुद भी इतना रोचक था कि मैं आखिर तक पूरी तरह जुड़ा रहा
खासकर यह हिस्सा प्रभावशाली लगा कि “WindowServer ने आपत्ति जताई, और इसे ठीक करने के लिए मुझे खुद framebuffer driver लिखना पड़ा”
MacOS की I/O Kit abstraction layer को वास्तव में अपना काम करते देख कर हैरानी हुई। NeXT डेवलपर्स के लिए तालियाँ
दूसरे platforms पर driver development का अनुभव नहीं है, इसलिए तुलना करना मुश्किल है, लेकिन संरचनात्मक रूप से यह काफ़ी आकर्षक लगा
पहले NetBSD डेवलपर्स ने Mach/IOKit compatibility layer के ऊपर PPC Darwin चलाकर Xquartz तक शुरू किया था। NetBSD ने IOKit calls को translate किया था, यह काफ़ी दिलचस्प है
Wii पर इतने सारे OS चल जाते हैं, यह अब भी यक़ीन करना मुश्किल है
असल में अच्छी abstraction और बुरी abstraction के बीच का फ़र्क़ अक्सर इस पर निर्भर करता है कि उसे कितनी अच्छी तरह समझाया गया है
इंजीनियरिंग खुद में शानदार है, लेकिन यह बात सच में ज़्यादा प्रभावशाली लगी कि लेखक economy seat में development कर रहा था
(बाद में देखा तो पहली तस्वीर बस की थी, दूसरी विमान की)
मैं NetBSD Wii और Wii U ports का लेखक होने के नाते, इस प्रोजेक्ट को दिल से बधाई देता हूँ
आगे यह देखना दिलचस्प होगा कि किन समस्याओं को कैसे हल किया गया
पहले मैं भी काफ़ी hardcore Mac fan था, और reverse engineering करके शुरुआती अनौपचारिक “iOS app” भी बनाया था
लेकिन यह प्रोजेक्ट उन सब से आगे निकल जाता है। Wii पर MacOS चलाना ही नहीं, लेख खुद भी बेहद सटीक और दिलचस्प है
मुझे पहली बार पता चला कि Wii में RAM सिर्फ 88MB है। अच्छा हुआ कि गेम्स इलेक्ट्रॉन-आधारित नहीं थे
Vista की minimum requirement 512MB थी, जबकि ज़्यादातर PCs में उससे कम memory थी
आज 8GB कम पड़ने लगा है और 16GB standard बनता जा रहा है, तो दुनिया सच में बहुत बदल गई है
प्रोजेक्ट शुरू करने से पहले मैंने जाँचा कि “क्या यह संभव भी है?”, और 2021 के एक Reddit comment में लिखा था “0% chance”
उसे देखकर उल्टा और motivation मिला। फिर मैंने Wii hardware का analysis करते हुए शुरुआत की। सच में बहुत मज़ेदार था
लोग ‘लगभग असंभव’ चीज़ों को सीधे असंभव मान लेते हैं, और खुद को सिद्धांतवादी संशयवादी समझने लगते हैं
मैंने सोचा, “सच में?” और UART port को reconfigure करके ESP32 जोड़ दिया
समस्या यह है कि जैसे ‘अज्ञानी निंदकता’ जैसी कोई अवधारणा है ही नहीं
Wii पर kernel panic debug करते हुए विमान की economy seat में बैठा होना — उस एकाग्रता के स्तर की मैं कल्पना भी नहीं कर सकता
ज़्यादातर लोग तो विमान में एक किताब भी ढंग से नहीं पढ़ पाते
यह सच में शानदार project था। इससे पुराने low-level development के स्वर्ण युग की याद आ गई
पहले VGA initialize करना और pixels plot करना आसान था, और 6502 जैसे chips भी काफ़ी सुलभ थे
लेकिन आज systems इतने जटिल हो गए हैं कि entry barrier बहुत बढ़ गया है
ऊपर से AI, development को आसान दिखाने का दावा करते हुए, पहुँच को और कम कर रहा है
मैं भी इसी तरह Mac OS 9 को Wii U पर port करने की कोशिश कर रहा हूँ
इस project को देखकर मैं पूरी तरह प्रभावित हुआ, और जब भी “यह असंभव है” जैसा लगे, फिर से हिम्मत मिलती है
लेख शानदार था, लेकिन
.movवीडियो को<video>tag के साथ डालने से browser compatibility की समस्या हैChrome या Firefox में यह चल नहीं रहा