x86 아키텍처 기반 애플리케이션을 ARM 프로세서에서 에뮬레이션할 때 발생하는 고질적인 문제의 근원은 바로 메모리 모델의 차이에 있습니다. x86은 '전체 저장 순서(Total Store Ordering, TSO)'라는 매우 엄격한 메모리 모델을 따르는 반면, ARM은 '완화된(relaxed)' 또는 '약한(weak)' 일관성 모델을 사용합니다. 이 근본적인 차이 때문에 x86 에뮬레이션은 성능 저하와 복잡성이라는 큰 난관에 부딪히게 됩니다.
x86 TSO 모델은 프로그래머가 메모리에 데이터를 쓸 때, 해당 쓰기 작업이 시스템 내 모든 프로세서에 즉시 일관되게 보이는 것을 보장합니다. 즉, 메모리 로드(읽기)가 발생하기 전에 모든 이전 저장(쓰기) 작업이 논리적으로 완료되거나 가시화된다고 가정할 수 있습니다. 이는 프로그래머의 직관과 일치하여 코딩을 쉽게 만들지만, 하드웨어 최적화 여지는 적습니다. 반면 ARM의 약한 메모리 모델은 기본적으로 메모리 로드 및 저장이 시스템 내 다른 프로세서에 즉시 일관적으로 보이지 않을 수 있도록 허용하여, CPU가 더 효율적으로 작동할 수 있게 합니다. 이는 캐시 일관성을 유지하는 데 드는 비용을 절감하여 전력 효율성을 높이지만, 멀티스레드 환경에서는 예측 불가능한 동작을 초래할 수 있습니다. ARM은 이러한 일관성 문제를 해결하기 위해 '로드-획득(load-acquire)' 및 '저장-해제(store-release)'와 같은 메모리 장벽(memory barrier) 명령어를 도입하여 특정 상황에서 메모리 순서를 강제합니다.
FEX 에뮬레이터 개발팀은 ARMv8.0-a에서 x86 TSO를 에뮬레이션하기 위해 모든 x86 메모리 로드를 ARM의 로드-획득 명령어로, 모든 x86 메모리 저장을 저장-해제 명령어로 변환하는 방식을 사용합니다. 이 방법은 x86과 유사한 메모리 의미론을 제공하지만, 실제로는 x86이 요구하는 것보다 더 엄격하게 동작하여 불필요한 비용을 발생시킵니다. ARM CPU는 이러한 획득/해제 명령어가 자주 실행되도록 설계되지 않았기 때문에, x86 TSO를 에뮬레이션하는 것은 상당한 성능 저하를 초래합니다. 이는 에뮬레이션이 단순히 명령어 하나하나를 번역하는 것을 넘어, 하드웨어 아키텍처의 근본적인 차이까지 극복해야 하는 복잡한 문제임을 시사하며, 특히 고성능 컴퓨팅 환경에서 에뮬레이션의 한계를 명확히 보여줍니다.