O Bochs é um emulador de PC x86 e um depurador licenciado sob o GNU Public License (GPL) menor. A plataforma fornece a emulação de uma plataforma de PC inteira, incluindo um processador ou mais e vários periféricos de PC, como discos rígidos, monitor, unidades de CD-ROM e outros periféricos comuns. É possível usar o Bochs para executar sistemas operacionais voltados para plataformas de PC. Também é um aplicativo ideal para o desenvolvimento de sistemas operacionais (porque é possível isolar travamentos do sistema operacional em desenvolvimento dentro do guest, além dos recursos de depuração que o Bochs fornece). O Bochs faz isso por meio da emulação, mas o desempenho fica prejudicado.
Vamos usar um desvio rápido e entender a diferença entre a emulação e os métodos de virtualização mais comuns disponíveis atualmente.
O Bochs é um emulador de plataforma, ou seja, na verdade ele não é virtualização no sentido moderno, e sim uma simulação. Na virtualização, o hypervisor e as máquinas virtuais (VMs) são executados no hardware "limpo" (no qual o hypervisor cria o ambiente para compartilhar o hardware entre as VMs, normalmente por meio de instruções de hardware). Esse processo é comumente conhecido como execução direta, porque as instruções são executadas diretamente pelo processador do host. Esse tipo de virtualização usa o suporte dos processadores atuais (como a Intel Virtualization Technology para x86 [VT-x] ou a virtualização AMD [AMD-V]). A emulação normalmente fornece uma camada entre a VM, o hardware subjacente e o sistema operacional para criar a ilusão do ambiente de plataforma desejado, como mostra a Figura 1.
Figura 1. Virtualização x emulação
A emulação, normalmente, também interpreta as instruções da VM guest (semelhante à virtualização, na qual a arquitetura de conjunto de instruções dos guests deve ser igual à do host). Isso gera uma vantagem interessante para a emulação, na qual a plataforma da VM guest pode ser totalmente diferente da plataforma do host (por exemplo: pode-se executar um guest x86 em um IBM® PowerPC® de destino).
Outra vantagem interessante da emulação é o controle total do ambiente, o que facilita a pausa de toda a máquina para inspecionar o seu estado e também para introduzir qualquer tipo de falha na emulação para testar a árvore de erro de um sistema operacional. Essa funcionalidade prejudica o desempenho, mas é um benefício verdadeiro para esse tipo de ambiente. Além disso, o emulador realmente isola o guest do host. Dessa forma, os emuladores podem fornecer uma transparência total em relação ao ambiente.
Há casos em que se pode usar a emulação em arquiteturas de desempenho. Um dos exemplos é a tecnologia de metamorfose de código criada pela Transmeta. O processador da Transmeta tinha uma arquitetura superescalar do tipo very long instruction word (VLIW) que podia emular sequências de código de x86. O processador fazia isso por meio da emulação ou da compilação dinâmica de sequências de código (semelhante aos recursos do QEMU). A Transmeta abriu as portas em 1995 e encerrou suas atividades no final de 2007.
Outros exemplos envolvem a tecnologia Java, interpretada a partir
dos bytecodes de Java para a arquitetura subjacente do host. A
tecnologia Java implementa a compilação just-in-time (JIT) para
contornar algumas ineficiências, semelhante à Transmeta e a
várias outras soluções de emulação (inclusive o QEMU, outra
solução de emulação de plataforma semelhante ao Bochs). No
entanto, o Bochs também obtém uma emulação eficiente (até 100
milhões de instruções por segundo [MIPS] em um processador
moderno) e é portátil. O Bochs foi totalmente desenvolvido na
linguagem C++ para a execução de
instruções interpretadas do x86 e emulação de plataforma.
Agora iremos explorar o funcionamento do Bochs para entender como
ele obtém um desempenho útil em uma implementação
C++ pura. Este artigo aborda dois
aspectos da emulação: a CPU (emulação instruction set
architecture [ISA]) e os dispositivos.
O método de emulação do Bochs é exclusivo. Embora outras soluções ofereçam execução direta ou compilação JIT, o Bochs implementa a emulação pura da ISA da CPU (inclusive o suporte para a emulação de CPU de x86 e x86-64 com até oito CPUs em uma configuração simétrica de multiprocessamento). O Bochs fornece a emulação de uma CPU real, chegando a emular o fluxo de busca/decodificação/execução da CPU.
No estágio do fluxo, o Bochs executa verificações de permissão e em seguida busca o opcode. No estágio de decodificação, o Bochs decodifica a instrução do x86 que foi buscada em uma representação interna. Também mantém um cache de instrução para melhorar o desempenho armazenando as "micro-operações" do sistema x86 original (que podem ser buscadas mais tarde sem a sobrecarga da decodificação). Finalmente, no estágio de execução, o Bochs realiza várias operações relacionadas à execução da instrução específica (incluindo o cálculo de endereços efetivos para os operandos, realizando em seguida uma chamada indireta ao método específico de execução da instrução). Quando a instrução tiver sido executada, será possível atualizar os registros e sinalizadores afetados (conforme for conveniente). Neste ponto, o Bochs fornece uma otimização chamada atualização ociosa de sinalizadores para calcular os sinalizadores aritméticos somente quando são necessários (em vez de atualizar a cada etapa).
Fora do fluxo de busca/decodificação/execução, o Bochs também gerencia eventos externos, como interrupções de dispositivos e outros recursos necessários, como troca de bytes e outras verificações privilegiadas. Além da CPU genérica de x86, o Bochs implementa vários recursos de CPU, como o processador Intel Pentium com tecnologia MMX; Streaming Single Instruction, Multiple Data Extensions 2 (SSE2) e instruções 3DNow! da AMD .
O cache de instrução interno do Bochs fornece uma alternativa à compilação JIT tradicional. Embora a compilação JIT ofereça algumas vantagens para acelerar a execução, essa aceleração exige muita memória.
O Bochs proporciona uma emulação da plataforma de PC, com a emulação do dispositivo baseada no tipo de dispositivo. Por exemplo: o teclado é um dispositivo físico compartilhado entre o host e o guest, mas o disco é compartilhado por meio de uma emulação, na qual o disco do guest é um arquivo no sistema de arquivos do disco do host.
O Bochs apresenta uma lista útil de hardwares emulados, uma placa Ethernet NE2000, placa de vídeo Cirrus Logic (PCI ou ISA), conjunto de chips Intel 440FX PCI, BIOS, hub de raiz USB, placa de som Sound Blaster e controladores de disco e disquete. Como a CPU, esses dispositivos também são emulados, e isso pode introduzir uma sobrecarga considerável no caminho. Por exemplo: quando um driver se comunica com o hardware, ele manipula registros para solicitar alguma operação desejada do dispositivo. Em uma plataforma emulada, os registros e a memória que representam o dispositivo são emulados. Quando o driver do sistema operacional do guest vasculha os registros do hardware e a memória, há um software subjacente para emular o dispositivo (veja a Figura 2). Além dessa interface emulada, a emulação de dispositivo deve, em seguida, executar a operação desejada, que implica uma emulação do dispositivo e, talvez, a comunicação com um dispositivo físico na plataforma do host (como a placa da interface de rede física [NIC] ou o disco físico).
Figura 2. Virtualização de dispositivos por meio da emulação
O Bochs e seus utilitários são muito simples de usar para emular vários sistemas operacionais guest. Esse exemplo demonstra a emulação do sistema operacional Plan 9 from Bell Labs.
Primeiro, é necessário instalar o Bochs se ele ainda não estiver
disponível no seu sistema. No meu sistema Ubuntu, eu uso o
gerenciador de pacotes apt para
instalar os pacotes necessários:
$ sudo apt-get install bochs $ sudo apt-get install bochs-x |
Esse comando instala o emulador de PC Bochs IA-32/64 e o emulador X-11 para o Bochs.
Prepare a instalação do Plan 9
Para emular o Plan 9 no Bochs, o seu ambiente virtualizado precisa de mais duas coisas: um CD-ROM contendo a imagem de instalação do Plan 9 e um disco rígido virtual (VHD) como o destino da instalação.
Primeiro, obtenha a imagem do Plan 9 no site do Bell Labs, conforme o indicado na linha de comando a seguir:
$ wget http://plan9.bell-labs.com/plan9/download/plan9.iso.bz2 $ bunzip2 plan9.iso.bz2 |
A imagem do plan9 é um arquivo no
formato ISO que pode ser interpretado por meio do formato ISO
9660 (como emulação de uma unidade de CD-ROM, que você verá em
breve).
A próxima etapa é criar o seu VHD. Lembre-se de que ele será um
arquivo no sistema operacional do host. O Bochs fornece um
utilitário especial para criar esse arquivo chamado
bximage. O utilitário
bximage é interativo e permite
especificar várias opções de criação e gerenciamento de
arquivos. A Listagem 1 fornece a sessão
para criar o VHD. Depois de chamar
bximage, você especifica que deseja
criar uma imagem de disco rígido (em vez de uma imagem de
disquete). O Bochs pode suportar vários tipos de imagem, mas
para obter bom desempenho, solicite flat porque não haverá
necessidades de crescimento dinâmico no tempo de execução. A
instalação do sistema operacional Plan 9 requer bastante espaço
— portanto, especifique um disco de 700 MB seguido pelo nome do
arquivo de disco rígido (c.img).
Listagem 1. Criando a listagem do VHD para o Bochs usando bximage
$ bximage
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c,v 1.34 2009/04/14 09:45:22 sshwarts Exp $
========================================================================
Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd]
What kind of image should I create?
Please type flat, sparse or growing. [flat]
Enter the hard disk size in megabytes, between 1 and 129023
[10] 400
I will create a 'flat' hard disk image with
cyl=1422
heads=16
sectors per track=63
total sectors=1433376
total size=699.89 megabytes
What should I name the image?
[c.img]
Writing: [] Done.
I wrote 314302464 bytes to c.img.
The following line should appear in your bochsrc:
ata0-master: type=disk, path="c.img", mode=flat, cylinders=1422, heads=16, spt=63
$ ls -la c.img
-rw-r--r-- 1 mtj mtj 733888512 2010-12-19 14:30 c.img
$
|
Com a imagem do CD-ROM e a imagem do disco rígido à mão, a
próxima etapa é criar o arquivo de configuração do Bochs. Esse
arquivo define como a emulação do Bochs deve ser realizada e
especifica onde encontrar aspectos importantes do ambiente
(arquivo ISO, imagem do disco rígido, etc.). O arquivo de
configuração bochsrc é mostrado na Listagem
2. Esse arquivo define uma plataforma x86 com 128 MB de
RAM, um mouse, monitor padrão Extended Graphics Array, um disco
rígido (definido como ata0-master,
criado por meio do bximage), um
CD-ROM (definido como ata1-master,
apontado para o arquivo plan9.iso, que foi transferido por
download), um arquivo de log para a saída do Bochs
(bochsout.txt) e o dispositivo de inicialização padrão do
CD-ROM.
Listagem 2. O arquivo de configuração bochsrc
# bochsrc # megs: 128 # mouse: enabled=1 # ata0-master: type=disk, path="c.img", mode=flat, cylinders=609, heads=16, spt=63 ata1-master: type=cdrom, path=./plan9.iso, status=inserted # log: bochsout.txt # boot: cdrom |
O Bochs fornece uma grande quantidade de opções que podem ser expressas por meio do arquivo de configuração. Essas opções podem definir quais dispositivos estão disponíveis na plataforma ou os tipos de opções que são expressos (por exemplo: configurações individuais de CPU, como SSE ou a extensão Advanced Encryption Standard).
Para iniciar a instalação do Plan 9 para o Bochs, inicie o Bochs
com a opção -q (para ignorar o menu
inicial) no mesmo diretório da imagem de disco, da imagem ISO e
do arquivo bochsrc:
$ bochs -q |
Esse comando cria uma nova janela que representa a plataforma emulada, mostrada na Figura 3. Como vemos na figura, o emulador reconheceu o disco e o CD-ROM e fez o boot do CD para começar a instalação do sistema operacional Plan 9.
Figura 3. Iniciando o Bochs (instalação do sistema operacional Plan 9)
Conforme a instalação continua, o Plan 9 passa por uma série de etapas de configuração e instalação. A Figura 4 mostra a configuração do disco (para particionamento).
Figura 4. Instalando o sistema operacional Plan 9
O sistema de janelas usado nesses exemplos é o rio do Plan 9. O rio era um sistema de janelas interessante com alguns atributos exclusivos. Por exemplo: as janelas no rio eram o seu próprio namespace e exportavam uma interface de sistema de arquivos para os aplicativos que executam no sistema operacional (permitindo que tal sistema execute dentro de uma janela do rio). O rio veio antes do X Window System para UNIX e forneceu uma base técnica para os sistemas de janelas que o seguiram.
Quando a longa instalação termina, a máquina de emulação é
interrompida e o arquivo bochsrc é atualizado para fazer o boot
a partir do disco (boot: disk).
Observe que, na parte superior da janela (veja a Figura 5), está
o controle do Bochs que mostra os elementos ativos (CD-ROM,
mouse) e um conjunto de controles à direita (para reconfigurar,
suspender ou desligar a máquina emulada).
Figura 5. O Plan 9 executando no contexto do Bochs
Executando outros sistemas operacionais
Uma das vantagens da emulação é a capacidade de executar facilmente outros sistemas operacionais de forma rápida e simples. Você encontra uma lista de imagens de disco no site do Bochs (consulte Recursos) para experimentar outros sistemas operacionais, como o FreeDOS, DLX Linux (imagem do Linux de 10 MB), OpenBSD, GNU/Hurd e KNOPPIX. A Figura 6 mostra o kernel FreeDOS fazendo o kernel no Bochs.
Figura 6. Executando o FreeDOS no Bochs
O FreeDOS é um projeto que foi criado depois que a Microsoft anunciou que não produziria mais o MS-DOS. É usado por várias empresas sob o GPL.
Outras plataformas de emulação
Embora o Bochs seja um aplicativo útil para emulação de plataformas, outras soluções fornecem recursos semelhantes. O QEMU é um dos mais conhecidos, já que fornece não só emulação de plataforma compatível com PC, mas também várias outras arquiteturas de processador (ARM, PowerPC e outras).
São outras plataformas especializadas: o SPIM (um simulador de processador MIPS) e o projeto de simulação da história dos computadores, que fornece emulação de plataforma de vários sistemas importantes em termos históricos (Altair, VAX 11/780, IBM 1130 e outros).
O Bochs é um ótimo emulador de plataforma para executar sistemas operacionais antigos, mas também é uma plataforma ideal para desenvolver sistemas operacionais. O Bochs fornece uma emulação de plataforma eficiente e recursos de depuração que não são fornecidos facilmente no hardware bruto (inclusive um depurador gráfico com todos os recursos). Nada supera o hardware real para o teste de software, mas o Bochs pode fornecer um ambiente de desenvolvimento útil que é móvel entre vários hosts x86 e não x86.
Aprender
- Visite o Web site do Bochs
para obter a versão mais recente e também notícias,
documentação, amostras de imagens de disco e acesso à lista de
e-mails para resolver quaisquer problemas que você tiver. Também
é possível inserir um relatório de erro no site.
- Leia o documento "Virtualization Without Direct Execution or Jitting:
Designing a Portable Virtual Machine Infrastructure" de
autoria de Darek Mihocka e Stanislav Shwartsman para ver os
detalhes do Bochs e saber como ele fornece uma plataforma
eficiente sem execução direta.
-
A Transmeta Corporation (consulte a página da
Transmeta na Wikipédia) desenvolveu a tecnologia de
metamorfose de código que converteu instruções do x86 para o
VLIW nativo para execução. Leia mais sobre as arquiteturas VLIW
e as arquiteturas de CPU que as usam na página das arquiteturas VLIW na Wikipédia.
- "Emulação do Sistema com o QEMU" (developerWorks,
setembro de 2007) trata de um emulador móvel, de software livre,
que executa em vários hosts e emula diversas arquiteturas
diferentes. O QEMU fornece uma solução de virtualização completa
(por meio da emulação).
- "How To Write a
Computer Emulator", de autoria de Marat Fayzullin, faz
uma boa introdução ao tópico e também explica como a emulação de
CPU é implementada junto com a emulação de outros aspectos, como
a memória.
- O sistema operacional
Plan 9 foi criado pela Bell Labs na década de 80 como um
sistema operacional para pesquisa e sucessor do UNIX. O Plan 9
representava todas as interfaces de sistema como arquivos e não
como dispositivos especiais. Continua sendo desenvolvido para
fins de pesquisa e dentro da comunidade de praticantes de hobby.
Saiba mais sobre o rio — o sistema de janelas do Plan 9 — nesta
apresentação de
Rob Pike. Para os que querem experimentar os aplicativos
do Plan 9 no seu sistema operacional favorito (como o Linux), o Plan 9 from User
Space fornece uma implementação de espaço do usuário de
vários dos componentes importantes.
- Na zona Linux do developerWorks, você encontrará muitos artigos e tutoriais de instruções, bem como downloads,
fóruns de discussão e muitos outros recursos para
desenvolvedores e administradores Linux.
- Fique por dentro dos eventos técnicos e webcasts do developerWorks focados
em uma série de produtos IBM e tópicos do segmento de mercado de
TI.
- Participe de um briefing ao vivo e gratuito developerWorks para se
atualizar rapidamente sobre produtos e ferramentas IBM, bem como
tendências do segmento de mercado de TI.
- Assista as demos on demand no developerWorks que abrangem desde
demos de instalação e configuração de produtos para iniciantes
até funcionalidades avançadas para desenvolvedores experientes.
- Siga o DeveloperWorks
no Twitter ou inscreva-se para receber tweets sobre o Linux no developerWorks.
Obter produtos e tecnologias
-
Avalie os produtos IBM da maneira que for melhor para
você: faça download da versão de teste de um produto, avalie um
produto online, use-o em um ambiente de nuvem ou passe algumas
horas na SOA Sandbox aprendendo a implementar Arquitetura
Orientada a Serviços de modo eficiente.
Discutir
- Participe da comunidade My developerWorks. Entre em contato com
outros usuários do developerWorks e explore os blogs, fóruns,
grupos e wikis voltados para desenvolvedores.

M. Tim Jones é arquiteto de firmware integrado e autor de Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming (atualmente em sua segunda edição), AI Application Programming (em sua segunda edição) e BSD Sockets Programming from a Multilanguage Perspective. Seu conhecimento em engenharia varia do desenvolvimento de kernels para naves espaciais geossincrônicas até a arquitetura de sistemas embarcados e o desenvolvimento de protocolos de rede. Tim é arquiteto senior da Emulex Corp. em Longmont, Colorado.