Chạy nguyên bản Mac OS X trên Nintendo Wii: Hành trình kỹ thuật đầy thú vị

08 tháng 4, 2026·7 phút đọc

Một lập trình viên đã thành công trong việc port hệ điều hành Mac OS X 10.0 (Cheetah) lên máy chơi game Nintendo Wii. Dự án đòi hỏi việc viết lại bootloader, vá lỗi kernel và phát triển driver riêng để tương thích với phần cứng độc đáo của Wii.

Chạy nguyên bản Mac OS X trên Nintendo Wii: Hành trình kỹ thuật đầy thú vị

Chạy nguyên bản Mac OS X trên Nintendo Wii: Hành trình kỹ thuật đầy thú vị

Mac OS X chạy trên Nintendo WiiMac OS X chạy trên Nintendo Wii

Kể từ khi ra mắt vào năm 2006, Nintendo Wii đã chứng kiến nhiều hệ điều hành được các lập trình viên porting sang máy này, bao gồm Linux, NetBSD và gần đây nhất là Windows NT. Giờ đây, danh sách đó đã được bổ sung thêm một cái tên cực kỳ ấn tượng: Mac OS X.

Trong bài viết này, chúng ta sẽ cùng khám phá quá trình một kỹ sư đã port phiên bản đầu tiên của Mac OS X — phiên bản 10.0 Cheetah — để chạy nguyên bản trên Nintendo Wii. Đây là một dự án kỹ thuật đầy thách thức đòi hỏi kiến thức sâu rộng về phần cứng, bootloader, kernel và viết trình điều khiển (driver).

Đánh giá tính khả thi

Trước khi bắt đầu, câu hỏi lớn nhất là liệu điều này có khả thi hay không. Wii sử dụng bộ vi xử lý PowerPC 750CL — một phiên bản tiến hóa của PowerPC 750CXe từng được dùng trong các máy iBook G3 và iMac G3. Sự tương đồng về kiến trúc này là một tín hiệu tích cực.

Về bộ nhớ, Wii có cấu hình khá độc đáo với tổng cộng 88 MB RAM, được chia thành 24 MB 1T-SRAM (MEM1) và 64 MB SDRAM GDDR3 chậm hơn (MEM2). Mặc dù Mac OS X Cheetah yêu cầu chính thức là 128 MB RAM, nhưng nó có thể khởi động với dung lượng thấp hơn. Thông qua thử nghiệm trên QEMU, tác giả xác nhận rằng hệ thống có thể chạy ổn định với 64 MB RAM.

Ngoài ra, các thành phần phần cứng khác như cổng USB (cho chuột và bàn phím), khe thẻ SD và đầu ra video cũng cần được hỗ trợ.

Kiến trúc hệ điều hành macOSKiến trúc hệ điều hành macOS

Chiến lược Bootloader và Kernel

Mac OS X có một lõi mã nguồn mở là Darwin (bao gồm nhân XNU và mô hình driver IOKit), với các thành phần độc quyền nằm ở lớp trên. Trên các máy Mac thực tế sử dụng PowerPC, quá trình khởi động bắt đầu bằng Open Firmware, sau đó chuyển sang BootX và mới đến nhân XNU.

Tuy nhiên, việc port toàn bộ Open Firmware sang Wii là không cần thiết và quá phức tạp. Thay vào đó, tác giả đã chọn viết một bootloader tùy chỉnh từ đầu, dựa trên mã nguồn thấp ppcskel dành cho Wii. Bootloader này có nhiệm vụ khởi tạo phần cứng, nạp nhân XNU từ thẻ SD, xây dựng một "cây thiết bị" (device tree) và chuyển quyền điều khiển cho kernel.

Nhân XNU được lưu trữ trong định dạng Mach-O. Bootloader phải giải mã định dạng này để nạp các đoạn mã đúng vào địa chỉ bộ nhớ. Sau khi nhảy đến điểm nhập của kernel, màn hình chuyển sang màu đen — một dấu hiệu cho thấy kernel đã bắt đầu chạy nhưng chưa có đầu ra hiển thị.

Gỡ lỗi và Vá lỗi Kernel

Việc gỡ lỗi ở mức độ này cực kỳ khó khăn vì các chức năng debug thông thường đã bị vô hiệu hóa bởi kernel. Tác giả đã sử dụng một phương pháp "hack" sáng tạo: sửa đổi mã nhị phân của kernel để điều khiển đèn LED trên mặt trước của Wii. Bằng cách chèn các lệnh assembly để bật/tắt đèn LED tại các vị trí cụ thể trong mã nguồn, tác giả có thể xác định kernel đã chạy đến đâu trước khi bị crash.

