답변:
키무 :
QEmu는 완전한 독립형 소프트웨어입니다. 기계를 에뮬레이트하는 데 사용하며 매우 유연하고 휴대 가능합니다. 주로 특정 프로세서에 대해 작성된 이진 코드를 다른 프로세서로 변환하는 특수한 '재 컴파일러'에서 작동합니다 (예 : PPC mac에서 MIPS 코드를 실행하거나 x86 PC에서 ARM을 실행).
Qemu는 단순한 프로세서 이상을 모방하기 위해 디스크, 네트워크, VGA, PCI, USB, 직렬 / 병렬 포트 등 다양한 주변 장치 에뮬레이터를 포함합니다.
KQemu :
소스와 대상이 모두 동일한 아키텍처 (x86에서 x86의 일반적인 경우)와 같은 특정 경우에도 여전히 '권한있는 명령'을 제거하고이를 컨텍스트 스위치로 대체하기 위해 코드를 구문 분석해야합니다. x86 Linux에서 가능한 효율적으로 만들기 위해이를 처리하는 KQemu라는 커널 모듈이 있습니다.
커널 모듈 인 KQemu는 대부분의 코드를 변경없이 실행할 수 있으며 가장 낮은 수준의 ring0 전용 명령 만 대체합니다. 이 경우 사용자 공간 Qemu는 여전히 에뮬레이트 된 시스템에 대한 모든 RAM을 할당하고 코드를로드합니다. 차이점은 코드를 다시 컴파일하는 대신 KQemu를 호출하여 스캔 / 패치 / 실행합니다. 모든 주변 장치 하드웨어 에뮬레이션은 Qemu에서 수행됩니다.
대부분의 코드는 변경되지 않았지만 ring0 코드 (VM의 커널에있는 대부분의 코드)를 변환해야하기 때문에 일반 Qemu보다 훨씬 빠릅니다. 따라서 여전히 성능이 저하됩니다.
KVM :
KVM은 두 가지 요소입니다. 먼저 Linux 커널 모듈 (현재는 메인 라인에 포함되어 있음)이 프로세서를 새로운 '게스트'상태로 전환합니다. 게스트 상태에는 자체 링 상태 세트가 있지만 권한이있는 ring0 명령어는 하이퍼 바이저 코드로 대체됩니다. 새로운 프로세서 실행 모드이기 때문에 코드를 수정하지 않아도됩니다.
프로세서 상태 전환 외에도 커널 모듈은 MMU 레지스터 (VM 처리에 사용)와 같은 에뮬레이션의 일부 하위 레벨 부분과 PCI 에뮬레이트 된 하드웨어의 일부 부분도 처리합니다.
둘째, KVM은 Qemu 실행 파일의 포크입니다. 두 팀은 최소한의 차이를 유지하기 위해 적극적으로 노력하고 있으며,이를 감소시키는 발전이 있습니다. 결국 Qemu는 어느 곳에서나 작동해야하며 KVM 커널 모듈을 사용할 수 있으면 자동으로 사용될 수 있습니다. 그러나 가까운 미래를 위해 Qemu 팀은 하드웨어 에뮬레이션 및 이식성에 초점을 맞추고 KVM 직원은 커널 모듈 (때로는 성능을 향상시키는 경우 에뮬레이션의 작은 부분을 이동) 및 나머지 사용자 공간 코드와의 인터페이스에 중점을 둡니다.
kvm-qemu 실행 파일은 일반적인 Qemu처럼 작동합니다. RAM을 할당하고 코드를로드 한 후 다시 컴파일하거나 KQemu를 호출하는 대신 스레드를 생성합니다 (중요). 스레드는 KVM 커널 모듈을 호출하여 게스트 모드로 전환하고 VM 코드를 실행합니다. 권한있는 명령에서 KVM 커널 모듈로 다시 전환되며, 필요한 경우 대부분의 하드웨어 에뮬레이션을 처리하도록 Qemu 스레드에 신호를 보냅니다.
이 아키텍처의 장점 중 하나는 게스트 코드가 일반적인 Linux 도구로 관리 할 수있는 posix 스레드로 에뮬레이트된다는 것입니다. 코어가 2 개 또는 4 개인 VM을 원할 경우 kvm-qemu는 2 개 또는 4 개의 스레드를 생성하며 각각 스레드를 실행하기 위해 KVM 커널 모듈을 호출합니다. 실제 코어가 충분한 경우 (또는 예약하지 않은 경우) 동시성은 일반적인 Linux 스케줄러에서 관리하므로 코드가 작고 놀라움이 제한됩니다.
함께 작업 할 때 KVM은 CPU 및 메모리에 대한 액세스를 중재하며 QEMU는 하드웨어 자원 (하드 디스크, 비디오, USB 등)을 에뮬레이트합니다. 단독으로 작업 할 때 QEMU는 CPU와 하드웨어를 모두 에뮬레이트합니다.