애플 M4에서 리눅스 부팅하기: 절전 모드만 들어가면 레지스터를 지워버리는 CPU와의 사투

애플 M4에서 리눅스 부팅하기: 절전 모드만 들어가면 레지스터를 지워버리는 CPU와의 사투

LinuxApple Silicon오픈소스M4

데이터 소스:yuka.dev + Asahi Linux 社区

2024년 11월, 개발자 Yureka Lilian은 M4 칩을 탑재한 맥 미니를 구입했다. 이전 세대 애플 실리콘들이 빠르게 공략되던 속도를 떠올리면, 새 머신에 오픈소스 운영체제를 올리는 일도 머지않아 보였다. 하지만 CPU의 모든 코어를 정상 구동하여 명령줄 인터페이스(CLI)로 진입하기까지는 무려 17개월이라는 긴 시간이 걸렸다.

가상 머신의 감시 센서를 차단한 애플

지난 몇 년간 오픈소스 커뮤니티는 애플 실리콘을 역공학하는 검증된 방식을 정립해 왔다. 특수 제작한 가상 머신(하이퍼바이저) 환경에서 macOS를 실행하고, 시스템 드라이버와 하드웨어가 주고받는 MMIO(메모리 매핑 입출력) 흔적을 추적하는 방식이었다. 시스템이 하드웨어에 어떻게 명령을 내리는지 관찰한 다음, 그 동작을 리눅스로 옮겨 적기만 하면 되었다.

그러나 M4에 이르러 애플은 불을 꺼버렸다. 이 칩셋은 커널 보안을 강화하기 위해 SPTM(Secure Page Table Monitor) 구조를 강제 적용했고, 메모리 입출력 궤적을 수집하던 기존 기법은 완전히 무력화되었다. 시스템을 가상 머신 위에서 띄우려면 저수준 아키텍처를 대대적으로 뜯어고쳐야 했다. 결국 오픈소스 개발진은 아무런 문서도 없는 완전한 블랙박스와 정면으로 부딪혀야 했다.

Sven Peter의 마스토돈 게시물 스크린샷 그림: 2025년 4월 Sven Peter가 마스토돈에 남긴 게시글. 출처: yuka.dev

단 하나의 문자 출력으로 지뢰를 밟아가며 디버깅하다

정교한 분석 도구가 무력화되자 개발자들은 가장 원초적인 시행착오로 돌아갈 수밖에 없었다. M4 환경에서 부트로더인 m1n1은 가장 기초적인 브링업(BRINGUP) 모드로만 기동되었다. 특정 하드웨어를 초기화하거나 올바른 리셋 베이스 주소에 값을 쓰기만 해도 장치는 곧바로 뻗어버렸다.

Yureka Lilian은 가장 단순한 어셈블리 코드를 들고나왔다. 단 한 글자의 a만을 콘솔에 출력하도록 수정한 루틴을 커널 부팅의 가장 첫 단계에 끼워 넣었다. 이 코드의 위치를 조금씩 옮겨가며 이진 탐색으로 범위를 좁힌 끝에, 충돌을 일으키는 구체적인 명령어를 마침내 찾아냈다. 이 디버깅 과정에서 드러난 잠긴 레지스터 문제는 이후 애플의 펌웨어 업데이트를 통해 조용히 해결되었다.

M4에서 최초로 셸 부팅에 성공한 터미널 스크린샷 그림: M4 맥 미니에서 리눅스가 처음으로 셸 진입에 성공한 화면. hyfetch에 호스트가 Apple Mac Mini (M4, 2024)로 표시되어 있다. 출처: yuka.dev

슬립 진입 시 레지스터를 강제로 비워버리는 하드웨어

초기 부팅 단계의 충돌은 시작에 불과했다. 개발자들의 발목을 제대로 잡은 것은 아키텍처 상식에 정면으로 위배되는 M4 칩의 하드웨어 동작이었다.

초기 M 시리즈 칩에는 숨겨진 스위치가 존재했다. 인터럽트를 기다리는 대기(슬립) 명령어가 실행되면 CPU가 32개의 범용 레지스터 데이터를 전부 0으로 밀어버리는 구조였다. 당시 리눅스 개발자들은 더 깊은 절전 상태와 전력 절감을 얻기 위해 이 스위치를 직접 켜고, 슬립 진입 직전과 직후에 레지스터 상태를 수동으로 백업하고 복원하도록 코드를 짰다.

멀티코어 부팅 성공 후 시스템 정보 스크린샷 그림: M4에서 모든 코어를 활성화하고 셸 진입에 성공한 후 확인한 시스템 정보. 출처: yuka.dev

하지만 애플은 M4에서 이 레지스터 초기화 동작을 끌 수 없는 기본 하드웨어 사양으로 고정해 버렸다. 이는 대기 명령어가 아키텍처 상태를 유실시켜서는 안 된다고 명시한 ARM64 공식 표준 규격을 정면으로 거스르는 설계다. 개발진은 깜깜한 어둠 속에서 수많은 실험을 거친 뒤에야, 이 CPU가 잠깐 졸기만 해도 레지스터의 기억을 강제로 날려버린다는 사실을 확인할 수 있었다.

NOP 명령어로 하드웨어의 벽을 우회하다

이처럼 기형적인 하드웨어 설계에 맞서 커뮤니티가 내놓은 해결책은 명쾌했다. 2026년 4월, 개발자들은 커널 내부의 모든 슬립 명령어를 아무 일도 하지 않는 NOP(No Operation) 명령어로 대체했다. 마침내 M4의 모든 코어가 멈추지 않고 돌아가기 시작했다.

개발진은 다른 아키텍처에 악영향을 줄 수 있는 임시방편 패치 대신, 리눅스 메인라인 커널에 초기 부팅 옵션을 제출하여 슬립 명령어를 선택적으로 우회할 수 있도록 조치했다. 애플은 비공개 하드웨어 동작으로 거대한 장벽을 세웠지만, 오픈소스 커뮤니티는 끈질긴 시행착오 끝에 문서 없는 블랙박스를 해독해 냈고 업스트림 커널에 특수 예외 처리를 반영시키는 쾌거를 이루었다. 폐쇄적인 반도체 요새를 상대로 거둔, 순수한 인내심의 승리였다.

참고 링크:

  • yuka.dev 블로그 기록
  • Asahi Linux 커뮤니티 소식