Quá trình gỡ lỗi bằng cách nhấp nháy đèn LEDQuá trình gỡ lỗi bằng cách nhấp nháy đèn LED

Sau nhiều lần thử, kernel đã chạy được đến các hàm C cấp cao hơn nhưng gặp lỗi liên quan đến việc thiết lập bộ nhớ video và I/O. XNU giả định các địa chỉ bộ nhớ nhất định không tương thích với cấu hình của Wii (MEM1 bắt đầu tại 0x00000000, MEM2 tại 0x10000000). Giải pháp là sửa đổi mã nguồn của XNU để cấu hình lại Block Address Translations (BATs) và định tuyến lại đầu ra console sang công cụ debug USB Gecko.

Viết Driver cho phần cứng Wii

Để hệ điều hành hoạt động hoàn chỉnh, việc viết driver là bắt buộc. Mac OS X sử dụng IOKit — một khung làm việc hướng đối tượng để viết driver.

Driver cho Hollywood và SD Card

Khác với máy Mac cùng thời điểm sử dụng bus PCI, Wii sử dụng một hệ thống trên chip (SoC) tùy chỉnh tên là Hollywood và một coprocessor ARM tên là Starlet. Tác giả phải viết driver NintendoWiiHollywood để tạo ra các "nubs" (điểm gắn kết) cho các thiết bị con.

Đặc biệt, driver thẻ SD (NintendoWiiSDCard) phải giao tiếp với coprocessor Starlet thông qua IPC (Inter-Process Communication) để đọc và ghi dữ liệu. Đây là bước quan trọng để giải quyết lỗi kinh điển "Still waiting for root device", cho phép hệ thống tìm thấy hệ thống tập tin để tiếp tục khởi động.

Driver cho Framebuffer

Một thách thức lớn khác là hiển thị. Wii sử dụng bộ mã hóa video tối ưu cho tín hiệu TV analog, yêu cầu dữ liệu điểm ảnh ở định dạng YUV 16-bit, trong khi Mac OS X mong đợi RGB.

Giải pháp là sử dụng hai framebuffer: một framebuffer RGB để Mac OS X ghi dữ liệu vào, và một framebuffer YUV để phần cứng Wii hiển thị. Driver sẽ chuyển đổi dữ liệu từ RGB sang YUV 60 lần mỗi giây. Nhờ đó, giao diện Aqua của Mac OS X đã xuất hiện đúng màu trên màn hình TV thay vì màu tím lịm ban đầu.

Thêm hỗ trợ USB

Để biến Wii thành một máy tính Mac có thể sử dụng được, hỗ trợ chuột và bàn phím qua USB là bắt buộc. Wii sử dụng bộ điều khiển chủ OHCI USB 1.1.

Tuy nhiên, driver AppleUSBOHCI của Mac OS X yêu cầu thiết bị phải thuộc lớp IOPCIDevice, trong khi Wii không sử dụng PCI. Tác giả đã tạo ra một nub giả lập NintendoWiiHollywoodPCIDevice để đánh lừa driver này.

Một vấn đề phức tạp hơn là thứ tự byte (endianness). Wii sử dụng cơ chế "reversed-little-endian", trong khi driver USB của Mac OS X thực hiện hoán đổi byte trong phần mềm. Điều này dẫn đến việc hoán đổi kép, khiến USB không hoạt động. Không có mã nguồn của IOUSBFamily cho phiên bản Cheetah, tác giả đã phải tìm kiếm trên các diễn đàn cũ và may mắn tìm thấy kho CVS chứa mã nguồn cần thiết. Sau khi biên dịch lại và loại bỏ các phần hoán đổi byte không cần thiết, bàn phím và chuột USB cuối cùng đã hoạt động.

Hoàn thiện và Kết luận

Để đơn giản hóa quá trình cài đặt và cập nhật, tác giả đã cải tiến bootloader để có thể nạp các driver (kext) từ một phân vùng FAT32 riêng biệt. Điều này cho phép boot từ các phân vùng cài đặt nguyên bản của Mac OS X mà không cần sửa đổi hệ thống tập tin chính.

Dự án này là một minh chứng tuyệt vời cho sự kiên trì và đam mê kỹ thuật. Được bắt đầu từ ý tưởng năm 2013 và hoàn thành sau nhiều năm, việc đưa Mac OS X lên Nintendo Wii không chỉ là một thành tựu kỹ thuật mà còn là lời nhắc nhở rằng những dự án có vẻ "bất khả thi" chính là những dự án đáng để theo đuổi nhất.

Nếu bạn quan tâm, mã nguồn của dự án wiiMac bootloader đã được công khai để cộng đồng trải nghiệm.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