kvm 의 내부구조 요약 정리

최용석 2012.04.17 14:52 조회 수 : 19525

1. 소개

* 이번 소개는 저희 스터디 그룹에서 하고 있는 Linux KVM 가상화 기능과 관련된 내부 구조를 설명하려고 합니다. 가능한 프로그램 언어 등의 지식을 전제로하지 않는 간단한 설명을 기반으로 작성해 보았습니다.

* Linux KVM은 여러 아키텍처 플랫폼에 대응하고 있으며 여기서는 X86, 및 X86_64 아키텍처를 전제로 소개 하겠습니다.



2. KVM의 동작

2.1 CPU의 특권 모드

*가상화 기능이없는 x86 CPU는 RING 0 ~ RING 3 4종류의 특권한 모드를 가진다.
  *Winodws 나 Linux 등의 OS를 실행하는 경우 RING 0 RING 3 2가지 모드만을 사용한다.
  *RING 0은 모든 CPU 명령 실행 모드에서 Linux 커널 코드는이 모드에서 동작한다.
  *RING 3는 물리적 HW 자원을 조작하는 명령은 실행할 수없는 유저모드이며 프로세스의 코드는이 모드에서 동작한다.
      (사용자 프로세스가 물리적 HW 자원에 액세스할 때 시스템 호출은 Linux 커널 코드를 호출한다.)

 

 ring0~ring3_2.png

 

*가상화 기능 (Intel - VT)을 가진 Intel CPU에서는 VMX root 모드 VMX non - root 모드의 구별이 추가되어 각각의 모드에 대해 RING 0 ~ RING 3이 존재한다.
  *가상화 하이퍼 바이저 (Xen, KVM)을 사용하지 않는 경우, Linux는 모든 VMX root 모드로 이동
  *Xen의 경우, Xen 하이퍼 바이저는 VMX root / RING 0 동작하며. 각 VM은 VMX non - root / RING 0, RING 3으로 동작
      *VMX non - root / RING 0 물리적 HW 자원에 대한 액세스가 발생하면 VM exit가 발생하여 CPU는 강제로 VMX root / RING 0

       하이퍼  바이저 처리를 이행한다. 

vm_exit_2.png


2.2.KVM의 특권 모드의 이용 방법
*KVM은 VMX root / RING 0, RING 3에서 작동하는 일반적인 Linux 시스템에서 kvm 프로세스로 가상 머신을 실행한다.

   *하나의 가상 시스템에 대응하여 1 개의 kvm 프로세스를 시작한다.
      *kvm 프로세스는 특수 장치 파일 / dev / kvm을 통해 KVM 커널 모듈 기능을 이용함.
      *가상 머신에 여러 개의 가상 CPU를 할당하면 각 가상 CPU에 kvm 프로세스 내부에서 독립적인 스레드가 생성된다.


*kvm 프로세스의 메모리 공간에는 qemu 장치 에뮬레이터와 게스트 커널 코드가 로드된다.

   *따라서, 게스트 커널은 원칙적으로 다른 가상 머신 (다른 kvm 프로세스)의 메모리 공간에 액세스할 수 없다.
*게스트 커널 코드는 물리적 CPU에서 특권 모드 VMX non - root / RING 0에서 실행된다.
  *따라서, 게스트 커널의 동작은 물리적 시스템과 완전히 동일하게 처리되며. 게스트 커널에서 시작되는 일반 프로세스는 일반적인

   커널의 처리에 따라 VMX nonroot / RING 3에서 실행된다.
  *게스트 커널에서 물리적 HW 자원에 대한 액세스가 발생하면 VM exit가 발생하여 KVM 모듈 처리로 전환된다.


kvm1_2.png



2.3 가상 장치에 액세스하는 방법
*VM exit를받은 KVM 모듈은 액세스되는 물리적 자원에 따라 처리를 전달한다.
     *예를 들어, 디스크 장치에 대한 액세스의 경우는 KVM 모듈은 kvm 과정에서 qemu 장치 에뮬레이터 처리를 리턴한다.
          *qemu 장치 에뮬레이터는 VMX root / RING 3 움직이고있어 호스트 커널에서 본 일반 사용자 프로세스로 가상 디스크 파일에

            액세스한다.
          *qemu 장치 에뮬레이터는 게스트 커널의 공유 메모리를 사용하여 가상 디스크 파일에 읽고 쓰는 데이터를 게스트 커널과

            통신한다. (가상적인 DMA 처리됨)
     *kvm 프로세스의 가상 디스크 파일에 액세스 호스트 커널에서 일반 프로세스 디스크 액세스와 동등 호스트 커널의 디스크

      캐시를 사용한다.


kvm2_2.png

 

