Introdução
uClinux é um sistema operacional aplicável a microcontroladores sem MMUs (Memory Management Unit). O sistema inclui suporte ao kernel Linux versões 2.0, 2.4 e 2.6 além de um conjunto de aplicativos em nível de usuário, bibliotecas e toolchains. A versão original foi inicialmente derivada do kernel Linux 2.0.
Algumas vantagens do uClinux:
- Código-fonte disponível gratuitamente;
- Robustez e confiabilidade;
- Sistema modular, configurável e escalável;
- Suporte dispositivos de rede e internet;
- etc…
Para testes e determinados tipos de comparações, nem sempre possuímos o hardware final em mãos. Dessa forma, nas próximas seções apresentamos uma maneira de se executar e testar a viabilidade deste sistema operacional através do uso de uma máquina virtual.
1) Instalação da máquina virtual
Para executar o uClinux faremos uso da máquina virtual conhecida como skyeye. skyeye é um emulador que em nosso caso provê suporte virtual à placa AT91 ARM7TDMI. Sua engine é derivada do debugger GDB (GNU Debugger) – anteriormente era conhecida como GDB/ARMulator.
Ainda, consideramos aqui que o sistema host faz uso do sistema operacional Ubuntu.
Para instalar a máquina virtual skyeye, execute o seguinte comando no shell do Ubuntu:
[sourcecode language=”bash”]
$ apt-get install skyeye
[/sourcecode]
2) Instalação do toolchain uClinux
Em nosso caso, como estamos compilando software para uma plataforma diferente daquela host será necessário fazermos uso de um compilador cruzado – toolchain. Aqui iremos utilizar uma versão de 2007 do uClinux. Assim sendo, a versão do toolchain deve ser também compatível com o mesmo. A instalação do toolchain suportado pelo uClinux pode ser feita à partir dos seguintes passos:
– Download do arquivo arm-linux-tools-20070808 aqui.
Algumas considerações:
- O arquivo é razoavelmente grande (aprox. 270MB);
- Dependendo da largura de banda de sua internet, o download pode demorar um pouco.
Uma vez baixado e com permissões de root, faça:
- Extraia o arquivo baixado para o diretório raiz “/”;
- Verifique que o toolchain foi corretamente instalado na pasta /usr/local.
- Obs.: Se não quiser instalar diretamente no diretório raiz, opcionalmente você poderá extrair o arquivo baixado para uma pasta local. Após isso, altere o conteúdo da variável de sistema PATH para o caminho onde foram instalados os executáveis.
3) Instalação da distribuição uClinux
Após baixar e instalar o toolchain relacionado, é necessário baixar os arquivos da distribuição uClinux que utilizaremos. Para tanto, esta versão da distribuição deve estar em conformância com o toolchain que foi instalado. Execute os seguintes passos:
- Baixe a distro – arquivo uClinux-dist-20080808.tar.bz2 – através do endereço: http://www.uclinux.org/pub/uClinux/dist/;
- Extraia o arquivo baixado dentro de sua pasta home;
- Instale o genromfs – Utilitário responsável por auxiliar na geração do sistema de arquivos de nossa distro. Para tanto, execute o seguinte comando no console:
[sourcecode language=”bash”]
$ apt-get install genromfs
[/sourcecode]
4) Configuração da distribuição uClinux
Uma vez baixada e extraída, precisaremos agora configurar nossa distribuição uClinux de forma que ela contemple o hardware e software desejados. Para isso, entre no diretório “uClinux-dist” que você extraiu no passo anterior (dentro de sua pasta home) e execute as seguintes ações:
[sourcecode language=”bash”]
$ cd uClinux-dist
$ make menuconfig
[/sourcecode]
Após os comandos acima, uma janela irá se abrir como na Figura abaixo.
- Selecione a opção “Vendor/Product Selection”;
- Marque GDB para o campo “Vendor” e “Skyeye” em “GDB Products” (como mostrado na Figura abaixo).
- Para voltar no nível anterior do menu, pressione seguidamente 2x a tecla ESC.
- Agora, procure pela opção “Kernel/Library/Defaults Section” e pressione a tecla ENTER;
- Marque a opção “Customize Kernel Settings” (Figura abaixo);
- Marque também a opção “Customize Application/Library Settings”;
- Pressione ESC seguidamente 2x, saia e salve as configurações.
Ao sair, o menu de configuração do kernel que estamos utilizando será automaticamente carregado. Será necessário fazermos as seguintes alterações:
- No menu “Boot Options” -> “Default kernel command string”, entre com a seguinte string: “init=/bin/sh”.
Salve novamente e saia. Logo após, o menu para configuração de bibliotecas e aplicações aparecerá. Se achar prudente, adicione ou remova bibliotecas/aplicativos conforme sua necessidade.
5) Criando o sistema de arquivos principal (root filesystem)
Até agora configuramos todo o nosso ambiente e as variáveis que nosso sistema embarcado terá. Fizemos isso através da customização da distribuição Linux e seu kernel relacionado. Agora veremos como criar o sistema de arquivos principal que será o pacote principal da nossa distribuição uClinux. Para tanto, execute as seguintes instruções abaixo:
- Dentro do diretório uClinux, o seguinte comando:
[sourcecode language=”bash”]
$ make
[/sourcecode]
Tal comando fará com que todos os arquivos da distribuição sejam compilados. O processo total de compilação pode variar entre 5 e 15 minutos – dependendo do hardware que você possui. Ao final, verifique a existência dos seguintes arquivos no diretório “images/” que fica dentro da sua pasta uClinux-dist:
- romfs-inst.log
- linux
- boot.rom
6) Criação do arquivo de boot
Para que o sistema possa iniciar é necessário que exista um arquivo descrevendo as configurações do sistema alvo. Nessa passo iremos criar esse arquivo com o conteúdo apropriado para o nosso sistema. Dentro do diretório “images/“, crie um arquivo chamado skyeye.conf e insira o seguinte conteúdo no mesmo:
[sourcecode language=”bash”]
#skyeye config file sample
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=./boot.rom
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
[/sourcecode]
7) Inicialização da máquina virtual
Após ter sido configurada, a máquina virtual com o sistema necessita ser inicializada. Para tanto, execute os seguintes comando à partir da pasta “images/” dentro do diretório uClinux-dist:
[sourcecode language=”bash”]
$ skyeye -e linux
[/sourcecode]
Pronto, à partir deste comando a máquina virtual será carregada e você já entrará com acesso ao terminal da mesma. Dessa forma conseguimos emular uma distribuição uClinux em uma arquitetura x86.