2016-12-07 1 views
2

Bochs 및 QEMU와 같은 에뮬레이터의 작동 방식을 연구 중이며 질문이 있습니다. x86 호스트에서 x86 게스트 운영 체제를 에뮬레이트하고 게스트가 레지스터 (예 : mov eax 3)를 할당하는 일부 명령을 실행하면, 에뮬레이터가 실행하는 코드에서 실제 하드웨어의 eax 레지스터에 실제로 값이 할당된다는 보장이 있습니까?QEMU는 x86 에뮬레이션 용 게스트 레지스터와 동일한 호스트 레지스터를 사용합니까?

QEMU 프로세스는 자체 프로세스이므로 (일반 용도의 레지스터를 다른 프로세스와 공유 할 필요가 없으므로) 그리고 호스트와 게스트 아키텍처는 동일하므로 동일한 범용 레지스터를 사용합니다.

또한, 나는 두 개의 명령어가 그 QEMU에서 프로그램을 실행 인 경우 : 그것은 이렇게하면 변경하지 않을 것이라고 판단 할 수 있다면

mov eax 3 
add eax 2 

그것은 단지 하나의 mov eax, 5 명령으로 두 가지를 결합 할 것인가를 프로그램의 각 명령 대신에 명령 블록을 개별적으로 실행하여 프로그램을 실행하기 때문에?

여기서는 하드웨어 가상화가 아닌 순수한 에뮬레이션 (Bochs 또는 non-KVM QEMU)을 언급합니다.

+3

을 86 또는 64에 86를 모방의 특정 경우, 예, 그것은 가능성이 높다. 프로세서에는 자체 프로세서를 구현하는 것보다 쉽게 ​​구현할 수있는 기능이 내장되어 있습니다. 작업 상태 전환. 그러나 두 번째 부분은 에뮬레이션보다 코드 최적화에 더 중점을 둡니다. 아닙니다. 에뮬레이터는 절대로 스왑을 선택하지 않습니다. 잠재적으로 모든 종류의 것들을 망칠 수 있습니다. –

+2

non-kvm'qemu-x86_64-static'은 x86 에뮬레이션에서 특별한 경우가 아니라면 전혀 다른 코드를 생성합니다. 놀랍게도'mov '+'add' 조합을 최적화하는 것이 현명합니다. 'qemu-x86_64-static -d in_asm, out_asm test.elf'를 사용하여 실행할 수 있으며 직접 확인하십시오. – Jester

+2

BOCHS는 디스패치 루프가 있고 동적 재 컴파일이없는 순수한 인터프리터 에뮬레이터입니다. "Bochs가 어떻게 작동하는지 보는 방법"링크 (사이트의 첫 페이지에 있음) (http://bochs.sourceforge.net/). 적어도 에뮬레이션 방법에 대해서는 최대한 빨리 실행하는 멋진 트릭을 사용합니다 . –

답변

6

아니요, QEMU는 그런 식으로 작동하지 않습니다. x86-x86은 특별한 경우가 아니며 에뮬레이션의 다른 게스트/호스트 조합처럼 처리됩니다. 모든 게스트 코드는 먼저 중간 표현으로 변환됩니다. 그런 다음 간단한 최적화 단계가 실행됩니다 (여기서 '로드 2, 추가 3'은 '로드 5'로 단순화됩니다). 마지막으로 할당을 등록하고 IR에서 기본 호스트 코드를 생성합니다.

IR 게스트 레지스터는 "TCG 값"으로 표현됩니다.이 TCG 값은 상위 수준 언어에서 비슷한 변수입니다. 게스트 레지스터는 호스트 메모리의 CPU 상태 구조에있는 값으로 정의되지만 TCG는 실제로 필요할 때까지 메모리에 다시 쓰지 않을 정도로 똑똑하기 때문에 게스트 레지스터의 '라이브'복사본은 호스트 레지스터에 있어야합니다. 그러나 레지스터 할당은 완전히 별개의 코드 비트이므로 할당자가 원래 사용 된 것과 동일한 x86 레지스터를 선택하는 일은 거의 없습니다.

이와 같이 IR을 사용하는 것은 컴파일러 또는 JITs (및 TCG QEMU는 JIT)에 대한 매우 일반적인 디자인 패턴입니다. 장점은 생각해야 할 다양한 조합의 수가 폭발하지 않으면 서 다수의 프론트 엔드 및 백엔드를 지원하는 것이 쉽다는 점입니다. QEMU는 현재 18 개의 프론트 엔드와 9 개의 백엔드를 지원합니다. 또한 일반적인 최적화 (별도의 add 명령어를 제거한 상수 폴딩과 같은)는 IR에서 순전히 작동하면 한 번만 구현하면됩니다.

TCG의 IR 여기에 설명되어 있습니다 : http://wiki.qemu.org/Documentation/TCG

관련 문제