Como a virtualização difere da emulação, em termos de estrutura?

20

Alguém me disse que um programa de virtualização como o VirtualBox não funciona como um emulador no sentido de que não emula os registros e usa os reais para os dados virtualizados que estão na CPU. Os emuladores devem emular os registros, uma vez que devem executar software que depende de um ambiente externo (por exemplo, um emulador Genesis precisa dos registros e endereços de memória do Motorola 68000, portanto o desenvolvedor deve disponibilizar esses recursos como registros emulados).

Minha principal pergunta é: como a virtualização é desenvolvida? Como habilitamos um sistema operacional inteiro para executar como um processo em uma máquina virtual, mas fazê-lo funcionar independentemente, enquanto ainda usa a CPU real? Eu sei apenas emulação, não virtualização, por isso, se alguém pudesse ajudar isso seria bom!

PS: Não estou perguntando apenas qual é a diferença, mas diferenças na maneira como eles executam o software.

toneladas de bons
fonte

Respostas:

32

Originalmente, não era possível deixar o sistema operacional convidado usar hardware real porque não havia como controlá-lo. Se você tentasse executá-lo na CPU real, não tinha garantia de que ele entregaria o controle de volta ao SO host.

A virtualização, conforme você a descreve, é implementada no hardware, permitindo que certas regras e restrições sejam aplicadas no nível do hardware, que podem ser gerenciadas pelo sistema operacional host. Isso permite que o sistema operacional host configure regras sobre o que o convidado pode ou não fazer e, em seguida, execute o convidado em hardware real. Se o convidado tentar fazer algo com o hardware real que viola as regras (como tentar acessar um dispositivo de disco), o hardware suspenderá o convidado e enviará ao host uma interrupção, o que permitirá que o host forneça uma resposta (como retornando dados de um dispositivo de disco emulado) e reinicie o convidado.

Aqui está um exemplo simplificado do processo:

Sistema operacional host: Ei, CPU, preciso que você execute esse código virtualizado. Ligue-me se quiser fazer algo que não seja apenas executar instruções.

CPU host: Você conseguiu!
A CPU do host salva todos os registros e estados do host e começa a executar o código do SO convidado

SO convidado: Estou vivo! Ei CPU, você pode me pegar esse arquivo?

CPU do host: Uh ... claro. Um momento.
A CPU do host salva todos os registros e estado do convidado e, em seguida, restaura todos os registros e estado do
host CPU do host: Ei Host OS, o hóspede queria esse arquivo!

Sistema operacional host: Bem, dê a eles o seguinte: Arquivo do disco rígido virtual

CPU host: Você conseguiu!
A CPU do host salva todos os registros e estados do host, restaura os registros e o estado do convidado e começa a executar o código do SO convidado
CPU do host: Aqui está esse arquivo!

SO convidado: Doce, obrigado!

A principal diferença aqui está em um emulador, o sistema operacional convidado nunca está realmente em execução no hardware. Com a virtualização, o sistema operacional host configura limitações na CPU e, em seguida, executa o código do convidado na CPU física. O exemplo acima é extremamente simplificado, mas a memória, a E / S do disco e até a rede podem ser controladas nos mais recentes processadores de hoje, permitindo a interface com segurança sem a necessidade de incomodar o sistema operacional do host. Desde que o convidado não tente sair dos limites virtualizados, o SO Host poderá não ter nenhum código em execução se não tiver nada a fazer em um determinado momento.


Para adicionar um pouco de perspectiva, este é apenas mais um passo em uma longa história de virtualização e controle. (Não há garantias de que esteja na ordem correta ou seja exaustiva, mas deve fornecer uma boa visão geral inicial)

Originalmente, não havia virtualização. Todos os processos compartilhavam o mesmo espaço de memória, todos tinham acesso total ao hardware, e a capacidade de realizar várias tarefas dependia inteiramente de um processo parar e dar controle ao próximo processo. Se o sistema operacional quisesse ter algum tipo de controle sobre um processo, ele precisaria executá-lo em um emulador (ninguém o fez, porque era muito dolorosamente lento).

A primeira foi a Memória Privilegiada : certas ações que só podem ser executadas por regiões especiais da memória. Essas regiões são ocupadas pelo sistema operacional, permitindo que ele atue como um gateway para essas ações privilegiadas. Um exemplo é a capacidade de ler / gravar dados no hardware. Isso evita que os processos leiam / gravem diretamente no disco rígido e os obriga a solicitar ao sistema operacional que leia / escreva para eles. Isso significa que o sistema operacional pode verificar se o processo tem permissão antes de executar a ação.

Em seguida, veio o "tempo" virtualizado, por assim dizer. O sistema operacional pode configurar a CPU para interromper o processo ativo em intervalos definidos, permitindo que ele assuma o controle do agendamento e alterne entre processos. O sistema operacional agora podia executar processos diretamente no hardware e ainda impedir que usurpassem o tempo da CPU. Isso foi fornecido por um temporizador de hardware .

A seguir, veio a memória virtualizada : O problema da memória compartilhada é que qualquer processo pode ler a memória de qualquer outro processo. O que acontece quando o programa de Mary lê a senha de Bob em seu navegador? A memória virtual permite que o sistema operacional mapeie a memória que um processo vê para diferentes partes da memória física, ou mesmo remova-as completamente da memória física (para o arquivo de paginação). Sempre que um processo tenta ler ou gravar na memória, a VMMU (unidade de gerenciamento de memória virtual) da CPU procura onde está mapeado na memória física e executa a ação lá. Se estiver sem memória, a CPU chama o sistema operacional para buscar a página na memória a partir do arquivo de paginação.

