Anatomia de um Sistema Linux embarcado

Linux embarcado

Um sistema Linux embarcado não se difere, no quesito sistêmico, de um sistema Linux desktop. A mesma estrutura e conceitos são aplicados em ambos os domínios. A principal diferença está nos requisitos de processamento, armazenamento, consumo de energia e confiabilidade. Na maioria dos sistemas Linux embarcado, os recursos disponíveis são limitados e muitas vezes a interface com usuário é bastante limitada ou simplesmente não existe.

 

Seguem alguns exemplos de sistemas embarcados que utilizam o Linux como sistema operacional:

  • Roteador;
  • Setup-box;
  • Smart TV;
  • Controlador Lógico Programável (CLP);
  • Câmera Digital.

 

Arquitetura Básica

 

Na arquitetura básica de um sistema Linux podemos identificar cinco componentes básicos:

 

arq_bas_linux_emb

 

 

  1. Hardware: o seu produto;
  2. Bootloader: iniciado pelo hardware, responsável pela inicialização básica, carregamento e execução do kernel Linux;
  3. Kernel Linux: núcleo do sistema operacional. Gerencia CPU, memória e I/O, exportando serviços para as aplicações do usuário;
  4. Rootfs: sistema de arquivos principal. Possui as bibliotecas do sistema para uso dos serviços exportados pelo kernel, além das bibliotecas e aplicações do usuário;
  5. Toolchain: conjunto de ferramentas para gerar os artefatos de software do sistema.

 

 

Hardware

 

Vamos considerar um roteador Wi-Fi doméstico como exemplo de plataforma de hardware:

 

hw_linux_emb

 

O Linux kernel é capaz de rodar em mais de 20 arquiteturas de CPU diferentes. Como por exemplo: x86, ia64, ARM, PowerPC, MIPS, SuperH, Blackfin, Coldfire, Microbalze.

Tem suporte à arquiteturas de 32 e 64 bits e arquiteturas que não possuem MMU (Memory Management Unit).

 

Suporta armazenamento em memórias NAND, FLASH, MMC e hard disks.

 

No nosso exemplo, um sistema básico pode funcionar com até 8MB de RAM e 2MB de armazenamento, uma vez que, poucos drivers, funcionalidades do kernel e bibliotecas e aplicativos são necessárias para que o sistema desempenhe as funções desejadas.

 

 

Toolchain

 

Conjunto de ferramentas de programação usadas para gerar determinado produto, seja um software ou mesmo um sistema completo. Quando a plataforma de desenvolvimento (host) é diferente da plataforma alvo (target), chamamos o toolchain de cross-compiling toolchain.

 

toolchain_linux_emb

 

 

Componentes principais:

  • Compilador (gcc);
  • Assembler e Linker (binutils);
  • Biblioteca C padrão (glibc, uclibc, dietlibc, musl, etc).

 

Algumas opções de toolchains prontas;

 

 

Artefatos de software de um Sistema Linux embarcado

 

 

Os artefatos de software principais de um sistema Linux embarcado são: Bootloader, Kernel e Rootfs. Tomando-se como base o hardware proposto, estes artefatos estão organizados na memória flash da seguinte maneira:

 

flash_linux_emb

 

 

Bootloader

 

 

Toda CPU possui um mecanismo de inicialização, que é responsável por carregar e executar o bootloader. Em algumas arquiteturas de CPU é necessário o uso de um bootloader de primeiro estágio, no qual é carregado pelo processador e executado a partir de sua memória interna. Em alguns casos esse bootloader de primeiro estágio está concatenado junto ao bootaloader.

As principais funcionalidades do bootloader são:

  • Inicializar o hardware antes de executar o kernel como, por exemplo, configurar a controladora de SDRAM;
  • Passar parâmetros para o kernel;
  • Prover mecanismos para carregar e gravar o kernel e o sistema de arquivos na memória flash ou cartão SD;
  • Inicializar via rede ou pelo cartão SD;
  • Rotinas de diagnóstico de hardware.

 

Principais bootloaders utilizados em sistemas embarcados:

  • x86:
    • LILO;
    • Grub;
    • Syslinux.
  • ARM, MIPS, PPC e outras arquiteturas:
    • U-Boot;
    • Barebox;
    • Redboot.

 

 

Kernel

 

 

O Kernel é o coração do nosso sistema. No boot ele é responsável por:

  • Inicializar CPU, memória e barramentos;

  • Configurar a memória virtual (se tiver MMU);

  • Inicializar os device drivers;

  • Iniciar o escalonador de tarefas;

  • Iniciar threads do kernel;

  • Montar sistema de arquivos principal (rootfs) e chamar o processo init.

 

Como principais características podemos apontar:

  • Gerencia execução de processos e controla acesso à memória e I/O;

  • Gerenciamento do kernel space X user space;

  • Interface de user space com kernel space via chamadas do sistema (system calls);

  • Acesso ao hardware via arquivos de dispositivo;

  • Gerenciamento dinâmico dos módulos do kernel.

 

 

Rootfs

 

 

Após ter sido montado pelo kernel e ter o processo init (PID = 1) iniciado, o rootfs utiliza seu mecanismo de inicialização (ex.: SysVinit, Systemd etc) para inicializar os processos e aplicações do sistema. É responsável por prover as bibliotecas de sistema e de usuário.

 

Alguns exemplos de aplicações para sistemas embarcados:

  • Dropbear: cliente e servidor SSH;
  • Thttpd: servidor web;

  • DirectFB: biblioteca gráfica;

  • SQLite: banco de dados;

  • Busybox: o canivete suíço de sistemas embarcados com Linux.

 

 

 

Referência

 

