x86: Virtualization: Gabriel Laskar
x86: Virtualization: Gabriel Laskar
● Virtual Machine
● Hypervisor
● Virtual machine monitor
2
Basics : Virtualization vs Emulation
3
VM Requirements
4
Virtualization Solutions
● Xen
● Qemu/KVM
● VMWare ESX
● VMWare Workstation
● VirtualBox
5
Other Kind of Virtualization
● Paravirtualization
● Containers
6
CPU Virtualization
7
Virtualize the “unvirtualizable”
● Binary Rewriting
● Para-virtualization
● HVM
8
Rings & Virtualization
9
vt-x
10
vt-x : instructions
● vmptrld, vmptrst
● vmclear
● vmread, vmwrite
● vmlaunch, vmresume
● vmxoff, vmxon
● invept, invvpid
● vmcall, vmfunc
11
EPT
12
Memory Virtualization
● shadow page tables
● EPT
13
Example Hypervisor: Qemu/KVM
14
KVM
15
KVM
16
Qemu
17
KVM Api
● VM creation
● Memory assignation
● irq chip
● launch a cpu
● devices
18
/dev/kvm
19
/dev/kvm : system fd
● ioctl(fd, KVM_CREATE_VM)
● ioctl(fd, KVM_GET_VCPU_MMAP_SIZE)
● ioctl(fd, KVM_GET_MSR_INDEX_LIST)
● ioctl(fd, KVM_CHECK_EXTENSION)
20
kvm extensions
21
Example : vm creation
int fd_kvm = open("/dev/kvm", O_RDWR);
int kvm_run_size = ioctl(fd_kvm, KVM_GET_VCPU_MMAP_SIZE,
0);
● KVM_CREATE_VCPU
● KVM_SET_USER_MEMORY_REGION
● KVM_CREATE_IRQCHIP (extension)
● KVM_{GET,SET}_DEBUGREGS
● KVM_GET_DIRTY_LOG
23
Example : Memory Assignation
// set memory region
void *addr = mmap(NULL, 10 * MB, PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
24
/dev/kvm : VCPU fd
● KVM_RUN
● KVM_{GET,SET}_REGS
● KVM_{GET,SET}_SREGS
● KVM_TRANSLATE
● KVM_INTERRUPT (without local apic)
● KVM_{GET,SET}_MSRS
● KVM_SET_CPUID
25
Example : VCPU Creation & setup
int fd_vcpu = ioctl(fd_vm, KVM_CREATE_VCPU, 0);
sregs.cs.db = 1;
sregs.ss.db = 1;
26
Example : Run VM
struct kvm_run *run_state =
mmap(0, kvm_run_size, PROT_READ|PROT_WRITE,
MAP_PRIVATE,
fd_vcpu, 0);
for (;;) {
int res = ioctl(fd_vcpu, KVM_RUN, 0);
switch (run_state->exit_reason) {
/* … */
}
}
27
Exit Reasons
● KVM_EXIT_EXCEPTION
● KVM_EXIT_IO
● KVM_EXIT_MMIO
● KVM_EXIT_SHUTDOWN
● ...
28
Port IO
case KVM_EXIT_IO:
if (run_state->io.port == CONSOLE_PORT
&& run_state->io.direction == KVM_EXIT_IO_OUT)
{
write(STDOUT_FILENO,
(char*)run_state + offset, size);
}
break;
29
More? Where is the documentation?
● linux source code:
○ include/uapi/linux/kvm.h
○ Documentation/virtual/kvm/api.txt
○ virt/kvm/
○ arch/x86/kvm/
○ arch/arm/kvm/
● qemu source code
● kvmtool:
○ https://raw.githubusercontent.com/penberg/linux-
kvm/master/tools/kvm/README
● As usual Intel® 64 and IA-32 Architectures Software
Developer Manuals
30