본문으로 건너뛰기
피드

Mac OS X를 닌텐도 Wii에 포팅한 이야기 — 부트로더부터 USB 드라이버까지

open-source 약 8분
vote
0
댓글
북마크

Mac OS X 10.0 Cheetah를 닌텐도 Wii에서 네이티브로 구동하는 데 성공한 프로젝트. 커스텀 부트로더 작성, XNU 커널 패치, Hollywood SoC용 IOKit 드라이버 개발, 듀얼 프레임버퍼(RGB→YUV 변환), USB 지원까지 전 과정을 상세히 다룸.

  • 1

    Wii의 PowerPC 750CL CPU가 G3 맥과 같은 계열이라 포팅 가능성이 있었음

  • 2

    Open Firmware/BootX 대신 커스텀 부트로더를 밑바닥부터 작성

  • 3

    Wii 전용 Hollywood SoC에 맞는 IOKit 드라이버를 직접 구현 — SD 카드, 프레임버퍼, USB까지

  • 4

    YUV/RGB 불일치를 듀얼 프레임버퍼 전략으로 해결

  • 5

    IRC에서 구한 옛날 CVS 레포로 IOUSBFamily 소스 빌드에 성공하여 USB 입력 완성

  • Mac OS X 10.0 Cheetah를 닌텐도 Wii에서 네이티브로 돌렸다 — Linux, NetBSD, Windows NT에 이어 Wii에 포팅된 네 번째 OS. 2013년 대학교 2학년 때 아이디어만 품고 10년 넘게 묵혔다가 드디어 완성
    • 2021년 Reddit 댓글: "이게 될 확률은 0%다" → 오히려 동기부여가 됐다고 함

하드웨어 호환성 분석

  • Wii의 CPU는 PowerPC 750CL — G3 iBook/iMac에 쓰인 PowerPC 750CXe의 진화형이라 CPU 자체는 호환 가능성 높았음
  • RAM이 문제였음: Wii는 88MB인데 MEM1(24MB 1T-SRAM) + MEM2(64MB GDDR3)로 분리된 특이한 구조
    • Mac OS X Cheetah 공식 요구사항은 128MB지만, 비공식으로 더 적은 메모리에서도 부팅 가능
    • QEMU로 64MB RAM에서 Cheetah 부팅 테스트 → 문제없이 동작 확인

부트로더를 밑바닥부터 작성

  • 실제 맥은 Open Firmware → BootX → XNU 커널 순서로 부팅하는데, XNU가 돌기 시작하면 앞의 두 단계는 더 이상 필요 없음
    • Open Firmware나 BootX를 포팅하는 건 불필요한 삽질이라고 판단, Wii Linux 프로젝트처럼 커스텀 부트로더를 처음부터 작성
  • 부트로더가 해야 할 일: Wii 하드웨어 초기화 → SD 카드에서 커널 로드 → 디바이스 트리 생성 → 커널에 제어 넘기기
  • Mach-O 바이너리 포맷으로 된 XNU 커널을 메모리에 올리는 로더를 구현하고, 커널 진입점 주소로 점프하는 방식

중요

> 커널이 실행되면서 Wii 전용 하드웨어 설정을 덮어쓰기 때문에, 시리얼 디버깅이나 비디오 출력이 전부 꺼져버림. 이걸 해결하려고 커널 바이너리를 패치해서 Wii 전면 LED를 깜빡이게 만들어 "여기까지는 왔다"를 확인하는 방법을 씀

커널 패치와 빌드 환경

  • XNU는 Wii의 메모리 레이아웃(MEM1: 0x00000000, MEM2: 0x10000000)과 호환 안 되는 BAT(Block Address Translation) 설정을 함
    • 커널 소스를 직접 수정해서 Wii 메모리 레이아웃에 맞춤
  • 25년 된 OS 커널을 빌드하기 위한 개발환경이 꽤 기발함:
    • 모던 macOS 호스트에서 QEMU로 Mac OS X Cheetah 게스트를 돌림 (헤드리스)
    • NFS로 소스 코드 공유, SSH로 게스트 제어, 호스트에서 편집 → 게스트에서 빌드
  • BAT 패치 + USB Gecko로 콘솔 출력 리다이렉트 후, 가상 메모리·IOKit·BSD 서브시스템 모두 초기화 성공 — "Still waiting for root device"까지 도달

