- Infinite Mac이 브라우저에서 초기 Mac OS X를 실행할 수 있게 됐고, 현재 10.1과 10.3이 가장 잘 지원됨
- 기존 DingusPPC 경로가 커널 패닉과 그래픽 문제에 막히자, 2000년대 초 Mac OS X 에뮬레이션을 목표로 만든 PearPC 포팅으로 방향을 바꿈
- 성능은 여전히 느려 Mac OS X 10.2가 완전히 동작하기까지 거의 2분이 걸리고, 최적화로 줄인 시간도 약 15초 수준임
- PowerPC 부동소수점 처리의
FP비트 검사를 빠뜨린 버그가 Dock 렌더링과 Finder 창 문제를 일으켰고, 수정 과정에서 DingusPPC 안정성도 개선됨 - Infinite HD는 초기 Mac OS X 시대의 인디 소프트웨어와 Developer CD 도구를 담도록 재구성됐지만, HFS/HFS+ 차이와 오래된
.dmg호환성이 제약으로 남아 있음
브라우저에서 초기 Mac OS X 실행
- Infinite Mac은 이제 초기 Mac OS X를 실행할 수 있음
- Mac OS X 10.1과 Mac OS X 10.3이 가장 잘 지원되는 버전임
- 실행 속도는 빠르지 않지만, 당시 실제 하드웨어도 크게 더 낫지는 않았다는 체감에 가까움
- 시대에 맞는 소프트웨어를 함께 제공하는 Infinite HD도 초기 Mac OS X 시기 인디 소프트웨어 중심으로 다시 구성됨
PearPC 포팅으로 방향 전환
- 처음에는 DingusPPC로 Mac OS X를 Infinite Mac에서 실행하려 했지만, 지난여름쯤 커널 패닉과 그래픽 깨짐에서 더 나아가지 못함
- 결정적 실행 모드로 문제 범위를 줄여보려 했으나 다음 단계가 분명하지 않았음
- 대안으로 PearPC를 선택함
- PearPC는 2000년대 초 x86 Windows와 Linux 머신에서 Mac OS X를 에뮬레이션하기 위해 만들어짐
- Intel 전환 이후 관심이 줄었고, 사실상 멈춘 코드베이스로 취급돼 왔음
- kanjitalk755가 현대 macOS에서 빌드·실행되는 PearPC 실험 브랜치를 만들어둔 점이 포팅의 출발점이 됨
- PearPC는 다중 플랫폼 코드베이스였고, 스레드처럼 포팅이 까다로운 개념을 광범위하게 쓰지 않아 WebAssembly/Emscripten 및 Infinite Mac 런타임으로 옮기기 쉬웠음
- 며칠 동안 빌드, 비디오 출력, 디스크 이미지 로딩, 마우스·키보드 입력 연결까지 진행함
- 결과적으로 Mac OS X 10.2를 브라우저에서 이전보다 더 안정적으로 실행할 수 있게 됨
성능 최적화와 남은 병목
- PearPC는 Mac OS X 10.2를 더 안정적으로 실행했지만 DingusPPC보다 느리게 느껴짐
- DingusPPC의 벤치마크 하네스를 PearPC로 옮기고, 기존 DingusPPC 최적화 작업을 PearPC에도 반복 적용함
- 두 에뮬레이터는 모두 조회 테이블 기반의 순수 인터프리터라 작업은 비교적 직접적이었음
- Mac OS X 10.2 부팅 시간에서 약 15초를 줄임
- 최적화 후에도 완전히 동작 가능한 상태까지 거의 2분이 걸림
- Infinite Mac UI에는 Mac OS X 부팅이 느릴 수 있다는 안내를 추가함
- 가장 큰 병목은 PearPC의 MMU 캐시 부재임
- 모든 load/store가 복잡한 주소 계산을 거쳐 비싸게 처리됨
- DingusPPC에는 더 성숙한 계층형 캐시가 있어 효과적으로 보임
- PearPC는 10.2~10.4 실행에서 DingusPPC보다 안정적일 수 있지만, 코드베이스는 덜 원칙적임
- 커스텀 펌웨어와 비디오 드라이버를 사용함
- Mac OS X에 필요한 PowerPC 명령어 일부만 구현함
- 장기적으로는 DingusPPC가 빠르고 안정적이며 정확한 선택지가 되기를 기대함
FP 비트 검사와 렌더링 버그
- PearPC 인터프리터에 “통합 디코딩 테이블” 방식을 opcode 계열별로 적용하던 중, 부동소수점 연산 변경에서 회귀가 발생함
- Dock 렌더링 글리치가 생김
- Finder 창이 열리지 않음
- opcode 그룹 59와 63의 디스패치는 단순 조회만 하지 않고 Machine State Register의
FP비트를 먼저 확인해야 했음FP비트가 설정되지 않으면 “floating point unavailable” 예외를 던짐
- 당시 Mac에 쓰인 PowerPC 칩에는 FPU가 있었지만, Mac OS X 시작 중 해당 예외가 자주 발생함
- 당시 xnu 커널 소스에는
FP비트를 지우는 위치와 예외 핸들러가 있음 - 문맥 전환 때 FPU 레지스터 저장·복원을 피하려는 최적화로 보임
- 당시 xnu 커널 소스에는
- 최적화된 디스패치 코드에도 같은
FP검사를 구현하자 렌더링 문제가 사라짐 - 같은 버그는 DingusPPC에도 남아 있었음
- DingusPPC는
FP비트를 확인하지 않고 부동소수점 명령을 항상 통과시켰음 - 빠른 수정으로 예외를 발생시키자 Mac OS X 렌더링 글리치가 사라짐
- 이후 정식 구현과 성능 저하 회피 수정이 들어가면서 DingusPPC 안정성이 크게 좋아짐
- DingusPPC는
- 두 에뮬레이터를 조합하면서 실행 가능한 초기 Mac OS X 범위가 넓어짐
- DingusPPC는 10.1을 안정적으로 실행할 수 있음
- PearPC는 10.1을 안정적으로 실행하지 못함
- 10.0은 여전히 불안정하고 Public Beta는 즉시 커널 패닉이 발생함
Infinite HD 재구성
- Infinite Mac의 매력 중 하나는 시대에 맞는 소프트웨어를 담은 Infinite HD가 함께 마운트된다는 점임
- Mac OS X 지원에 맞춰 80~90년대 클래식 Mac 앱을 넘어 초기 Mac OS X 시대 소프트웨어를 담은 별도 버전을 만듦
- 개인적으로 선호하던 앱 외에도 제안을 받아 목록을 확장함
- 디스크 이미지는 기존 자동화 방식을 확장해 생성함
- 초기 Mac OS X 시기에는 디스크 이미지 사용이 매우 많았기 때문에
.dmg를 생성 이미지 안의 추가 폴더로 가져오는 기능을 추가함
- 초기 Mac OS X 시기에는 디스크 이미지 사용이 매우 많았기 때문에
- 오래된
.dmg는 확장자가 같아도 여러 변형이 있어 현대 macOS의hdiutil로 항상 마운트되지 않았음- 최종적으로 dmg2img로 raw 파티션을 먼저 추출함
- 이후 현대 macOS가 마운트하고 복사할 수 있는 새 디스크 이미지를 다시 만드는 우회 방식을 사용함
- 실제 소프트웨어 수집에서는 초기~중기 2000년대 Mac OS X 소프트웨어가 사각지대였음
- Macintosh Garden에도 일부가 있지만 우선순위는 높지 않음
- 원 벤더에서는 너무 오래돼 내려간 경우가 많음
- Wayback Machine을 많이 사용함
- 각 Mac OS X 버전의 동반 Developer CD도 설치해 Project Builder와 Interface Builder 같은 도구를 사용할 수 있게 함
파일 시스템과 다중 디스크 마운트
- 디스크 빌드 과정은 HFS 중심이지만, 해당 시기의 기본은 HFS+였음
- HFS+는 더 긴 파일명과 임의 Unicode 문자를 포함하는 등 더 고급 기능을 제공함
- HFS+ 기능에 의존하는 디스크 이미지 파일은 손실 없이 변환되지 않음
- 대부분의 소프트웨어에서는 큰 문제가 되지 않았음
- 부팅 디스크, Infinite HD, Saved HD까지 최대 3개 드라이브를 마운트하기 위해 DingusPPC 포크의 방식을 빌림
- 시작 시 지정된 임의 개수의 파티션 이미지로부터 다중 파티션 디스크 이미지를 즉석에서 생성함
Aqua 모드와 사이트 UI
- Mac OS X 추가를 완성하기 위해 Infinite Mac 사이트 컨트롤에도 Aqua 모드를 추가함
- 기존에는 classic, Platinum, NeXT 외형이 있었음
- Aqua 디자인 중 10.0/10.1 스타일을 선택함
- 10.3과 10.4의 더 절제된 버전을 선호하지만, 10.0/10.1 쪽의 향수가 더 크다고 판단함
- OS와 같은 이미지 자산을 쓰기 위해 스크린샷 대신 원본 리소스를 추출함
- Aqua 자산은 반투명 요소를 많이 쓰기 때문에 일반 스크린샷으로는 충분하지 않았음
- resource_dasm와 pxm2tga를 사용해
Extras.rsrc에서 원본 자산을 추출함
Classic 실행, verbose 모드, 작은 발견들
- 여러 이미지를 마운트할 수 있어 Mac OS 9 파티션을 함께 두고 Classic 호환 환경을 시작할 수 있음
- 이 기능은 10.1에서만 동작함
- PearPC는 Classic을 지원하지 않았음
- 결과적으로 WebAssembly 가상 머신 안의 에뮬레이션된 Mac OS X 안에서 클래식 Mac 앱을 에뮬레이션할 수 있음
- Mac OS X 이미지로 Calculator 동작 변화도 확인할 수 있음
- 10.3까지는
=를 반복해서 누르는 동작이 없었음 - 10.4에는 해당 동작이 있었음
- 10.3까지는
- Mac OS X 부팅이 느려 진행 상황을 더 보여주기 위해 verbose 모드를 노출함
- PearPC에는 내장 방식이 있었음
- DingusPPC에는 Open Firmware 변수를 시작 시 지정하는 기능을 추가함
- Infinite Mac의 커스텀 인스턴스 대화상자에는 “Debug Mode” 스위치로 노출됨
macosx.app도메도 확보하려 했지만 이미 등록돼 있었음- 해당 도메인은 특정 YouTube 영상으로 리디렉션됨
- 영상의 YouTuber는 자신이 등록한 것이 아니라고 답함
다음 후보와 QEMU 가능성
- Mac OS X 지원으로 Infinite Mac은 현대 macOS에 가까운 지점까지 도달함
- 이후에도 두 번의 CPU 전환과 여러 작은 변화가 남아 있음
- Tiger는 현재 macOS 사용자에게도 기본적으로 알아볼 수 있는 형태임
- 더 깊거나 더 특수한 복고 컴퓨팅 대상으로는 A/UX, Lisa, Pippin, Newton이 남아 있음
- 예전에는 QEMU를 WebAssembly로 포팅하기에 너무 큰 프로젝트로 봤고, qemu.js 성능도 사용 가능성이 낮아 보였음
- 최근 qemu-wasm과 FOSDEM 발표를 통해 가능성을 다시 확인함
- Linux 게스트 데모 성능이 고무적임
- 100MB 데이터의 MD5 체크섬을 계산하는 즉석 벤치마크에서 qemu-wasm은 8초, DingusPPC는 13초, PearPC는 18초가 걸림
- 그래픽 게스트인 Mac OS X와는 여전히 큰 간극이 있음