Qemu :
QEmu é um software completo e independente por si só. Você o usa para emular máquinas, é muito flexível e portátil. Principalmente, funciona por um 'recompilador' especial que transforma o código binário escrito para um determinado processador em outro (por exemplo, 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 seriais / paralelas, etc.
KQemu :
No caso específico em que a origem e o 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 do kernel, o KQemu é capaz de executar a maioria dos códigos inalterados, substituindo apenas as instruções de anel0 de nível mais baixo. Nesse caso, o espaço do usuário Qemu ainda aloca toda a RAM da máquina emulada e carrega o código. A diferença é que, em vez de recompilar o código, ele chama o KQemu para fazer a varredura / correção / execução. Toda a emulação de hardware periférico é feita no Qemu.
Isso é muito mais rápido que o Qemu comum, 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), portanto o desempenho ainda sofre.
KVM :
O KVM é um par de coisas: primeiro, é um módulo do kernel Linux - agora incluído na linha principal - que muda o processador para um novo estado de 'convidado'. O estado convidado possui seu próprio conjunto de estados de toque, mas as instruções privilegiadas de ring0 retornam ao código do hypervisor. Como é um novo modo de execução do processador, o código não precisa ser modificado de forma alguma.
Além da alternância do estado do processador, o módulo do kernel também lida com algumas partes de baixo nível da emulação, como os registros MMU (usados para lidar com a VM) e algumas partes do hardware emulado PCI.
Segundo, o KVM é uma bifurcação do executável do Qemu. Ambas as equipes trabalham ativamente para manter as diferenças no mínimo, e há avanços na redução. Eventualmente, o objetivo é que o Qemu funcione em qualquer lugar e, se um módulo de kernel do KVM estiver disponível, ele poderá ser usado automaticamente. Mas, no futuro próximo, a equipe do 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 para lá, se melhorar o desempenho) e na 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 chamar o KQemu, gera um encadeamento (isso é importante). O encadeamento chama o módulo do kernel do KVM para alternar para o modo convidado e continua a executar o código da VM. Em uma instrução privilegiada, ele retorna ao módulo do kernel do KVM, que, se necessário, sinaliza o thread do Qemu para lidar com a maior parte da emulação de hardware.
Uma das coisas boas dessa arquitetura é que o código de convidado é emulado em um encadeamento posix que você pode gerenciar com as ferramentas normais do Linux. Se você deseja uma VM com 2 ou 4 núcleos, o kvm-qemu cria 2 ou 4 threads, cada um deles chama o módulo do kernel do KVM para iniciar a execução. A concorrência - se você tiver núcleos reais suficientes - ou agendamento - se não - é gerenciada pelo agendador normal do Linux, mantendo o código pequeno e as surpresas limitadas.