Tudo bem, então, neste momento, chegamos ao início do processador X86, onde podemos executar processos com segurança e impedir ativamente que eles assumam o sistema, a menos que o SO permita especificamente. Neste ponto, os processos são efetivamente "virtualizados". Esse suporte existe há muito tempo, então você realmente não ouve as pessoas falando sobre processos virtualizados, pois supõe-se que todos os processos estejam virtualizados agora.

Por que os SOs virtualizados são especiais? Por que não podemos simplesmente iniciar um como um processo e deixá-lo fazer suas próprias coisas? Bem, o problema é que, como sistema operacional, o sistema convidado espera poder acessar e usar os mesmos controles que o host usa para controlar processos - basicamente, o sistema operacional espera ser o governante supremo do computador, e simplesmente não ' Não funcionará se não for esse o caso. As extensões de "virtualização de hardware" (AMD-V para AMD e VT-x para Intel) permitem que o host OS forneça um conjunto virtualizado de controles de processos virtuais (memória privilegiada virtual, temporizadores de hardware virtuais, memória virtual virtual).

Darth Android
fonte
Lembra-me de um IRC um ato jogo eu vi uma vez (possivelmente NSFW: contém alguma linguagem PG-13)
Scott Chamberlain
Meu computador não possui virtualização de hardware (AMD-V nem VT-x). Mas eu sou capaz de executar uma máquina virtual no VirtualBox ... O VirtualBox instala um driver no sistema operacional para fazer isso. Como isso é feito?
NothingsImpossible
1
@NothingsImpossible: a menos que você tenha uma máquina muito antiga, a maioria dos processadores vendidos atualmente suporta a virtualização de hardware. A virtualização básica sempre é possível porque a CPU envia uma interrupção ao supervisor (kernel) se algum programa (como um SO convidado) tentar executar instruções que não são permitidas no nível de segurança atual. Tudo o que o sistema operacional host precisa fazer é capturar essas interrupções, descobrir a operação desejada e retomar a execução do processo filho. O AMD-V / VT-x somente permite uma virtualização mais eficiente, pois agora a própria CPU pode servir as instruções "não permitidas".
Lie Ryan
@LieRyan Obrigado pela explicação. Mas não é antigo, é um processador Atom. Este, para ser mais preciso: ark.intel.com/products/70105
NothingsImpossible
1

Como habilitamos um sistema operacional inteiro para executar como um processo em uma máquina virtual, mas fazê-lo funcionar independentemente, enquanto ainda usa a CPU real?

(O seguinte é bastante simplificado.)

Ao alavancar o mesmo mecanismo ou similar que o sistema operacional usa para manter os processos do modo de usuário alinhados, principalmente.

Os processos no modo de usuário causam exceções de CPU quando tentam fazer algo que não têm permissão.

Portanto, se um kernel do sistema operacional for executado no modo de usuário, sempre que tentar fazer algo como acessar diretamente o hardware, isso causará uma exceção. Um hipervisor pode captar essa exceção e responder com um comportamento emulado ou virtualizado, em vez de causar uma falha no sistema como faria um kernel normal.

Ele pode executar o acesso ao hardware em nome desse kernel, executar um acesso modificado ao hardware (ou seja, acessar uma parte de um arquivo em vez de um acesso direto ao setor de disco) ou qualquer outra coisa que você possa imaginar.

As extensões da máquina virtual da CPU estendem basicamente todo o modo "supervisor" ou "protegido" da CPU em mais um nível para fazer exatamente isso, além de fornecer um "nível de aninhamento" adicional da memória virtual para facilitar a virtualização da paginação.

LawrenceC
fonte
0

Virtualização envolve a simulação de partes do hardware de um computador - o suficiente para um sistema operacional convidado executar sem modificações - mas a maioria das operações ainda ocorre no hardware real por razões de eficiência. A virtualização, portanto, normalmente é mais rápida que a emulação, mas o sistema real precisa ter uma arquitetura idêntica ao sistema convidado. Por exemplo, o VMWare pode fornecer um ambiente virtual para executar uma máquina virtual Windows XP "dentro" de uma máquina real. No entanto, o VMWare não pode funcionar em nenhum hardware real que não seja um PC x86 real.

Em emulação de máquina virtual simula o hardware completo em software. Isso permite que um sistema operacional para uma arquitetura de computador seja executado na arquitetura para a qual o emulador foi criado. Como todas as operações são executadas em software, a emulação tende a ser mais lenta, porém pode suportar mais plataformas, pois é independente de hardware.

Keltari
fonte
Ok ... mas como você quer dizer "simular" partes do hardware? Um emulador faz a coisa exata ... como a virtualização faz com que o SO convidado aproveite os recursos reais da CPU?
toneladas bons
@tonsbons: por definição. : P Um emulador não faz exatamente a mesma coisa - emula tudo da CPU em diante. Bochs, por exemplo, é um emulador. A virtualização é mais fina; um hipervisor executa o SO convidado na CPU física (basicamente enganando o convidado a pensar que ele possui a CPU). Como o hóspede não tem os privilégios que acha que possui, ele aciona "falhas" quando tenta fazer coisas com kernelly. O hipervisor observa essas falhas e modifica o hardware virtual para fazer parecer ao convidado como essas operações realmente aconteceram.
cHao
0

Apenas para completar, também há simulação , onde as ações da máquina são duplicadas, mas usando código cujos internos podem ser radicalmente diferentes da máquina "real". (Pense em "simulador de vôo".) Geralmente, os simuladores compilam o código-fonte da máquina "real", mas têm como alvo uma arquitetura de CPU totalmente diferente, com recursos de E / S e SO totalmente diferentes.

Daniel R Hicks
fonte