2015-01-05 6 views
4

VMCALL은 SYSENTER 명령어와 매우 유사합니다. SYSENTER는 시스템 호출 (OS 로의 빠른 전환)을위한 방법과 달리 VMCALL은 하이퍼 콜용입니다 (하이퍼 바이저로 전환).x86에서 VMCALL 명령어가 게스트 CPU 상태를 저장합니까?

내 질문에 SYSENTER는 CPU 상태를 저장하지 않지만 VMCALL에도 동일하게 적용됩니다. VMCALL을 실행하면 VM 종료가 발생하지만 게스트 CPU 상태를 관련 VMCS 구조에 저장할지 여부는 확실하지 않습니다.

CPU 상태를 저장하면 하이퍼 콜에서 인수를 얼마나 정확하게 전달할 수 있습니까?

답변

2

VMCS 영역은 6 개의 영역으로 나누어지고, 그 중 하나는 게스트 - 상태 영역입니다.

게스트 상태는 모든 VMExit에 RIP, RFLAGS 및 RSP를 저장합니다. 나머지 게스트 GPR은 VMExit 직후에 HW에 있습니다.

VMCALL은 무조건 VMExit 만 발생시킵니다. 인수로서의 레지스터의 사용은 VMM의 API에 맡겨진다. Linux KVM API documentation에서

:

최대 4 개의 인수는 각각 RBX, RCX, RDX, 및 RSI에 전달 될 수 있습니다. hypercall 번호는 rax에 넣고, 반환 값은 으로 rax에 넣습니다. 특정 하이퍼 콜에 의해 명시 적으로 언급되지 않는 한 다른 레지스터는 clobbered되지 않습니다. Intel 64 and IA-32 Architectures Software Developer’s Manual에서

:

이 명령은 적절한 출구 이유를 등록하여 VM 종료, 의 원인이보다 더 아무것도하지 않습니다.

위에서 VMCALL은 CPU 상태를 유지하지 않는다고 결론을 내 렸습니다.

+0

의미가 있습니다. 소프트웨어에 레지스터 저장/복원을 남겨 두는 것이 사물을 설계하는 분명한 방법입니다. 그렇지 않으면 레지스터 저장 영역을 가리 키도록 제어 레지스터가 필요합니다. 그래서'vmcall'을 사용하는 것은'syscall'을 사용하는 것과 같습니다; 당신은 당신이 부르는 ABI를 알아야합니다. –

+0

VM 종료가 레지스터 상태를 저장합니까? Intel 수동 VMCS 게스트 영역의 일반 레지스터 필드를 찾을 수 없습니다. – qstack

+0

@qstack VMM 자체에서 수행해야합니다. 덕분에 – RostakaGmfun