KVM Architecture.png

개요

Kernel-based Virtual Machine (KVM)은 리눅스 커널에 Hypervisor의 기능을 더한 것을 말한다. 이러한 변화는 하드웨어 가상화 기법의 발달과 더불에서 자연스럽게 추가된 기능이다. 하드웨어 가상화 기법은 Gutest operating mode와 그에 따른 가상화된 Priviledge 명령어를 CPU단에서 제공한다. 이러한 기능을 linux커널에서 이용하여 쉽게 Hypervisor로 linux 커널을 활용하여 가상 머신을 돌릴 수 있게 한 기능이 kvm이다. KVM은 Hardware-based virtualization을 이용한 Full virtualization의 일종이다.

KVM은 리눅스 커널 모듈으로 주어지며, 이러한 모듈들은 리눅스 커널을 부팅후 Hypervisor으로 변환시킨다. 리눅스는 정상적으로 작동되지만, 특별한 파이퍼바이저를 위한 기능들을 유저 공간으로 제공한다. KVM은 Qemu와 함께 상보적으로 작동하며 리눅스가 가상머신을 위한 하이파바이저로 작동하게 한다.

KVM은 메모리 관리, 스케쥴러, I/O스택, 전원 관리와 같은 하이퍼바이저의 기능을 대부분 리눅스의 강력한 기능에 의존하기 때문에 TCB를 리눅스와 공유하며 안전하고 빠르게 구현되어 있다. 또한 KVM과 Host OS사이에서 world switch를 위한 switching cost가 존재하지 않기 때문에 (왜냐하면 하나의 OS에서 다 처리하는 것이기 때문에) 빠른 작동을 제공한다.

기본적인 구조

KVM Execution flow.png

KVM에서 가상 머신은 device node (/dev/kvm)을 open하는 것으로 생성된다. guest는 생성한 프로세스의 메모리와 독립된 자신만의 메모리를 할당받으며, user process에 mapping된 영역이 또한 존재한다. 이러한 mapping영역은 주로 DMA장치의 Emulation에 이용된다.

Guest의 메모리 사용은 KVM을 사용하는 프로세스 (Qemu)의 메모리 사용으로 잡히며, vCPU는 사실 KVM을 이용하는 프로세스의 스레드와 같은 구조를 가진다. KVM은 Trap and emulate에 이용되는 Emulation code들을 가지고 있지 않다. 대신 이러한 Trap은 KVM을 통해서 Qemu와 같은 유저 공간으로 가서 User space에서 처리되게 된다.

/dev/kvm 디바이스노트는 character device의 형태로 주어진다. 이 디바이스는 여러 ioctl을 통해서 userspace프로그램이 이 디바이스를 통해서 가상화된 시스템을 생성할 수 있도록 해준다. 이러한 /dev/kvm에서 제공하는 ioctl에는 다음과 같은 기능들이 포함된다.

  • 새로운 가상머신 할당
  • 가상머신에 메모리 할당
  • 가상 CPU의 레지스터 읽기
  • 가상 CPU에 Interrupt 루틴 추가
  • 가상 CPU 시작 및 중지

이러한 기능을 통해서 가상머신은 Virtual CPU를 통제하게 된다.