Material do Treinamento Desenvolvendo Sistemas Linux Embarcado da Embedded Labworks.

 

 

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Diego Sueiro
Formado em Engenharia de Controle e Automação pela UNIFEI e CEO do Embarcados, atualmente trabalho na Inglaterra com Desenvolvimento de Sistemas Linux Embarcado Real Time. Sou consultor e desenvolvedor de software para Sistemas Embarcados com vasta experiência em projetos com processadores de 8bits a 32bits, sistemas bare metal, RTOS, Linux Embarcado e Android Embarcado. Um apaixonado por Pink Floyd e Empreendedorismo.

23
Deixe um comentário

avatar
 
11 Comment threads
12 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
10 Comment authors
Henrique RossiGustavo Trento da SilvaPedro NetoVinicius MacielEvandro Pinheiro Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Matheus Quick
Visitante
Matheus Quick

linux é o futuro mesmo

Gustavo More Gaspar
Visitante
Gustavo More Gaspar

o bom e velho linux Simples,rapido e eficas

Gustavo Trento da Silva
Visitante
Gustavo Trento

Caros, Sou leigo no assunto e como estudante de redes, estou fazendo meu TCC no uso de embarcados com monitoramento de rede para pequenas empresas, usando ferramentas gráficas (Nagios, Zabbix e Ntop). Preciso defender a escolha de um embarcado que rode Linux (Raspbian), fácil aquisição no Brasil e baixo custo. Que opções além do Raspberry Pi 2 eu tenho disponível no mercado?

Henrique Rossi
Visitante

Olá Gustavo,

Por um custo um pouco maior, pode usar a BeagleBone Black ou BeagleBone Green:

http://beagleboard.org/black
http://beagleboard.org/green

Pelo mesmo custo, pode usar uma Odroid-C1+:

http://www.hardkernel.com/main/products/prdt_info.php?g_code=G143703355573

Por se tratar de um projeto de TCC, eu iria de BeagleBone Black ou Raspiberry Pi 2, vai encontrar muito suporte da comunidade, inclusive aqui do pessoal do Embarcados.

Se precisar de ajudar, estamos à disposição!!

Abraços,
Henrique

Gustavo Trento da Silva
Visitante
Gustavo Trento

Muito obrigado Henrique.
Vou ver no SENAI (onde faço o curso de redes) se eles tem um BeagleBone Black para me emprestar.

O Raspberry Pi 2 eu já tenho e já estava usando.

Vou justificar o uso destes dois pela configuração de hardware, baixo custo, facilidade de suporte e documentação na internet e disponibilidade de aquisição no mercado nacional.

Com certeza vou precisar de alguma ajuda durante o meu TCC!
Antecipadamente, agradeço a ajuda!

Henrique Rossi
Visitante

Por nada Gustavo! Conte conosco!! Abraços

Pedro Neto
Visitante
Pedro Neto

Olá boa tarde! Eu gostaria de saber o seguinte: Tenho um programa em um hard (ex. CLP) que tem um tipo de arquitetura por exemplo ARM ou MISP, bom o mesmo programa tenho em um PC, como é que estes dispositivos com arquitetura diferente conversam e em tempo real, uma vez que pela serial no PC, eu vejo o que está rodando no CLP.

Diego Sueiro
Visitante
Diego Sueiro

Olá Pedro,

Este tipo de aplicação é bem comum, onde equipamentos com diferentes arquiteturas conversam entre sim.
Neste caso eles estão utilizando a interface serial como canal de comunicação, e muito provavelmente estão sendo enviadas mensagens codificadas em ASCII. Sendo assim a mensagem não é dependente de arquitetura.

Pedro Neto
Visitante
Pedro Neto

Agradeço sua resposta, mas ainda não está claro pra mim: Temos 4 situações: 1 - Eu entendi que o Toolchain é para desenvolvimento de Programas, Sistema, Programa de usuários... (no caso do CLP, o programa executivo e o programa do usuário) 2 - Para este equipamento e outros equipamentos (CLP, Inversores de Frequencia, Módulos de controle, etc), normalmente desenvolvemos o programa de usuário no PC e carregamos no controlador via RS-232 ou de outra forma. Pergunto: Por trás disso, entra o ToolChain? 3 - Através de um PC X86, por um programa de Supervisório, o usuário altera o programa o… Leia mais »

trackback

[…]  Anatomia de um Sistema Linux embarcado […]

trackback

[…] - Anatomia de um Sistema Linux embarcado  […]

trackback

[...] Anatomia de um Sistema Linux embarcado [...]

trackback

[...] Anatomia de um Sistema Linux embarcado [...]

trackback

[...] Anatomia de um Sistema Linux embarcado [...]

Cleiton Bueno
Visitante

Eu sempre tive uma duvida quando as licenças das libs e serviços utilizados quando se pretende vender um produto com Linux embedded ou vender o projeto apenas, como trata-se este caso.
Por exemplo, utilizo Busybox, devo adquirir algum meio ao mesmo para poder vender produtos ou sistemas, ou deverar ser disponibilizado na internet. Tanto que na minha graduação utilizei apenas libs MIT e BSD o resto ou tirei ou adaptei.
Mas essa é uma duvida que me persegue.

Diego Sueiro
Visitante
Diego Sueiro

Cleiton,

As licenças BSD e MIT são bastante permissivas. Elas basicamente obrigam que as informações de Copyright sejam divulgadas.

No caso do Busybox que segue a licença GPLv2, você é obrigado a disponibilizar a seus clientes o código fonte e as modificações que foram realizadas. No link abaixo há uma explicação bastante clara de como proceder caso esteja usando o Busybox em seu produto:
http://www.busybox.net/license.html