개요
Virtual machine control data structures (VMCS)는 VMX시에 x86 CPU가 사용하는 구조체이다. 이 구조체는 가상머신이 어떻게 동작할 것인지 세부적인 동작 방법을 저장하고 있다. 이 구조체에 접근하기 위해서는 VMCLEAR, VMPTRLD, VMREAD 그리고 VMWRITE을 통해서 접근하게 된다.
Virtual machine monitor는 각각의 가상머신 마다 다르게 설정된 VMCS를 부여함으로서, 다른 기능을 제어할 수 있게 된다. VMCS는 각각의 virtual process마다 하나씩 배분된다. 예를 들어서, 가상 4코어를 사용하는 가상머신의 경우 4개의 VMCS를 통해서 각각의 코어의 기능을 제어하게 된다.
VMCS는 프로세서마다 다 다른 구조를 가지고 있다. 이러한 Specification을 Abstract하게 VMM에게 제공하기 위해서, VMCS에 대한 실질적인 접근은 VMWRITE, VMREAD와 같은 Instruction을 통해서 이루어진다. 이러한 명령어 없이 VMCS를 VMM이 작성하는 일은 없다. 따라서 x86은 VMCS에 대한 접근 및 어떤 VMCS가 현재 VMM이 설정하고자 하는 주체인지 구별하는 여러 방식들을 가지고 있다. 이를 위해서 Active, current그리고 clear이라는 VMCS의 상태를 추가하였다.
논리 프로세서 (실제 프로세서)는 여러개의 Active한 VMCS를 가지고서 현재 프로세서가 작동한 current VMCS를 결정하게 된다. current VMCS가 위에서 설명한 VMCLEAR..와 같은 연산자의 대상이 된다.
- VMPTRLD: VMCS의 메모리를 로드하고 그 메모리를 current VMCS로 바꾼다.
- VMCLEAR: 지정된 VMCS의 메모리를 current와 active에서 삭제한다.
- VMLAUNCH: 지정된 VMCS의 상태가 clear이고, Active이면 그 VMCS가 현재 논리 프로세서의 Launched된 상태로 만든다.
VMCS 포맷
- 0 ~ 4 byte: 30:0 비트는 VMCS revision identifier이며, 31비트는 Shadow VMCS indicator이다. (즉 VMCS버전 정보) 이 revision 정보는 하이퍼버이저가 작성해야 하며, MSR IA32_VMX_BASIC에서 가져올 수 있다.
- 4 ~ 8 byte: VMX-abort indicator, 초기화는 0이며, VM이 abort나면 프로세서가 해당하는 abort정보를 여기다 적어준다.
- 8 ~ : VMCS data. Writeback cacheable 메모리를 가르키는 주소여야 하며, CPU가 VMCS구조체를 관리할 때 사용할 메모리 주소가 된다.
VMCS Data의 종류
- Guest-state area: VM exit이나 load가 발생하면 Guest-state area에서 프로세서의 상태를 가져온다
- Host-state area: VM exit이 나면 여기서 host의 정보를 가져와 로드한다.
- Vm-execution control fields: VMX non-root operation에 대한 설정을 저장한다.
- Vm-exit control fields: VM exit상황에서 어떻게 할 것인지 설정한다.
- Vm-entry control fields: VM entry상황에서 어떻게 할 것인지 설정한다.
- Vm-exit information fields: VM exit상황에서 어떤 이유때문에 VM exit이 났는지 여기다가 저장한다.
자세한 내용은 인텔 메뉴얼을 참조
참고 문헌
- ↑ Intel 64 and Ia-32 Software Developer's Manual