1.1 Introdução à Virtualização
A virtualização dos recursos físicos de um sistema computacional permite executar diversos sistemas operacionais em uma mesma plataforma. Isso faz com que sejam atingidas altas taxas de compartilhamento e de utilização dos recursos disponíveis. O conceito de virtualização já é bem estabelecido há décadas, porém ficou restrito, durante muito tempo, aos servidores especializados e aos mainframes. Avanços nas tecnologias dos PCs, permitiram que essa plataforma passasse a dar suporte eficiente à virtualização. No entanto, a arquitetura IA-32, plataforma PC, impõe alguns desafios à implementação da virtualização.
Em um sistema virtualizado, há a introdução de mais uma camada de software, que tem por objetivo arbitrar o acesso ao hardware subjacente a ela, assim esses recursos podem ser compartilhados pelos sistemas operacionais que estão sobre essa camada. A camada de software que controla o acesso ao hardware é chamada VMM (Virtual Machine Monitor, ou Monitor de Máquina Virtual). Os sistemas operacionais que estão sendo executados sobre essa camada são chamados de “visitantes”. A cada sistema operacional visitante, o VMM apresenta um conjunto de interfaces, que constituem a Máquina Virtual (VM, Virtual Machine).
A arquitetura IA-32 provê uma proteção para a execução de aplicações baseada em quatro níveis de privilégio, os chamados rings, no qual o nível 0 é o com maior nível de privilégios e o nível 3 é o com menor. O nível de privilégio 0 é usado por instruções que controlam funcionalidades básicas da CPU, as chamadas instruções privilegiadas, que, nesse nível, podem ser executadas sem falha e garantem a acessibilidade do espaço de endereçamento. Embora sejam quatro níveis de privilégio, grande parte dos software desenvolvidos para a arquitetura IA-32 usam somente os níveis 0 e 3.
Normalmente, para um sistema operacional ter controle sobre a CPU, alguns de seus componentes devem ter nível de privilégio 0. No entanto, quando um sistema virtualizado é considerado, o sistema operacional visitante não pode ser executado no nível de privilégio 0, pois o VMM não pode ceder esse privilégio a ele. Para contornar esse desafio, usa-se a técnica de ring deprivileging, que consiste em executar uma aplicação em um nível de privilégio menor do que ela foi inicialmente projetada para ser executada. Os dois modelos mais usados para essa técnica são o modelo 0/1/3, no qual o sistema operacional visitante é executado no nível 1 de privilégio e suas aplicações no nível 3, e o modelo 0/3/3, no qual tanto as aplicações do sistema operacional visitante como ele mesmo são executados no nível de privilégio 3. Em ambos os modelos o VMM é executado no nível 0. Vale ressaltar que o modelo mais usado é o 0/3/3.
graphic
Figura 1: Métodos de Virtualização. (a) Sistema não virtualizado, SO executando no nível 0 e as demais aplicações no nível 3. (b) Modelo 0/1/3 de ring deprivileging. (c) Modelo 0/3/3 de ring deprivileging. (d) Sistema usando a Intel Virtualization Technology [13].
Na Figura 1, são mostrados os principais métodos de virtualização. Os microprocessadores da arquitetura IA-32 têm a sua proteção baseada em níveis de privilégio de 2 bits, nos quais o nível 0 representa o mais privilegiado e o nível 3 o menos privilegiado. Os níveis de privilégio determinam se as instruções privilegiadas, que controlam funcionalidades básicas da CPU (Central Processing Uniti), podem ser executadas sem gerar uma falta. [13]
1.1.1 Desafios da Virtualização na Arquitetura IA-32
A seguir são mostrados os principais desafios tecnológicos para dar suporte eficiente à virtualização na plataforma IA-32 [4].
- Ring Aliasing
Refere-se a problemas aparecem quando um software é executado em um nível de privilégio diferente do que ele foi escrito para ser executado. Na arquitetura IA-32, uma possível maneira, de o sistema operacional visitante tomar conhecimento de que ele não está sendo executado no nível de privilégio 0, é executar a instrução PUSH com o registrador de segmento de código, CS, o que coloca o conteúdo desse registrador, que inclui o nível de privilégio atual, na pilha.
- Compressão do espaço de endereçamento
O VMM deve reservar para si uma parte do espaço de endereçamento do sistema operacional visitante. O VMM pode ser totalmente executado dentro do espaço de endereçamento do sistema operacional visitante, o que propicia acesso fácil aos dados do SO visitante. No entanto, tomaria muito espaço do endereçamento virtual do SO visitante.
O VMM deve prevenir o acesso do SO visitante a essas áreas de memória usadas por ele no espaço de endereçamento do SO visitante. Caso o SO visitante conseguisse acesso a essas áreas, a integridade do VMM estaria comprometida, se o SO visitante conseguisse escrever nessas porções da memória, ou o SO visitante poderia perceber que está sendo executado em uma máquina virtual, se ele pudesse ler a área de memória restrita ao VMM. As tentativas de acesso a essas áreas de memória devem ser tratadas pelo VMM, de modo a emular ou dar suporte a elas.
O termo compressão do espaço de endereçamento refere-se aos desafios do VMM proteger as porções de memória que ele acessa e suportar o acesso dos visitantes a ela.
- Acesso ao estado privilegiado sem gerar falta
Quando um software tenta acessar certo componente de estado da CPU sem os privilégios necessários, uma falta é gerada, o que permite que, no caso de um SO visitante, o VMM emule a instrução deseja, de forma transparente para o visitante. No entanto, existem instruções no conjunto da arquitetura IA-32, que acessam estados privilegiados da CPU, mesmo com um nível de privilégio insuficiente. Se o VMM mantiver os registradores de estado da CPU com valores inesperados, um SO visitante pode usar uma dessas instruções para determinar que não tenha controle total da CPU.
- Impactos adversos nas chamadas de sistema dos SO visitantes
O uso da técnica de ring deprivileging pode gerar uma queda de eficiência de mecanismos da arquitetura IA-32 que aceleram a entrega e a manipulação de transições para o sistema operacional. Algumas chamadas de sistema podem gerar resultados para o VMM ao invés do SO visitante, sendo assim, o VMM deve emular a execução dessas instruções para o SO visitante.
- Virtualização das Interrupções
A arquitetura IA-32 provê mecanismos de mascaramento de interrupções, isto é, mecanismos que previnem que as interrupções externas sejam entregues ao SO quando este não está preparado para tratá-las. O mascaramento de interrupções é feito através da flag IF no registrador EFLAGS. No entanto, quando tratamos de um ambiente de virtualização, o VMM geralmente não garante ao sistema operacional visitante a habilidade de controlar o mascaramento de interrupções. Uma das formas de impedir o uso desses mecanismos pelo SO visitante é a geração de uma falta no momento em que o visitante tentar usar o mascaramento da interrupção. Interceptar todas as tentativas do sistema visitante de fazer o mascaramento significaria uma grande redução de desempenho do sistema.
- Acesso ao estado oculto
Alguns componentes de estado do processador não ficam disponíveis em registradores que possam ser acessados por software. A arquitetura IA-32 não possui nenhum mecanismo que salve e recupere os componentes ocultos do contexto do sistema operacional visitante, durante a troca de máquinas virtuais, ou os preserve enquanto o VMM está sendo executado.
- Compressão dos Níveis de Privilégio
Para proteger o VMM das aplicações visitantes, em um contexto de ring deprivileging, os sistemas operacionais visitantes são executados no ring 3, modelo 0/3/3. Nesse modelo, tanto o sistema operacional visitante quanto as aplicações sobre ele, são executados com o mesmo nível de privilégio. Isso deixa o sistema operacional visitante vulnerável em relação às suas aplicações.
- Acesso freqüente a Recursos Privilegiados
O acesso a recursos privilegiados pelo sistema operacional visitante deve ser impedido pelo VMM, através da geração de uma falta no momento em que o SO visitante tente acessar esses recursos. Mesmo com comportamento normal, o acesso freqüente a esses recursos pode gerar uma queda de desempenho do sistema.
Tendo em vista os desafios da arquitetura IA-32 para a virtualização, surge a proposta da tecnologia VT-x da Intel. A tecnologia Intel VT-x é o primeiro componente da tecnologia Intel VT, que ainda conta com a Intel Virtualization Technology for Direct I/O. Nesse trabalho será abordado mais a frente o funcionamento dessas tecnologias e como elas lidam com cada um dos desafios da virtualização na arquitetura IA-32.