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:
- Hardware: o seu produto;
- Bootloader: iniciado pelo hardware, responsável pela inicialização básica, carregamento e execução do kernel Linux;
- Kernel Linux: núcleo do sistema operacional. Gerencia CPU, memória e I/O, exportando serviços para as aplicações do usuário;
- 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;
- 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:
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.
Componentes principais:
- Compilador (gcc);
- Assembler e Linker (binutils);
- Biblioteca C padrão (glibc, uclibc, dietlibc, musl, etc).
Algumas opções de toolchains prontas;
- GNU Toolchain: Suporte para até 39 arquiteturas ;
- Code Sourcery: ARM ;
- Linaro: ARM ;
- MIPS .
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:
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.








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?
Olá Gustavo,
Por um custo um pouco maior, pode usar a BeagleBone Black ou BeagleBone Green:
https://beagleboard.org/black
https://beagleboard.org/green
Pelo mesmo custo, pode usar uma Odroid-C1+:
https://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
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!
Por nada Gustavo! Conte conosco!! Abraços
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.
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.
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 »
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.
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:
https://www.busybox.net/license.html
Tem como fazer engenharia reversa de um firmware destes?
Sim é possível.
Porém existem diversas estratégias que podem ser seguidas afim de dificultar o acesso à memória de dados, bem como a análise e exploração dos dados.
Pode-se, por exemplo, criptografar o sistema de arquivos.
Boa tarde Diego Sueiro.
Eu tenho algumas duvidas de como usar um linux embarcado e proteger todo o software (bootloader, kernel, sistema de arquivos e o proprio software contra copia e contra engenharia reversa.
Você teria mais informações a respeito ?
Att,
Evandro Pinheiro
Evandro,
Esse vídeo mostra um caso de uso interessante:
Secure Embedded Linux Product – A Success Story -…: https://youtu.be/5zSC_dClriE
Ola Diego, você já chegou a aplicar essa segurança do sistema rodando Linux em memoria flash?
Vinicius,
Nunca implementei o verified boot.
Em relação a encriptação do sistemas de arquivos apenas em micro sdcards.
Abraços.
O rootfs com uma analise critica é claro é possível extrair utilizando binwalk, consegui até nos sistemas com squashfs. Vale a pena dar uma olhada.
linux é o futuro mesmo
o bom e velho linux Simples,rapido e eficas