Intel VT-x와 AMD-V로 이해하는 하드웨어 가상화
Intel VT-x와 AMD-V의 VMX·SVM 구조, EPT/NPT, IOMMU, VM Exit 최적화와 KVM 설정을 정리한다.
2026-08-14 · 최초 발행 2026-01-19
x86 가상화가 풀어야 했던 권한 문제
초기 소프트웨어 가상화에서 가장 까다로운 지점은 게스트 운영체제가 자신을 Ring 0에 있다고 전제한다는 데 있었다. 하이퍼바이저는 더 높은 통제권을 가져야 하지만, 게스트 역시 커널 권한에서 실행되는 것처럼 동작해야 한다.
Popek-Goldberg 정리(1974)는 가상화 가능한 구조에서 모든 민감 명령어가 특권 명령어여야 한다고 본다. 민감 명령어는 시스템 상태에 영향을 주며 LGDT, LIDT, MOV CR3 등이 해당한다. 특권 명령어는 Ring 0에서만 실행할 수 있다.
x86에는 특권 명령어가 아닌 민감 명령어가 17개 있다. POPF는 Ring 3에서도 실행되지만 동작이 달라지고, SGDT와 SIDT는 특권 없이 시스템 테이블 주소를 읽을 수 있다. 이 불일치가 초기 하이퍼바이저 구현의 부담이었다.
초기 VMware는 바이너리 변환(BT)으로 이를 우회했다. 변환 엔진이 민감 명령어를 찾아 하이퍼바이저 호출로 바꾸고, 변환 결과를 코드 캐시에 보관해 재실행 비용을 줄였다.
이 방식의 오버헤드는 10-30% 성능 저하로 제시된다. Xen이 택한 반가상화는 게스트 OS 소스를 수정해 Hypercall 인터페이스를 사용하게 했고, 네이티브의 95% 이상 성능을 목표로 했다.
VT-x는 게스트 실행과 하이퍼바이저 제어를 분리한다
Intel VT-x는 VMX 모드를 도입해 하이퍼바이저와 게스트를 구분한다. VMX Root Mode에서는 하이퍼바이저가 모든 권한으로 동작하고, VMX Non-Root Mode에서는 게스트가 제한된 권한으로 실행된다.
VMXON과 VMXOFF는 VMX 모드를 활성화하거나 비활성화한다. VMLAUNCH와 VMRESUME는 게스트 진입에 쓰이며, VMCALL은 게스트에서 하이퍼바이저로 향하는 Hypercall 명령어다.
VMCS가 보관하는 상태와 제어 정보
VMCS(Virtual Machine Control Structure)는 게스트와 호스트의 상태, 실행 제어, VM-Exit 및 VM-Entry 제어 정보를 담는다.
게스트 상태에는 RIP, RSP, RFLAGS, CR0-CR4 같은 레지스터와 CS, DS, SS, ES, FS, GS 세그먼트, GDTR, IDTR, TR, LDTR 같은 시스템 테이블 정보가 포함된다. 호스트 상태는 VM Exit 뒤 복원할 하이퍼바이저의 상태다.
실행 제어 필드에서는 외부 인터럽트를 다루는 Pin-Based Controls, CR3 쓰기·I/O 비트맵·MSR 비트맵·EPT 활성화 등을 다루는 Primary/Secondary Processor-Based Controls, 페이지 폴트 등의 특정 예외를 잡는 Exception Bitmap을 설정한다. VM-Exit 제어에는 MSR 저장·로드 리스트와 Exit 이유 기록이 포함된다.
VM Exit를 줄이는 일이 성능 튜닝의 출발점이다
게스트가 실행을 계속할 수 없는 이벤트가 발생하면 CPU는 VM Exit를 수행한다. 상태는 VMCS에 저장되고 하이퍼바이저는 Exit 이유에 맞춰 이벤트를 에뮬레이션하거나 결과를 반영한 뒤 게스트를 다시 실행한다.
CPUID, RDMSR, WRMSR, IN/OUT 같은 특권 명령어, CR0·CR3·CR4에 대한 접근, 페이지 폴트(#PF)와 일반 보호 오류(#GP), 외부 인터럽트와 NMI, EPT 위반은 VM Exit를 유발할 수 있다. VM Entry/Exit Cost는 수백~수천 사이클이므로, 불필요한 Exit를 억제하고 처리를 배치하는 방향이 중요하다.
AMD-V의 SVM 구조와 ASID
AMD-V는 SVM 구조를 사용하며, VMCB(Virtual Machine Control Block)에 인터셉트 제어와 게스트 상태를 기록한다.
VMCB는 메모리 구조이며, 불투명한 VMCS와 달리 직접 메모리 접근이 가능해 디버깅이 쉽다. VMRUN과 VMEXIT 명령어를 사용한다. 인터셉트는 CR0.PE, CR3, CR4.PAE 등의 CR 접근, 디버그 레지스터, 예외 비트맵, MSRPM(MSR Permission Map)을 이용한 MSR 접근에 적용할 수 있다.
ASID(Address Space Identifier)는 TLB 엔트리에 주소 공간 식별자를 태깅한다.
ASID를 쓰면 VM 전환 때 TLB를 플러시하지 않아도 되어 컨텍스트 스위칭 오버헤드를 줄일 수 있다. Intel의 VPID(Virtual Processor ID)와 같은 개념이다.
EPT와 NPT가 주소 변환을 하드웨어로 넘긴다
가상 머신의 주소는 게스트 가상 주소(GVA)에서 게스트 물리 주소(GPA)를 거쳐 호스트 물리 주소(HPA)로 이어진다. EPT(Extended Page Tables)와 NPT는 이 2단계 변환을 하드웨어가 수행하도록 한다.
섀도우 페이징에서는 하이퍼바이저가 게스트 페이지 테이블을 추적하고, CR3 쓰기마다 VM Exit를 일으켜 섀도우 페이지 테이블을 갱신해야 했다. 메모리 집약적 워크로드에서는 50% 성능 저하가 발생할 수 있다.
EPT/NPT 환경에서는 하드웨어가 두 단계의 페이지 워킹을 수행한다. CR3 쓰기는 더 이상 인터셉트가 필요하지 않으며, 성능은 네이티브의 95-99%로 제시된다. GPA에 대응하는 EPT 항목이 없으면 VM Exit가 발생하고, 하이퍼바이저는 EPT를 갱신해 페이지 할당과 동적 메모리 관리, 메모리 오버커밋을 처리할 수 있다.
대용량 페이지도 EPT에서 사용할 수 있다.
# 2MB 대용량 페이지 (EPT)
EPT Level 4: GPA[47:39] → PML4E
EPT Level 3: GPA[38:30] → PDPTE
EPT Level 2: GPA[29:21] → PDE (2MB 페이지)
# 1GB 초대용량 페이지
EPT Level 3: GPA[38:30] → PDPTE (1GB 페이지)
큰 메모리 영역을 하나의 TLB 엔트리로 다뤄 TLB 미스를 줄이고, 페이지 워킹 단계를 축소할 수 있다. 데이터베이스와 빅데이터 워크로드에 적합하다.
I/O 경로의 격리와 인터럽트 처리
VT-d와 AMD-Vi는 IOMMU를 통해 DMA 주소 변환과 인터럽트 리매핑을 제공한다.
디바이스는 게스트 물리 주소를 사용할 수 있고, IOMMU는 이를 호스트 물리 주소로 매핑한다. 인터럽트 리매핑은 디바이스 인터럽트를 게스트로 라우팅하며, 디바이스의 임의 메모리 접근을 막아 DMA 공격을 방지한다.
SR-IOV(Single Root I/O Virtualization)는 물리 NIC를 여러 가상 함수(VF)로 나누고, 각 VM이 VF를 직접 할당받게 한다. 패스스루 성능은 네이티브 대비 99% 이상이다.
APIC 가상화는 인터럽트 전달에서 발생하는 Exit를 줄인다.
Posted Interrupts는 인터럽트를 APIC Page에 기록해 VM Exit 없이 게스트로 전달한다. 고속 I/O 장치인 10GbE와 NVMe에서 필수다. TPR Shadow와 APIC-Register Virtualization은 LAPIC 레지스터 접근에서 VM Exit를 제거하고, EOI 가상화는 인터럽트 완료 통지를 최적화한다.
가상화 환경에서 확인할 성능 경로
Hyper-V Enlightenments는 반가상화 인터페이스로, Linux KVM도 지원한다. 원격 CPU의 TLB 무효화, 스케줄된 VCPU에서만 수행하는 스핀락 폴링, TSC 기반 시간 동기화에 쓰인다.
// Hyper-V Hypercall 예시
#define HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE 0x0002
static inline void hv_flush_tlb(void) {
u64 status;
asm volatile (
"movq %1, %%rcx\n"
"movq %2, %%rdx\n"
"vmcall\n"
"movq %%rax, %0\n"
: "=r" (status)
: "i" (HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE), "r" (gpa_list)
: "rax", "rcx", "rdx"
);
}
KVM 통계와 Intel PT(Processor Trace)는 VM Exit의 양상과 원인을 확인하는 데 사용할 수 있다.
# KVM 통계 확인
cat /sys/kernel/debug/kvm/<vm_id>/vcpu0/stats
exits: 1234567
halt_exits: 5000
irq_exits: 10000
io_exits: 2000
mmio_exits: 500
# Intel PT (Processor Trace)를 통한 VM Exit 분석
perf kvm --guest --host record -e intel_pt//
Exit Rate는 초당 VM Exit 횟수이며 낮을수록 좋다. Exit Latency는 Exit 처리 시간이고, L1/L2 캐시 미스는 게스트와 호스트 전환의 오버헤드를 보여준다.
중첩 가상화에서는 L0 하이퍼바이저 위에 L1 하이퍼바이저와 L2 게스트가 놓인다.
VMCS Shadowing은 L1이 VMCS에 직접 접근하게 해 L0 Exit를 줄인다. VPID 전파는 L2의 TLB 격리를 지원한다. 컨테이너 인 VM과 보안 샌드박스가 이 구조의 응용 대상이다.
기밀 컴퓨팅과 게스트 보호
Intel SGX의 Enclave는 하이퍼바이저도 접근할 수 없는 보호 영역이다. 원격 증명은 클라우드 환경에서 신뢰를 수립하는 수단이며, EPC(Enclave Page Cache) 크기 제한은 제약으로 남는다.
AMD SEV(Secure Encrypted Virtualization)는 VM별 키로 게스트 메모리를 암호화한다.
SEV-ES는 레지스터 상태까지 암호화하며, SEV-SNP는 무결성 보호와 롤백 방지를 제공한다.
KVM에서 점검할 설정
호스트 CPU의 가상화 기능을 확인하고 KVM 모듈을 로드한 뒤, QEMU 실행 옵션에 필요한 CPU·메모리·디바이스 구성을 지정할 수 있다.
# VT-x/AMD-V 활성화 확인
egrep -o '(vmx|svm)' /proc/cpuinfo
# KVM 모듈 로드
modprobe kvm_intel nested=1 enable_apicv=1
# QEMU 실행
qemu-system-x86_64 \
-enable-kvm \
-cpu host,+vmx \
-m 4G \
-smp cores=2 \
-device vfio-pci,host=01:00.0 # GPU 패스스루
운영 시에는 다음 항목을 함께 확인한다.
- EPT/NPT 활성화 확인
- 대용량 페이지 (Huge Pages) 사용
- vCPU 피닝 (CPU Pinning)
- NUMA 노드 정렬
- SR-IOV 또는 vhost-net 사용
- Enlightenments 활성화
VT-x와 AMD-V는 민감 명령어 처리와 메모리 관리의 부담을 하드웨어로 옮겨 가상 머신 성능을 네이티브 수준에 가깝게 만든다. IOMMU와 SR-IOV는 I/O 경로의 성능 및 격리를 보완하고, SEV 같은 기밀 컴퓨팅 기능은 클라우드 보안의 새로운 표준이 될 전망이다. AI 워크로드를 위한 GPU 가상화도 계속 진화할 것이다.