IOKit 드라이버 작성 — Hollywood SoC 대응

  • Wii는 PCI 버스가 아니라 Hollywood라는 커스텀 SoC를 사용함 → IOPCIFamily를 그대로 쓸 수 없어서 Hollywood용 드라이버를 직접 구현
    • Hollywood 드라이버가 디바이스 트리의 하위 노드를 순회하면서 nub(연결점)을 생성·발행
  • SD 카드 드라이버: IOBlockStorageDevice를 서브클래싱
    • Wii의 ARM 코프로세서(Starlet)에서 돌아가는 MINI와 IPC로 통신하여 SD 카드 읽기/쓰기 구현
    • 캐시된 메모리 버그가 까다로웠음 — ARM CPU가 RAM에 쓴 데이터를 PowerPC CPU가 캐시에서 읽어 stale 데이터를 받는 문제 → uncached 메모리 사용으로 해결
  • 프레임버퍼 드라이버: Wii의 비디오 하드웨어는 YUV 16bit를 기대하는데 Mac OS X는 RGB를 씀
    • Wii Linux 프로젝트에서 영감받아 듀얼 프레임버퍼 전략 적용: RGB 프레임버퍼(OS용) + YUV 프레임버퍼(디스플레이용), 초당 60회 변환

USB 지원 — 소스 코드 없는 디버깅의 고통

  • AppleUSBOHCI 드라이버를 쓰려 했는데 3가지 장벽:

    • Apple이 Cheetah/Puma용 IOUSBFamily 소스를 공개하지 않음 (다른 건 다 있는데!)
    • AppleUSBOHCI가 IOPCIDevice에만 붙게 되어 있어서, Wii의 Hollywood nub에 매칭 안 됨 → IOPCIDevice를 상속한 가짜 PCI nub을 만들어 우회
    • Wii는 하드웨어에서 바이트 스왑(reversed-little-endian)을 하는데, IOUSBFamily는 소프트웨어에서도 스왑 → 이중 스왑 문제 발생
  • Ghidra로 바이트 스왑 명령어를 수동 패치하려 했으나 실패 (비행기에서 몇 시간 삽질...)

    • 결국 IRC에서 옛날 CVS 레포를 구해서 IOUSBFamily를 소스에서 빌드 → USB 키보드/마우스 동작 성공
  • 최종 결과: Mac OS X Cheetah가 Wii에서 풀 데스크톱으로 부팅되고 USB 키보드/마우스로 조작 가능 — 하와이 여행 중에 Wii를 가져가서 마일스톤을 찍었다는 게 진짜 집념


기술 맥락

  • 이 프로젝트가 가능했던 핵심 이유는 Darwin/XNU가 오픈소스라는 거예요. 커널과 IOKit 드라이버 모델이 공개되어 있으니까, 하드웨어만 비슷하면 포팅 시도라도 해볼 수 있는 거거든요. 반대로 Quartz나 Finder 같은 GUI 계층은 닫혀 있지만, 커널만 돌아가면 그 위에 얹히는 구조라 별도 패치 없이 동작해요.
  • IOKit의 provider-client 모델이 이 프로젝트에서 핵심적인 역할을 했어요. 드라이버가 nub을 통해 체인처럼 연결되는 구조라, Hollywood SoC용 드라이버만 제대로 만들면 그 위에 SD 카드, USB 등을 쌓아올릴 수 있었거든요. PCI가 없는 환경에서 IOPCIDevice를 상속한 가짜 nub을 만든 건 꽤 창의적인 해킹이에요.
  • Wii의 reversed-little-endian 바이트 오더링 문제는 크로스 플랫폼 하드웨어 개발에서 자주 만나는 함정이에요. 하드웨어가 이미 엔디안 변환을 해주는데 소프트웨어도 변환하면 이중 스왑이 되는 건데, 소스 코드 없이 바이너리만으로 이걸 고치려다 실패한 게 오히려 교훈적이에요. 결국 소스 코드의 가치를 증명한 셈이죠.
  • 25년 된 커널을 빌드하기 위해 QEMU + NFS + SSH를 조합한 크로스 컴파일 환경 구성도 흥미로워요. 레거시 소프트웨어 빌드 환경을 재현하는 건 실무에서도 종종 마주치는 문제인데, 가상화로 당시 OS를 그대로 올리는 게 가장 확실한 방법이에요.

