ARM 하이퍼바이저 디버깅기: NX 비트의 숨은 역할

Key Point
ARM 하드웨어의 세부 구현이 표준을 벗어날 때 발생하는 미묘한 버그와 메모리 속성(NX 비트, 캐시 정책)이 코드 실행에 미치는 영향을 이해하는 데 필수적인 실제 사례입니다.
핵심 요약
- ARM64 베어메탈 하이퍼바이저 개발 중 CTR_EL0 인터셉트를 활성화하면 시스템이 무작위로 잠기는 버그가 발생했습니다.
- 초기 의심 대상들을 하나씩 검증했으나 예외 핸들러는 정상 작동했고, 실제 하드웨어에서만 레지스터가 수정되지 않았습니다.
- 원인은 실행 가능한 머신 명령어가 담긴 버퍼를 정렬할 때 ARM의 I캐시/D캐시 비일관성(cache incoherency) 문제로, 캐시된 명령어가 메모리의 새로운 데이터와 불일치했습니다.
- 이후에도 시스템이 부팅하지 않았으므로, MRS 명령어를 처리하는 C 핸들러 함수를 어셈블리로 재작성했을 때 문제가 해결되었습니다.
- 최종적으로 이진 bisecting을 통해 논리적으로 동등한 두 코드 버전 중 하나만 작동하는 현상을 추적했고, NX 비트(실행 방지 비트) 설정이 데이터 섹션의 코드 실행을 막으면서 예상치 못한 동작을 유발했음을 암시합니다.