닌텐도 Wii에서 Mac OS X 10.0 Cheetah 구동 성공!

by DD
1개월 전
조회수 2

Wii 하드웨어 분석을 통해 Mac OS X 10.0 Cheetah 구동 가능성을 확인하고, 부트로더 개발, 커널 패치, 드라이버 작성 등 다양한 기술적 도전에 직면함.

IOKit 드라이버 모델을 이해하고, Wii의 특수한 하드웨어 환경에 맞는 SD 카드 및 프레임버퍼 드라이버를 구현하여 GUI 구동에 성공함.

USB 지원 구현을 위해 AppleUSBOHCI 드라이버를 분석하고, 엔디안(Endianness) 문제를 해결하여 USB 키보드 및 마우스 지원을 추가함.

부트로더 개선을 통해 설치 및 시스템 파티션 부팅을 지원하고, 커널 수정 최소화를 통해 시스템 안정성을 확보함.

Wii 하드웨어 분석 및 Mac OS X 호환성 검토

프로젝트 시작 전, Wii 하드웨어와 Mac OS X 10.0 Cheetah의 호환성을 면밀히 검토했다. Wii는 PowerPC 750CL 프로세서를 사용하며, 이는 G3 iBook 및 iMac에 사용된 PowerPC 750CXe의 진화된 형태이다. 또한, 24MB의 1T-SRAM(MEM1)과 64MB의 GDDR3 SDRAM(MEM2)으로 구성된 독특한 RAM 구성을 가지고 있다. QEMU를 사용하여 64MB RAM 환경에서 Cheetah를 부팅하여 문제 없음을 확인했다.

커스텀 부트로더 개발 및 커널 패치

Wii에서 Mac OS X를 부팅하기 위해, 저자는 커스텀 부트로더(Custom Bootloader)를 처음부터 작성했다. 부트로더는 Wii 하드웨어 초기화, SD 카드에서 커널 로드, 디바이스 트리 생성, 부트 인자 전달 등의 역할을 수행한다. 커널 실행 후에는 커널 패치(Kernel Patching)를 통해 비디오 및 I/O 메모리 설정을 수정하고, Wii의 메모리 레이아웃에 맞게 BAT 설정을 변경했다. 이를 위해, XNU 소스 코드를 수정하고, LED를 사용하여 커널 실행 여부를 확인하는 방법을 사용했다.

IOKit 드라이버 모델 이해 및 SD 카드 드라이버 구현

Mac OS X 드라이버는 IOKit을 사용하여 개발되며, 저자는 IOKit 드라이버 모델을 이해하는 데 어려움을 겪었다고 언급한다. Wii의 SD 카드 접근을 위해, IOBlockStorageDevice를 상속받아 SD 카드 드라이버(SD Card Driver)를 구현했다. 이 드라이버는 MINI를 사용하여 SD 카드와 통신하며, IPC_SDMMC_SIZE, IPC_SDMMC_READ, IPC_SDMMC_WRITE 명령을 통해 읽기, 쓰기, 용량 확인 기능을 구현했다. 캐시 메모리 문제를 해결하기 위해, uncached 메모리를 사용했다.

프레임버퍼 드라이버 및 GUI 렌더링

Mac OS X GUI를 표시하기 위해, 저자는 IOFramebuffer를 상속받아 프레임버퍼 드라이버(Framebuffer Driver)를 구현했다. Wii의 프레임버퍼는 MEM1의 0x01700000에 위치하며, 640x480 해상도, 16비트 픽셀 형식을 사용한다. Wii의 비디오 하드웨어는 YUV 픽셀 데이터를 예상하므로, RGB 픽셀 데이터를 YUV로 변환하는 듀얼 프레임버퍼(Dual-Framebuffer) 전략을 사용했다. 이를 통해, Mac OS X GUI를 정상적으로 표시할 수 있게 되었다.

USB 지원 구현 및 엔디안(Endianness) 문제 해결

USB 키보드 및 마우스 지원을 위해, AppleUSBOHCI 드라이버를 사용했다. 하지만, Mac OS X Cheetah 및 Puma용 IOUSBFamily 소스 코드가 공개되지 않아, 디버깅에 어려움을 겪었다. 또한, AppleUSBOHCI는 IOPCIDevice를 필요로 하지만, Wii는 IOPCIFamily를 사용하지 않으므로, NintendoWiiHollywoodPCIDevice를 생성하여 문제를 해결했다. 마지막으로, 엔디안(Endianness) 문제를 해결하기 위해, IOUSBFamily의 소프트웨어 바이트 스와핑을 제거하여 USB 포트를 활성화했다.

Porting Mac OS X to the Nintendo Wii