하드웨어 리버스 엔지니어링 방법론
Apple Silicon 하드웨어는 문서화되어 있지 않기 때문에, Asahi Linux 팀은 m1n1이라는 소형 C 애플리케이션을 개발하여 UART를 통한 Python 셸 프록시를 제공했습니다. 이 도구를 통해 개발자들은 타겟 장치의 하드웨어 레지스터를 실시간으로 조작하고 결과를 확인할 수 있어, 드라이버 프로토타이핑 및 디버깅 시간을 획기적으로 단축했습니다.
더 복잡한 하드웨어(예: GPU)의 경우, m1n1을 하이퍼바이저로 활용하여 Apple의 운영체제인 XNU를 가상 머신 내에서 실행하는 ‘동적 트레이싱’ 기법을 사용했습니다. 이를 통해 XNU가 하드웨어(MMIO)에 접근하는 모든 동작을 로깅하고 분석하여, 어떤 레지스터가 어떤 역할을 하는지 점진적으로 파악하고 드라이버를 개발할 수 있었습니다. 이는 소프트웨어의 strace와 유사하게 하드웨어의 동작을 추적하는 효과적인 방법입니다.
USB 포트 리버스 엔지니어링 과정
USB 포트 지원은 특히 복잡한 과제였습니다. USB 1/2/3, USB4(Thunderbolt 기반), DisplayPort 등 여러 프로토콜이 USB-C 커넥터를 통해 지원되어야 하기 때문입니다. 하드웨어적으로는 USB 2를 위한 별도 레인, 고속 데이터 전송을 위한 SSTX/RX 레인, 그리고 프로토콜 및 전력 협상을 위한 CC 라인과 USB Power Delivery (PD) 컨트롤러가 필요합니다.
발표자는 Synopsys DesignWare 컨트롤러 v3를 사용하고 있음을 파악하고, 공개된 데이터시트 및 Linux 드라이버를 참조하여 USB 2 가젯 모드를 구현했습니다. 그러나 초기에는 USB 장치를 한 번 연결하면 다음 연결 시 작동하지 않는 문제가 발생했습니다. XNU의 동작을 트레이싱한 결과, USB 장치 분리 시 Apple의 컨트롤러가 전체 USB 컨트롤러와 포트를 하드 리셋하고 클럭을 게이팅(완전히 전원을 끔)하는 것을 발견했습니다. 이는 컨트롤러가 한 번 초기화되면 다시 초기화될 수 없다는 설계 때문이었으며, 매번 장치 분리 시 전체 시스템을 재설정하는 로직을 Linux 드라이버에 구현하여 이 문제를 해결했습니다.
이러한 과정을 통해 USB 3 지원이 Linux 커널에 업스트림되었으며, 최근에는 DisplayPort 지원도 개발자용으로 공개되어 외부 디스플레이 연결이 가능해졌습니다. 이는 Yan의 노력으로 이루어진 큰 성과입니다.
M3, M4, M5 칩 지원 현황 및 과제
현재 프로젝트는 기존 드라이버의 업스트림에 집중하고 있지만, M3, M4, M5 칩에 대한 지원도 진행 중입니다. M1과 M2, M3 간의 하드웨어 변경 사항은 대부분 미미하여 기존 드라이버를 기반으로 포팅이 비교적 수월합니다. 그러나 GPU는 지속적인 혁신이 이루어지는 부분으로, M3 GPU 지원에는 상당한 작업이 필요할 것으로 예상됩니다. 최근 새로운 기여자가 M3 Max에서 기본적인 부팅 및 스토리지 작동을 성공시켰습니다.
M4 및 M5 칩에서는 Apple이 ‘guarded levels’라는 새로운 ARM 확장 기능을 도입하여, 기존의 XNU 가상화 및 MMIO 트레이싱 도구를 사용할 수 없게 되었습니다. 이는 리버스 엔지니어링 과정을 훨씬 어렵게 만들지만, Apple은 여전히 ‘raw boot objects’를 통해 사용자가 커스텀 코드를 EL2(최고 권한 레벨)에서 실행할 수 있도록 허용하고 있어 Linux 포팅 자체는 여전히 가능합니다. 다만, 새로운 리버스 엔지니어링 접근 방식이 필요합니다.