Qemu :
O QEmu é um software completo e autônomo. Você o usa para emular máquinas, é muito flexível e portátil. Principalmente, ele funciona por um 'recompiler' especial que transforma o código binário escrito para um determinado processador em outro (digamos, para executar o código MIPS em um Mac PPC ou o ARM em um PC x86).
Para emular mais do que apenas o processador, o Qemu inclui uma longa lista de emuladores periféricos: disco, rede, VGA, PCI, USB, portas serial / paralela, etc.
KQemu :
No caso específico em que origem e destino são a mesma arquitetura (como o caso comum de x86 em x86), ele ainda precisa analisar o código para remover quaisquer 'instruções privilegiadas' e substituí-las por opções de contexto. Para torná-lo o mais eficiente possível no Linux x86, existe um módulo do kernel chamado KQemu que lida com isso.
Sendo um módulo de kernel, o KQemu é capaz de executar a maioria dos códigos inalterados, substituindo apenas as instruções somente de nível 0 do nível mais baixo. Nesse caso, o espaço de usuário Qemu ainda aloca toda a RAM para a máquina emulada e carrega o código. A diferença é que, em vez de recompilar o código, ele chama o KQemu para varrer / corrigir / executá-lo. Toda a emulação de hardware periférico é feita no Qemu.
Isso é muito mais rápido que o Qemu simples porque a maioria dos códigos não é alterada, mas ainda precisa transformar o código ring0 (a maior parte do código no kernel da VM), então o desempenho ainda sofre.
KVM :
O KVM é um par de coisas: primeiro é um módulo do kernel do Linux - agora incluído na linha principal - que transforma o processador em um novo estado 'convidado'. O estado convidado possui seu próprio conjunto de estados de toque, mas as instruções privilegiadas de anel retornam ao código do hipervisor. Como é um novo modo de execução do processador, o código não precisa ser modificado de forma alguma.
Além da comutação de estado do processador, o módulo do kernel também lida com algumas partes de baixo nível da emulação, como os registradores MMU (usados para manipular VM) e algumas partes do hardware emulado PCI.
Em segundo lugar, o KVM é um fork do executável do Qemu. Ambas as equipes trabalham ativamente para manter as diferenças no mínimo, e há avanços em reduzi-las. Eventualmente, o objetivo é que o Qemu funcione em qualquer lugar, e se um módulo KVM do kernel estiver disponível, ele poderá ser usado automaticamente. Mas no futuro previsível, a equipe da Qemu se concentra na emulação e portabilidade de hardware, enquanto o pessoal do KVM se concentra no módulo do kernel (às vezes movendo pequenas partes da emulação, melhorando o desempenho) e fazendo interface com o restante do código do espaço do usuário.
O executável kvm-qemu funciona como o Qemu normal: aloca RAM, carrega o código e, em vez de recompilá-lo, ou chamando o KQemu, ele gera um encadeamento (isso é importante). O encadeamento chama o módulo KVM do kernel para alternar para o modo convidado e continua a executar o código da VM. Em uma instrução privilegiada, ela retorna ao módulo KVM do kernel, que, se necessário, sinaliza o encadeamento do Qemu para lidar com a maior parte da emulação de hardware.
Uma das coisas legais dessa arquitetura é que o código do convidado é emulado em um encadeamento posix que você pode gerenciar com ferramentas normais do Linux. Se você quiser uma VM com 2 ou 4 núcleos, o kvm-qemu cria 2 ou 4 encadeamentos, cada um deles chama o módulo KVM do kernel para iniciar a execução. A simultaneidade - se você tiver núcleos reais suficientes - ou agendamento - se não for - é gerenciada pelo agendador normal do Linux, mantendo o código pequeno e surpresas limitadas.