kvm: the Linux Virtual Machine Monitor (Linux symposium '07)

www.kernel.org/doc/ols/2007/ols2007v1-pages-225-230.pdf

 

[Kernel-based Virtual Machine]

  1. 배경

    • 다른 유사한 시스템을 실행하는 컴퓨터를 사용하는 아이디어는 자원을 유틸화 하고 테스팅 하는 목적에 유용하다고 일찍이 인식댐.
    • ibm, vmware, xen등 최근에 기업에서 여러 가상시스템기술을 움직이고있음
  2. x86 가상화 확장

    -   x86은 가상화 하기 어려운데
    -   가상화의 중요성을 인식하고 인텔,amd에서 가상화를 좀더 쉽게 만들기위해 x86에 extension들을 추가함
    -   이 extension들은 서로 호환이 잘 안되서 그들은 서로 반드시 유사해야했음
        -   새로운 guest operating 모드 : 시스템이 선택적으로 특정한 명령이나 레지스터접근을 요청하는것 말고는 일반적인 운영모드의 권한을 가지는 guest 모드로 프로세서가 switch 할수있다.
        -   하드웨어 상태 switch : guest모드로 switch할때, 하드웨어는 프로세서 운영모드에 영향을 주는 control 레지스터를 switch한다.
        -   종료 사유를 기록하기 : guest모드에서 다시 호스트 모드로 switch가 발생하면 하드웨어는 switch하는 이유를 기록해서 소프트웨어가 적당한 action을 취하도록 할수있다.
  3. 일반적인 kvm 구조

    • kvm은 /dev/kvm에 device node를 열어서 가상머신을 만듬

    • 게스트는 자신의 메모리를 가지고 userspace와 분리댐

    • 가상 CPU는 스스로 스케쥴링 못함

      /dev/kvm
      • kvm은 꽤 전형적인 linux character device로 구성댐

      • 새로운 가상머신 만들고, 가상머신에 메모리 할당, 가상cpu 레지스터 읽고쓰기, 가상cpu로 인터럽트 삽입, 가상 cpu실행

      • user 메모리처럼 커널은 guest address 공간에 형성하기위해 비연속적인 페이지를 할당함.

      • 커널모드 유저모드 이외의 새로운 실행모드인 guest 모드가 추가댐(Figure 2 -> guest mode execution loop 설명)

        명령어 셋의 차이점 조화하기
      • x86 명령어셋과 달리 하드웨어 가상화 extensions는 표준화되지 않음, 인텔과 amd는 명령어, 문법 모두 다름

      • kvm은 커널모듈을 통해 이러한 차이점을 조절함

  4. Memory Management Unit 가상화

    • x86은 사용자가 볼수있는 가상 주소를 bus에 접근하기위해 사용되는 물리주소로 변환하는 가상 메모리 시스템을 제공함 => MMU.
      [MMU의 구성]
      • virtual <-> physical 변환하는 radix tree
      • 시스템에 변환오류를 알리는 mechanism
      • page table lookup 을 가속화하는 단일 캐시
      • 독립적인 주소공간을 공급하기 위해 translation root를 변환하는 명령어
      • TLB(Translation Lookaside Buffer)를 관리하는 명령어
    • MMU는 한가지 레벨에서의 변환(guest-virtual => guest-physical)은 제공하지만, 가상화가 요구되는 두가지 레벨(guest-physical => host-physical)에서의 변환은 불가하다.
    • 이에대한 근본적인 해결책은 guest가 제공한 원본 page를 가지고 하드웨어 interaction을 에뮬레이션 하는동안, guset-virtual에서 host-physical로의 변환을 인코딩하는 분리된 page table을 실제 MMU에 나타내는 하드웨어 가상화 능력 사용하는것이다.
    • shadow page table 생산은 증가세이다. 그것은 비워지고 있으며, 변환 실패가 host에 기록되어 missing entry가 추가되었다.
    • guest page table은 원본 메모리에 존재하기 때문에 shadow page table과 동기화하는것은 어렵고 문제가 된다.

    4.1 가상 TLB 실행

     - kvm에서 shadow page table의 초기버전은 성능을 희생하여 코드내 많은 버그를 줄이는 복잡하지 않은 방법을 사용했다.
     - 이러한 방법은 guest가 tlb 관리 명령어를 tlb를 동기화 하는데 사용해야한다는 사실에 의존했다.
     - 그러나 tlb 관리 명령어의 대부분은 컨택스트 스위칭이 대부분이었고, 이는 모든 tlb를 무효화했다.
     - 이것은 shadow page table이 tlb를 refill 하는것보다 좀더 많은 비용을 요구했기 때문에, 다양한 프로세스들의 작업량에 많은 고통을 받는다는것을 의미했다.  

    4.2 가상 MMU 캐싱

     - guest system의 성능을 개선하기 위해, 가상 mmu 실행은 page table이 컨택스트 스위칭을 통해 캐시되도록 하는것을 가능하도록 함으로써 강화되었다.
     - 이것은 code complexity가 증가하는 대신 막대한 성능 증가를 실현했다.
     - guest의 write에 대한 notification을 받기위해 guest page table에 쓰기권한을 protect로 설정했으나, 이것은 추가적인 연쇄적 요구사항을 만들어 이를 충족시켰고, kvm 컨택스트 스위칭 성능이 현재는 적절하게 되었다.
     [요구사항]
         1. 각각의 guest page를 참조하는 모든 writable 변환의 reverse mapping이 유지되어야한다.
         2. x86 명령어 인터프리터를 사용하는 access를 에뮬레이팅 함으로써, 우리는 미리 guest memory와 shadow page table에 미치는 영향을 알 수 있다.
         3. guest는 page table page를 kvm에게 알리지않고 일반 page로 재활용한다.  
  5. I/O 가상화

    • VMM은 실제 s/w, h/w에서 처럼 pio(Programmed I/O), mmio(memory mapped I/O)를 에뮬레이팅 하고 가상 하드웨어에서 인터럽트를 받아 시뮬레이션 할 수 있어야함

    5.1 guest측 I/O 명령어 가상화

     - pio를 trap하는것은 복잡하지 않고, mmio를 trap하는것은 꽤 복잡함
     - kvm에서 I/O 가상화는 user 영역에서 진행됨
     - kvm은 user 영역이 guest로 인터럽트를 보내는 메커니즘을 제공함

    5.2 host측 가상 인터럽트

     - guest가 인터럽트를 받을 준비가 되었을때 인터럽트 플래그가 set되고, guest가 준비되면 인터럽트가 보내진다.
     - 이는 kvm이 x86기반의 시스템에 있는 복잡한 인터럽트 컨트롤러들을 에뮬레이팅 하도록한다.

    5.3 Framebuffer 가상화

     - Framebuffer는 memory-mapped I/O 장치의 중요한 부분
     - 전형적인 mmio와 다른 특성(대역폭, 메모리 등가)
     - kvm은 임의의 주소에 비 mmio 메모리를 맵핑하도록 함, 이것은 물리적으로 메모리를 alias하도록하는 VGA windows에 포함됨
     - 또한 framebuffer의 변화를 기록함으로써, display window가 점차 최신화 될수있음  
  6. Linux Intergration

    • 리눅스로 통합되는것은 kvm에 중요한 이익을 줌
    • 개발자 측면에서 커널 내 존재하는 기능을 재사용하도록 많은 기회를줌
    • 사용자 측면에서 기존에 있던 리눅스의 프로세스 관리 인프라(top, taskset, kill)를 재사용 하도록함
  7. Live Migration

    • 가상화를 진행하는 이유중 하나
    • 이는 한 guest를 한 host에서 다른 host로 쉽게 옮길 수 있도록함
    • 병렬적으로 guest 메모리를 타겟 호스트로 복사함
    • guest page를 복사 후 수정이 발생하면 다시 복사함
    • 마지막에 kvm은 page 로그를 제공하는데 이는 마지막 호출 후 수정된 페이지의 비트맵을 user 영역에 제공함
  8. 추후 방향성

    • Guest OS에서 symmetric multiprocessing 지원하기
    • 반가상화 적용하기
    • 메모리 관리 통합하기
    • CPU 스케쥴링 통합하기
    • 새로운 하드웨어 가상화 기법들을 kvm으로 통합하기
    • CPU 아키텍처 확장하기
  9. Conclusion

    • kvm 짱

+ Recent posts