2.4 메모리 관리에 대해
*비 가상화 환경에서는 물리적 메모리 위치는 Page Frame Number (PFN)로 표시된다.
   *Linux 커널은 각 프로세스의 가상 주소에 해당하는 PFN 프로세스마다 제공되는 페이지 테이블에 기록한다.
   *프로세스의 실행 시간은 하드웨어에 탑재된 Memory Management Unit (MMU)이 페이지 테이블을 참조하여 가상 주소를

    자동으로 PFN로 변환한다.
*KVM 가상화 환경에서는 물리적 메모리 위치는 Machine Page Frame Number (MPFN)로 표시되며, 각 가상 머신이 인식하는

 가상 물리적 메모리 위치는 Guest Page Frame Number (GPFN)로 표시된다.

   *KVM 모듈은 각 kvm 프로세스 GPFN에 해당하는 MPFN의 대응표를 내부적으로 유지하고 각 kvm 프로세스 가상 물리적

    메모리를 할당한다.


비가상화 환경_2.png



 KVM가상화환경_2.png


2.5.KVM의 메모리 주소 변환 (1)
*Intel EPT (Extended Page Tables)와 같은 2 단계의 페이지 변환을 지원하는 CPU를 사용하는 경우는 MMU가 아래를 참조하여 게스트 OS에서 프로세스의 가상 주소 -> GPFN -> MPFN 변환을 수행한다 .
   *게스트 커널이 관리하는 페이지 테이블 (게스트 OS에서 프로세스의 가상 주소와 GPFN의 대응표)
   *KVM 모듈이 관리하는 변환 테이블 (GPFN과 MPFN의 대응표)


메모리주소변환_1.png 


2.6. KVM의 메모리 주소 변환 (2)

*2 단계의 페이지 변환 지원하지 않는 CPU의 경우 Shadow Pagetable를 이용한다.
   *메모리 페이지 테이블에 대한 액세스의 경우는 게스트 커널 보여 가상 페이지 테이블을 변경하는 동시에 해당하는 실제 메모리

    페이지 테이블 (Shadow Pagetable)를 동시에 변경한다.
   *게스트 커널에서 사용자 프로세스가 메모리에 액세스하면 MMU는 Shadow Pagetable에 따라 해당 물리적 메모리에 액세스 한다.


메모리주소변환_2.png


소스 분석 해놓고 올리지 못한 자료가 많은데..

저희가 인원이 워낙 없고 각자 회사 일로 바쁘다 보니 제대로 공유하지 못했던 것 같습니다.

멤버들과 상의해서 차츰 올리도록 하겠습니다.




번호 제목 글쓴이 날짜 조회 수
공지 [공지] 하이퍼바이져 스터디 관련 Q&A 게시판 입니다. woos 2016.04.09 234
215 __attribute__ ((pure)) [1] 백창우 2008.04.12 82224
214 20101023일자 xen 소스 빌드 중 toos/libxl/libxl.c의 에러 발생되는 문제 해결 법 [2] 이상철 2010.10.23 45919
213 IO 가상화 참고 소스 [1] 백창우 2008.05.06 40660
212 e820.c 컴파일 오류 나네요. [2] 백창우 2008.05.17 27044
211 [펌] libvirt 가상화 라이브러리 분석 황선욱 2011.05.24 20799
» kvm 의 내부구조 요약 정리 [3] file 최용석 2012.04.17 19525
209 credit 관련 던랩 메일링 리스트 포스팅 문대혁 2011.01.08 15299
208 그 게임 해킹 사이트 이름이 뭐였죠?? [2] 정성욱 2008.06.16 12432
207 Xen 스터디 종료하겠습니다. 백창우 2009.04.28 12248
206 Hypervisor Detailed Design (작성중 문서) [3] file 백창우 2008.04.16 12187
205 윈도우 레지스트리 가상화 [4] 박세율 2008.09.02 12042
204 TVMM 한글 PPT file 박세율 2008.05.15 11925
203 [발표자료] [2008.04.11] Hypervisor 개발 프로젝트 시작.ppt 백창우 2008.04.29 11737
202 [질문] 메모리 할당관련 [3] 박은병 2008.05.05 11597
201 xen security 관련 자료 박세율 2008.08.28 11309
200 Hypervisor 아키텍쳐 디자인 백창우 2008.04.14 11156
199 Hypervisor 개발 프로젝트 문닫겠습니다. :) 백창우 2008.12.08 11094
198 x86 시뮬레이터 & 에뮬레이터 조사 [1] 백창우 2008.05.02 10924
197 지금까지 조사해본바에 의하면 [1] 백창우 2008.05.06 10905
196 나가기 전에 적습니다. [2] 백창우 2008.05.10 10824
XE Login