Componentes de um sistema Linux embarcado
Autor: Flavio Alves | Publicado: 2011-11-14T08:32:00-08:00

O Linux embarcado não é um exatamente um software único no qual se carrega em uma unidade de memória e, quando se liga o computador, ele passa a executar e a controlar o computador. O Linux, tanto em sua forma embarcada quanto em sua forma convencional, é composta de componentes de software que, juntos, realizam as atividades comumente observadas em sistemas operacionais convencionais.

O intuito deste artigo é apresentar os componentes de um sistema operacional Linux embarcado e mostrar brevemente as dificuldades encontradas pelos profissionais especializados em Linux embarcado em suas atividades.

De um modo geral, os três principais componentes de um sistema operacional Linux são os seguintes:

Boot Loader
Kernel
Root Filesystem

Cada um destes componentes será descrito separadamente.

Boot Loader

O objetivo preliminar do boot loader é carregar o kernel do Linux e iniciar o procedimento de boot. Na prática, trata-se do software responsável pela inicialização da placa na qual o Linux será executado.
Dentre suas atividades, podemos citar:

Detecção e ativação dos periféricos presentes no hardware
Carregar o kernel do Linux localizado em seus mais diversos lugares possíveis (memória Flash, disco rígido, servidor de arquivos na rede, cartão de memória externa, outro computador comunicado pela porta serial, entre outros)
Executar o kernel do Linux - procedimento de boot - enviando os parâmetros iniciais de boot que apresentam os comportamentos iniciais do sistema.

O kernel do Linux é executado a partir da memória RAM do sistema. Uma vez iniciado o sistema operacional, este realiza uma comunicação inicial de boot, na qual o bootloader informa alguns parâmetros ao Linux de forma que ele execute o boot de forma apropriada. Entre alguns parâmetros, pode-se destacar: console na tela ou na porta serial, endereço IP inicial do equipamento, localização do root filesystem, entre outros.

O boot loader, da mesma forma que o kernel, deve ser específico para a placa. O boot loader deve reconhecer a memória RAM, ROM e interfaces de comunicação presentes na placa, além, claro, do próprio processador onde é executado. Geralmente para cada hardware existe um boot loader específico com os respectivos drivers funcionando perfeitamente. Caso o sistema possua uma memória na qual o bootloader não possua suporte, é necessário que este suporte seja implementado. Este trabalho é geralmente realizado na forma de drivers para boot-loaders.

Exemplos de boot-loaders para Linux:

U-Boot
Redboot
GRUB
Lilo
Kernel

Trata-se do núcleo do Linux propriamente dito. É onde se encontra o núcleo do sistema operacional (escalonador), o gerenciamento de memória, de periféricos. É onde se encontram as intruções de gerenciamento de processos e dispositivos em si.

Dentro do universo de sistemas embarcados, é no kernel onde se encontram os drivers - os códigos que realizam a comunicação entre os diversos mecanismos que o hardware se liga com o "mundo" e o sistema operacional bem como as aplicações que são executadas neste sistema operacional.

Da mesma forma que o boot-loader, existe um kernel para cada hardware. E para cada hardware, existe um conjunto de drivers responsáveis pela realização da comunicação do dispositivo. Quando um projetista de software se depara com um novo trabalho de personalização de linux para uma determinada placa, o primeiro passo é identificar os periféricos e checar a disponibilidade de drivers para os componentes escolhidos pelo projetista de hardware. Caso existam drivers disponíveis, eles podem ser aproveitados. Caso contrário, novos drivers devem ser implementados. E cada driver possui uma complexidade diferente.

Root Filesystem

Trata-se do componente que "dá a cara' do Linux instalado no hardware. Trata-se do sistema de arquivos raiz. É o local onde são armazenados os aplicativos, as bibliotecas e os arquivos de dados usados em aplicações. O que diferencia as distribuições são as diferentes maneiras nas quais os sistemas de arquivos são implementados e organizados.

Dentre as atividades de um projetista de Linux embarcado, a definição do root filesystem é de extrema importância. As principais razões são:
Talvez não seja possível compilar uma determinada biblioteca (por exemplo, uma biblioteca de plotagem de gráficos) para um determinado processador, ou para uma determinada versão de processador,
Talvez o root filesystem seja tão grande que não se tenha mais espaço sobrando na memória flash interna do equipamento para o software aplicativo, ou para os arquivos de log, ...
Uma abordagem muito comum usada, principalmente pelos iniciantes ou para aqueles que não pretendem se aprofundar muito na parte interna do Linux é a de adotar uma distribuição padrão conhecida (por exemplo, Debian) e usá-la diretamente em um sistema embarcado. Nestes casos, a placa na qual o Linux vai rodar possui uma interface de cartão de memória externo (cartão SD) e o root filesystem é instalado no cartão. Uma versão mínima do Debian necessita de aproximadamente 500MB para funcionar, então nestes casos um cartão de 1 GB resolveria.

Porém, existem situações onde o Linux deve rodar em uma memória Flash de 8MB, incluindo o kernel e o bootloader. Nestas situações, dificilmente será possível utilizar uma distribuição convencional e outras estratégias para elaboração do Linux são necessárias.