QEMU 에뮬레이션의 핵심 원리
QEMU의 시스템 에뮬레이션은 가상 머신(CPU, 메모리, 에뮬레이트된 디바이스)의 모델을 제공하여 게스트 운영체제를 실행합니다. 에뮬레이션 엔진으로 KVM, Xen 등의 하이퍼바이저나 소프트웨어 기반의 JIT 컴파일러인 TCG(Tiny Code Generator)를 선택할 수 있습니다. TCG는 호스트 플랫폼의 제약 없이 x86, ARM, MIPS, PowerPC, RISC-V 등 다양한 CPU 아키텍처를 에뮬레이션할 수 있습니다.
동적 바이너리 변환(Dynamic Binary Translation, DBT) 메커니즘
TCG는 게스트 코드를 처음 만날 때 이를 호스트 명령어 세트로 변환합니다. 변환은 기본 블록(Basic Block) 단위로 수행되며, 각 블록은 분기 명령어나 예외 진입점에서 종료됩니다. 번역된 블록은 RISC 유사 중간 표현(Intermediate Representation, IR)으로 변환된 후 호스트 백엔드에서 네이티브 코드로 생성됩니다. 이 두 단계 변환 방식은 새로운 호스트/게스트 아키텍처 조합을 비교적 쉽게 추가할 수 있도록 설계되었습니다.
성능 최적화 기법
번역 블록은 CPU 상태 정보(프로그램 카운터, 권한 레벨, 플래그 등)와 함께 캐시되어, 동일한 CPU 상태에서 반복 실행되는 코드의 재번역을 방지합니다. 직접 블록 체이닝(Direct Block Chaining)은 이전 블록이 다음 블록으로 직접 점프하도록 패칭하여 PC 룩업 오버헤드를 제거합니다. 메모리 관리 유닛(MMU) 에뮬레이션을 위해 물리 주소 기반 TLB 캐시를 사용하여 주소 변환을 가속합니다.
실무 고려사항
자체 수정 코드(Self-Modifying Code) 처리는 사용자 모드에서는 페이지 쓰기 보호를 통해, 시스템 에뮬레이션에서는 소프트웨어 MMU를 통해 구현됩니다. 예외 처리는 호스트 SIGSEGV/SIGBUS 시그널 핸들러와 호스트 프로그램 카운터에서 게스트 프로그램 카운터로의 매핑을 사용합니다. TCG는 게스트의 부동소수점(FPU) 명령어를 소프트웨어로 에뮬레이션하거나 호스트 FPU를 직접 활용할 수 있습니다.