2013년부터 품어온 아이디어를 10년 넘게 묵혔다가, Windows NT의 Wii 포팅 소식에 자극받아 완성한 프로젝트. Darwin/XNU 오픈소스 덕에 가능했고, 소스 코드 없이 바이너리 패치로 해결하려다 실패한 USB 파트가 오히려 오픈소스의 가치를 증명함.

댓글

댓글

댓글을 불러오는 중...

open-source

위키피디아에도 빅테크식 반노조 플레이북이 들어왔다

위키미디어 재단이 5월 열흘 사이 MediaWiki 장기 핵심 개발자를 해고하고, 자원봉사 편집자 요청을 처리하던 Community Tech 팀을 해산했다는 비판 글이다. 해고된 인력 상당수가 노조 조직 활동과 연결돼 있었고, 위키피디아 편집자들은 연대 파업까지 거론하고 있다. 재단은 2억9660만 달러의 준비금과 빠르게 성장하는 AI 대상 API 매출을 갖고 있어, 이 사안이 단순 비용 절감으로 보기 어렵다는 게 글의 핵심이다.

open-source

캘리포니아, 연령 확인법에서 리눅스 빼려는 수정안 추진

캘리포니아가 운영체제에 사용자 나이 확인을 요구하는 법안에서 대부분의 오픈소스 운영체제를 제외하는 수정안을 추진 중이다. 데비안, 페도라, 우분투, 아치, 리눅스 민트 같은 배포판은 빠질 가능성이 커졌지만, 스팀OS처럼 독점 앱 생태계와 연결된 플랫폼은 여전히 애매한 상태다.

open-source

마이크로소프트, 45년 전 86-DOS 소스코드를 오픈소스로 공개

마이크로소프트가 86-DOS 1.00 출시 45주년에 맞춰 지금까지 발견된 것 중 가장 오래된 DOS 소스코드를 공개했어. 팀 패터슨의 차고에 있던 도트 매트릭스 출력물을 스캔하고 옮겨 적어, 원본 바이너리와 바이트 단위로 동일하게 다시 컴파일되는 수준까지 복원한 게 포인트야.

open-source

밤부 랩, AGPLv3 위반 논란으로 오픈소스 커뮤니티와 충돌

3D 프린터 제조사 밤부 랩이 AGPLv3 라이선스 위반 논란에 휘말렸고, Software Freedom Conservancy가 두 건의 위반 사례를 확인했다는 내용이야. Louis Rossmann과 Gamers Nexus는 관련 개발자의 법적 방어를 위해 2만달러를 기부했고, 갈등의 핵심은 오픈소스 기반 생태계를 클라우드와 DRM으로 점점 닫아가려는 움직임이야.

open-source

플리퍼, 리눅스 기반 확장형 기기 '플리퍼 원' 공개

플리퍼가 기존 플리퍼 제로를 대체하는 후속작이 아니라, 리눅스 기반 네트워킹·확장형 기기인 플리퍼 원을 공개했어. RK3576 8코어 ARM 칩, 와이파이 6E, 듀얼 이더넷, NVMe, HDMI 4K 120Hz까지 넣으면서 장난감 같은 해킹 도구에서 훨씬 범용적인 리눅스 장비 쪽으로 방향을 넓히는 그림이야.