Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Linux Embarcado
Embedded Labworks
SOBRE O INSTRUTOR
Sergio Prado tem mais de 15 anos de experincia em desenvolvimento de
software para sistemas embarcados, em diversas arquiteturas de CPU
(ARM, PPC, MIPS, x86, 68K), atuando em projetos com Linux embarcado e
sistemas operacionais de tempo real.
scio da Embedded Labworks, onde atua com consultoria, treinamento e
desenvolvimento de software para sistemas embarcados:
http://e-labworks.com
Mantm um blog pessoal sobre Linux e sistemas embarcados em:
http://sergioprado.org
Embedded
Labworks
AGENDA DO TREINAMENTO
DIA 1: Introduo e arquitetura de sistemas Linux embarcado, shell
do Linux, hardware, toolchain, bootloader e kernel.
AMBIENTE DE LABORATRIO
/opt/labs/ Ambientedelaboratrio
dl/ Aplicaesepacotesopensource
Queserousadosduranteas
atividadesdelaboratrio
docs/ Documentao
guides/ Guiasdeconsulta(shell,vi,etc)
hardware/ Documentaodohardware
training/ Slideseatividadesdelaboratrio.
videos/ Vdeos
ex/ Exercciosdelaboratrio
tools/ Ferramentasdeusogeral
Embedded
Labworks
ORIENTAES GERAIS
Pergunte...
Troque experincias...
Ajude...
Participe!
Embedded
Labworks
Desenvolvendo Sistemas
Linux Embarcado
OS 3 MARCOS
1970: Engenheiros da Bell Labs, liderados por Ken Thompson e
Dennis Ritchie, criam o sistema operacional UNIX.
Em 1991...
I'm doing a (free) operating system (just a
hobby, won't be big and professional like
gnu) for 386(486) AT clones. This has been
brewing since april, and is starting to get
ready. I'd like any feedback on things
people like/dislike in minix, as my OS
resembles it somewhat (same physical
layout of the file-system (due to practical
reasons) among other things).
Embedded
Labworks
20 ANOS DEPOIS
Embedded
Labworks
O KERNEL
Linux o kernel!
http://www.kernel.org
PRINCIPAIS CARACTERSTICAS
Portabilidade para mais de 20 arquiteturas!
Livre de royalties.
REUSO DE COMPONENTES
Uma das principais vantagens do uso do Linux em sistemas
embarcados: reuso de componentes!
BAIXO CUSTO
Sem royalties: use e abuse de software livre!
CONTROLE TOTAL
Trabalhando com software livre, voc tem o cdigo-fonte de todos
os componentes do seu sistema.
QUALIDADE
Muitos componentes open source so usados em milhares de
sistemas ao redor do mundo.
SUPORTE DA COMUNIDADE
Componentes open-source so desenvolvidos por uma comunidade
de desenvolvedores e usurios.
MITOS
Mito 1: Linux is Free.
Linux no grtis, Linux livre! Do 2o. pargrafo da GPL: When we
speak of free software, we are refering to freedom, not price.
Desenvolvendo Sistemas
Linux Embarcado
Arquitetura bsica
Embedded
Labworks
ARQUITETURA BSICA
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded
Labworks
COMPONENTES DO SISTEMA
Hardware: seu produto!
HARDWARE
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded
Labworks
HARDWARE
Embedded
Labworks
CPU
Suporta mais de 25 arquiteturas diferentes (x86, ia64, ARM, PPC, MIPS,
SuperH, Blackfin, Coldfire, etc).
O projeto uClinux foi criado para que o Linux pudesse ser usado em CPUs
sem MMU.
http://www.uclinux.org/
MEMRIA RAM
Um sistema bem bsico pode funcionar com at 8MB de RAM.
DISPOSITIVOS DE ARMAZENAMENTO
Suporta armazenamento em memria flash NAND ou NOR.
COMUNICAO
O Linux suporta muitos barramentos comuns em sistemas
embarcados: I2C, SPI, CAN, 1-wire, SDIO, USB, etc.
TOOLCHAIN
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded
Labworks
TOOLCHAIN
Conjunto de ferramentas de programao usadas para gerar
determinado produto, seja um software ou mesmo um sistema
completo.
TOOLCHAIN (cont.)
Cdigo-fonte
Host
Toolchain nativo Cross-compiling toolchain
x86
COMPONENTES DO TOOLCHAIN
Compilador (gcc).
TOOLCHAINS PRONTOS
Code Sourcery (ARM):
http://www.codesourcery.com/gnu_toolchains/arm/
MIPS:
http://www.linux-mips.org/wiki/Toolchains
Linaro (ARM):
https://wiki.linaro.org/WorkingGroups/ToolChain
Embedded
Labworks
Buildroot:
http://buildroot.uclibc.org/
Embedded
Labworks
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded
Labworks
Kernel
Rootfs
Memria flash
Embedded
Labworks
BOOTLOADER
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded
Labworks
BOOTLOADER
Todo hardware possui um mecanismo de inicializao, que
responsvel por carregar e executar o bootloader.
FUNCIONALIDADES DO BOOTLOADER
Inicializar o hardware antes de executar o kernel, como por
exemplo configurar a controladora de SDRAM.
PRINCIPAIS BOOTLOADERS
x86:
LILO
Grub
KERNEL
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded
Labworks
INICIALIZAO BSICA
Inicializa CPU, memria e barramentos.
CARACTERSTICAS DO KERNEL
Gerencia execuo de processos e controla acesso memria e
I/O.
ROOTFS
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded
Labworks
COMPONENTES BSICOS
Biblioteca do sistema (uClibc, glibc, eglibc, dietlibc, etc).
Mecanismo de inicializao.
Bibliotecas e aplicaes.
Embedded
Labworks
BUSYBOX
O canivete suo de sistemas embarcados com Linux!
SISTEMA LINUX
BUILD SYSTEM
Um build system capaz de:
Gerar o toolchain.
Compilar e gerar a imagem do bootloader.
Configurar, compilar e gerar a imagem do kernel.
Configurar, compilar bibliotecas e aplicaes, e gerar a imagem final
do rootfs.
Embedded
Labworks
Open source:
Buildroot.
OpenEmbedded.
Yocto.
PTXdist.
LTIB.
Embedded
Labworks
OS 3 PAPIS DO DESENVOLVEDOR
Desenvolvedor de aplicaes: desenvolve aplicaes Linux.
VAMOS COMEAR?
Embedded
Labworks
Desenvolvendo Sistemas
Linux Embarcado
Ambiente de desenvolvimento
Embedded
Labworks
AMBIENTE DE DESENVOLVIMENTO
Um ambiente de desenvolvimento para Linux embarcado
composto normalmente por 3 componentes principais:
Toolchain (ferramentas de compilao).
Buildsystem (ferramenta de gerao do sistema Linux).
IDE para desenvolvimento e debugging de aplicaes.
Embedded
Labworks
SOLUES
Existem solues prontas, fornecidas por empresas como
MontaVista, Wind River e TimeSys, com seu prprio ambiente e
ferramentas de desenvolvimento. Elas usam um conjunto de
componentes open-source e proprietrios.
SO DE DESENVOLVIMENTO
fortemente recomendado o uso do Linux como sistema
operacional para desenvolvimento em Linux embarcado!
HOST E TARGET
Host: mquina de desenvolvimento.
Serial
Host Target
Ethernet
Embedded
Labworks
PERMISSES
Linux um sistema multi-usurio:
root o usurio administrador que tem permisso para executar
qualquer operao privilegiada como mudar a configurao do
sistema ou montar um sistema de arquivos.
Outros usurios no tem todos os mesmos privilgios de
administrao.
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
CARACTERSTICAS
CPU i.MX535 de 1GHz da Freescale (Cortex-A8).
DIAGRAMA DE BLOCOS
Embedded
Labworks
REFERNCIAS E DOCUMENTAO
A documentao do hardware esta disponvel no ambiente de
laboratrio em docs/guides:
CPU_DS_iMX53.pdf (i.MX53 datasheet)
BOARD_DS_IMX53.pdf (board reference)
BOARD_UG_IMX53.pdf (user's guide)
BSP_LINUX_mx53.tar.gz (Linux BSP)
Recursos na internet:
http://www.freescale.com/imxquickstart
http://community.freescale.com/community/imx
Embedded
Labworks
CONECTANDO O HARDWARE
Embedded
Labworks
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
Toolchain
Embedded
Labworks
O QUE SO TOOLCHAINS?
Ao p da letra, e traduzindo literalmente, toolchain uma "corrente
de ferramentas". Na prtica, um conjunto de ferramentas de
compilao.
TIPOS DE TOOLCHAIN
As ferramentas de desenvolvimento normalmente disponveis em um
desktop GNU/Linux so chamadas de toolchain nativo.
Este toolchain roda na sua mquina e compila cdigo para ser executado
na sua mquina, geralmente um x86.
Cdigo-fonte
Host
Toolchain nativo Cross-compiling toolchain
x86
COMPONENTES DO TOOLCHAIN
Debugger (GDB)
Toolchain
Embedded
Labworks
COMPILADOR GCC
Compilador GNU C, o famoso compilador de software livre.
http://gcc.gnu.org/
BINUTILS
Binutils um conjunto de ferramentas para manipular arquivos
binrios para uma arquitetura especfica.
http://www.gnu.org/software/binutils/
BIBLIOTECA C
O que a biblioteca C?
Interface entre as aplicaes e o kernel.
Aplicaes
API para desenvolvimento de aplicaes.
Biblioteca C
O toolchain depende da biblioteca C, j que
ele ir link-la com sua aplicao para
gerar os binrios para a arquitetura-alvo.
Kernel
Diversas bibliotecas C esto disponveis:
glibc, eglibc, uClibc, dietlibc, etc.
Embedded
Labworks
GLIBC
Biblioteca C do projeto GNU.
http://www.gnu.org/software/libc/
Dependendo do seu sistema, pode no ser uma boa escolha, j que possui um
consumo considervel de espao em disco/flash e memria RAM.
Existe uma variante chamada eglibc (embedded glibc) compatvel com a glibc
(binrio e cdigo-fonte) e com foco em sistemas embarcados. Atualmente a
eglibc usada inclusive em algumas distribuies Linux.
Embedded
Labworks
UCLIBC
Mais leve e projetada para sistemas embarcados.
http://www.uclibc.org/
Em uma arquitetura ARM, chega a ser 4 vezes menor que a glibc, com
aproximadamente 600K!
Altamente configurvel.
KERNEL HEADERS
Sabemos que o toolchain depende da biblioteca C do sistema.
USANDO TOOLCHAINS
Existem basicamente duas solues para instalar e usar um
toolchain:
1. Usar um toolchain pronto, fornecido por uma empresa ou pela
comunidade.
2. Configurar e gerar seu prprio toolchain de acordo com suas
necessidades.
Embedded
Labworks
Possveis escolhas:
Toolchain fornecido pelo fabricante do chip (ex: Freescale).
Toolchain fornecido por empresas especializadas (ex: Mentor Graphics).
Toolchain fornecido pela comunidade (ex: Linaro).
INSTALANDO E USANDO
Basta seguir o procedimento do fornecedor da soluo.
LABORATRIO
USANDO FERRAMENTAS
Existem ferramentas que automatizam o processo de gerao de
toolchains.
ALGUMAS FERRAMENTAS
Crosstool (suporta apenas glibc):
http://www.kegel.com/crosstool
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
Bootloader
Embedded
Labworks
BOOTLOADERS
O bootloader o cdigo responsvel por:
Inicializao bsica do hardware.
Carregar outro binrio (normalmente um sistema operacional) da
memria flash, da rede ou de outro dispositivo de armazenamento
no voltil para a RAM.
Passar o controle da CPU para este binrio.
LPC3250 (NXP)
Tenta o boot pela porta serial (modo de servio), SPI,
ROM Code barramento externo e flash NAND, carregando o cdigo para a
SRAM (56KB).
Linux Kernel
Roda da RAM. Assume o controle do sistema (a partir daqui, o
bootloader no existe mais).
Embedded
Labworks
i.MX28 (FREESCALE)
Cdigo de boot em ROM iniciado quando o i.MX28 resetado. L
ROM Code as chaves de seleo do modo de boot para identificar a fonte
do boot (USB, SD/MMC, NAND, I2C, SPI, JTAG).
Linux Kernel
Roda da RAM. Assume o controle do sistema (a partir daqui, o
bootloader no existe mais).
Embedded
Labworks
i.MX53 (FREESCALE)
Cdigo de boot em ROM iniciado quando o i.MX53 resetado. L
ROM Code o registrador BOOT_MODE ou um conjunto de GPIOs para
determinar o dispositivo de boot (NOR/NAND, carto SD/MMC,
SATA, etc).
U-Boot (1) Carrega um pedao do U-Boot para a RAM interna (72K). Este
cdigo do U-Boot ir inicializar o hardware (clock, SDRAM, etc)
e carregar o U-Boot completo para a RAM.
Linux Kernel
Roda da RAM. Assume o controle do sistema (a partir daqui, o
bootloader no existe mais).
Embedded
Labworks
OMAP3530/AM35x (TI)
Procura por imagens de boot na NAND, UART, USB e MMC, e
ROM Code carrega para a SRAM (64KB). Um boto pode mudar a ordem da
busca.
Linux Kernel
Roda da RAM. Assume o controle do sistema (a partir daqui, o
bootloader no existe mais).
Embedded
Labworks
AT91 (ATMEL)
Procura por imagens de boot em diversos dispositivos de
ROM Code
armazenamento, e carrega para a SRAM (4KB).
Linux Kernel
Roda da RAM. Assume o controle do sistema (a partir daqui, o
bootloader no existe mais).
Embedded
Labworks
U-BOOT
Bootloader open-source (GPLv2) mais utilizado atualmente.
http://www.denx.de/wiki/U-Boot
FUNCIONALIDADES DO U-BOOT
Exibir informaes do hardware (memria, perifricos, etc).
Etc!
Embedded
Labworks
BAIXANDO O U-BOOT
de responsabilidade do fabricante disponibilizar os fontes do U-Boot
(porte) para a sua plataforma.
CONFIGURANDO O U-BOOT
O U-Boot suporta diversas arquiteturas e plataformas. Antes de
compilar o U-Boot, voc precisa configur-lo para a sua
plataforma com o comando abaixo:
make<board>_config
COMPILANDO O U-BOOT
Para compilar o U-Boot, basta executar o comando make passando o prefixo
do cross-compiler. Exemplo:
makeCROSS_COMPILE=armlinux
Se voc quiser fazer uma compilao limpa, ou configurar o U-Boot para outra
placa, execute antes o comando abaixo para fazer a limpeza:
makemrproper
Embedded
Labworks
GRAVANDO O U-BOOT
O processo de gravao do U-Boot pode ser feito de diferentes
formas, dependendo do target:
O bootloader de 1o. estgio pode fornecer um mecanismo de escrita
na flash.
O sistema pode ser configurado para iniciar por uma mdia removvel
(Ex: carto SD).
A CPU pode fornecer um monitor de boot que se comunica via serial
ou USB.
JTAG.
Etc!
Embedded
Labworks
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
Kernel Linux
Embedded
Labworks
VISO GERAL
Aplicao Aplicao
Biblioteca Biblioteca Aplicao User space
Biblioteca C
Kernel
Hardware
Embedded
Labworks
HISTRICO
O kernel um dos componentes do sistema operacional, que requer
bibliotecas e aplicaes para prover funcionalidades aos usurios.
COLABORAO
Embedded
Labworks
ARQUITETURA
Embedded
Labworks
GERENCIAMENTO DE PROCESSOS
Um processo um programa em execuo, que possui um identificador (PID) e
esta associado um conjunto de recursos como arquivos abertos, mapeamento
de memria, etc.
Cada thread possui um contador de programa, uma regio do stack e uma cpia
dos registradores da CPU.
GERENCIAMENTO DE MEMRIA
O Linux trabalha com o mecanismo de memria virtual para
gerenciar a memria do sistema.
CHAMADAS DE SISTEMA
O Linux possui aproximadamente 300 chamadas de sistema.
VERSIONAMENTO
Antes da verso 2.6:
Uma rvore de verses estveis (1.0, 2.0, 2.2, 2.4).
Uma rvore de verses de desenvolvimento (2.1, 2.3, 2.5).
CICLO DE RELEASE
Processo de desenvolvimento a cada aproximadamente 3 meses.
Merge window: 2 semanas (at sair 3.X-rc1).
Bug fixing: 6 a 10 semanas (3.X-rc2, 3.X-rc3, etc).
FONTES DO KERNEL
A verso oficial do cdigo-fonte do kernel liberada por Linus
Torvalds encontra-se em:
http://www.kernel.org
LICENA
Todo o cdigo-fonte do Linux software livre e liberado sob a
licena GPLv2.
LICENA (cont.)
Portanto, ilegal distribuir um binrio do kernel com mdulos
compilados estaticamente.
LABORATRIO
CONFIGURANDO O KERNEL
O kernel possui centenas de drivers de dispositivo, diversos
protocolos de rede e muitos outros itens de configurao.
CONFIGURAO
As configuraes so salvas em um arquivo chamado .config no diretrio
principal dos fontes do kernel, e possuem o formato key=value. Exemplo:
CONFIG_ARM=y
make xconfig
Embedded
Labworks
make gconfig
Embedded
Labworks
make nconfig
Embedded
Labworks
make menuconfig
Embedded
Labworks
OPES DE CONFIGURAO
Opes booleanas (verdadeiro/falso):
[]Opodesabilitada
[*]Opohabilitada
Opes de 3 estados:
<>Opodesabilitada
<*>Opohabilitada(builtin)
<M>Opohabilitada(mdulo)
DEPENDNCIAS
Na configurao do kernel, podem existir dependncias entre
funcionalidades:
Exemplo 1: o driver de um dispositivo I2C depende da habilitao do
barramento I2C para ser habilitado.
Exemplo 2: o driver do barramento USB habilitado automaticamente
quando o driver de um dispositivo USB habilitado.
Embedded
Labworks
Portanto, para configurar para ARM por exemplo, voc precisa especificar a
arquitetura:
makeARCH=armmenuconfig
CONFIGURAES PR-DEFINIDAS
Arquivos de configurao pr-definidos para diversas plataformas
esto disponveis em arch/<arch>/configs/.
LABORATRIO
Configurando o kernel
Embedded
Labworks
COMPILANDO O KERNEL
Depois de configurado, para compilar nativamente basta executar:
make
INSTALANDO O KERNEL
Para instalar o kernel, basta executar o comando abaixo:
makeinstall
FAZENDO A LIMPEZA
Remove todos os arquivos gerados (imagens, arquivos-objeto, etc).
makeclean
Onde:
console = dispositivo que ser usado como console
root = dispositivo onde se encontra o sistema de arquivos
rootfstype = tipo do sistema de arquivos (JFFS2)
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
Rootfs
Embedded
Labworks
SISTEMAS DE ARQUIVO
Sistemas de arquivo so usados para organizar dados, de forma
hierrquica, em diretrios e arquivos disponveis em dispositivos
de armazenamento (locais ou remotos).
O COMANDO MOUNT
O comando mount permite montar um sistema de arquivo:
mountttypedevicemountpoint
Onde:
-t type opcional e identifica o tipo do sistema de arquivo (fat, ext3,
jffs2, etc).
device o dispositivo de armazenamento, ou local na rede, onde
esto armazenados os dados.
mountpoint o diretrio onde os arquivos sero acessados, tambm
chamado de ponto de montagem.
Embedded
Labworks
O COMANDO UMOUNT
O comando umount permite desmontar um sistema de arquivo:
umount<dispositivooupontodemontagem>
Montando um pendrive:
mounttvfat/dev/sda1/mnt/usbkey
Verificando o contedo:
ls/mnt/usbkey
docsprog.cpicture.pngmovie.avi
LOCALIDADES DO ROOTFS
O rootfs pode ser montado de diferentes localidades:
Da partio de um HD.
Da partio de um pendrive.
Da partio de um carto SD.
Da partio de uma memria flash NAND.
Pela rede, atravs do protocolo NFS.
Da memria, pr-carregado pelo bootloader.
MONTANDO O ROOTFS
Partio de um HD ou pendrive USB:
root=/dev/sdXY, onde X uma letra que indica o dispositivo e Y
o nmero da partio.
Exemplo: root=/dev/sdb2
Partio de um carto SD
root=/dev/mmcblkXpY, onde X um nmero de identificao do
dispositivo, e Y o nmero da partio.
Exemplo: root=/dev/mmcblk0p2
Embedded
Labworks
Host Target
Servidor NFS Cliente NFS
Initramfs
Kernel
(cpio archive)
INITRAMFS
Vantagens:
Pode ser usado como um passo intermedirio para montar o
verdadeiro rootfs (mecanismo comum em desktops e servidores).
Em Linux embarcado, pode ser a soluo para sistemas com
pouqussimos recursos. O boot mais rpido, e como o sistema de
arquivo j esta em memria, as aplicaes tambm iniciam mais
rapidamente.
Desvantagens:
Como o initramfs montado em RAM, o armazenamento voltil
(perde as informaes ao reiniciar).
Embedded
Labworks
ORGANIZAO DO ROOTFS
A organizao do rootfs no Linux padronizada pelo Filesystem
Hierarcy Standard.
http://www.pathname.com/fhs/
ARQUIVOS DE DISPOSITIVO
Um conceito muito importante trazido do mundo Unix: boa parte
dos objetos do sistema so representados como arquivos,
permitindo que as aplicaes manipulem estes objetos usando uma
API comum (open, read, write, etc).
EXEMPLOS
Exemplos de arquivos de dispositivo:
lsla/dev/ttyS*/dev/sda1
brwrw1rootdisk8,12012012506:54/dev/sda1
crwrw1rootdialout4,642012012506:54/dev/ttyS0
crwrw1rootdialout4,652012012506:54/dev/ttyS1
crwrw1rootdialout4,662012012506:54/dev/ttyS2
crwrw1rootdialout4,672012012506:54/dev/ttyS3
A INICIALIZAO
Aps montar o rootfs, o kernel ir tentar executar uma aplicao
de inicializao, tambm chamado de processo init.
A INICIALIZAO (cont.)
Se nenhuma destes programas de inicializao forem encontrados,
o kernel entra em pnico!
Kernelpanicnotsyncing:Noinitfound.
Kernel
Monta o rootfs indicado por root=
Inicia a aplicao init
/sbin/init
Inicia outros servios e aplicaes
Rootfs
Embedded
Labworks
MECANISMOS DE INICIALIZAO
Depois que o kernel chamou a aplicao init, responsabilidade do
rootfs o restante da inicializao do sistema.
SYSTEM V INIT
O sysvinit possui basicamente os seguintes componentes:
Aplicao init (o pai de todos os processos).
Arquivo de configurao /etc/inittab.
Scripts de inicializao em /etc/init.d/ ou /etc/rc.d/.
Embedded
Labworks
/etc/inittab
#Startupthesystem
null::sysinit:/bin/mounttprocproc/proc
null::sysinit:/bin/mkdirp/dev/pts
#nowrunanyrcscripts
::sysinit:/etc/init.d/rcS
#Putagettyontheserialport
ttySAC0::respawn:/sbin/gettyLttySAC0115200vt100
#Stufftodoforthe3fingersalute
::ctrlaltdel:/sbin/reboot
#Stufftodobeforerebooting
null::shutdown:/usr/bin/killallsyslogd
Embedded
Labworks
/etc/init.d/rcS
#!/bin/sh
foriin/etc/init.d/S??*;do
case"$i"in
*.sh)
.$i
;;
*)
$istart
;;
esac
done
Embedded
Labworks
/etc/init.d/
lslinit.d/
total8
rwxrxrx1rootroot4082011083108:44rcS
rwxrxrx1rootroot4782011090815:02S01logging
rwxrxrx1rootroot13652011083108:44S20urandom
rwxrxrx1rootroot2822011083108:44S40network
rwxrxrx1rootroot10922011090816:05S50dropbear
rwxrxrx1rootroot732011091314:50S60leds
Embedded
Labworks
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
Kernel modules
Embedded
Labworks
MONOLTICO X MICROKERNEL
Embedded
Labworks
O KERNEL LINUX
O Linux um kernel monoltico.
COMPILANDO OS MDULOS
Para compilar apenas os mdulos, basta executar:
makemodules
INSTALANDO OS MDULOS
Para instalar os mdulos nativamente, basta executar o comando
abaixo:
makemodules_install
CARREGANDO UM MDULO
O comando insmod carrega apenas um mdulo. necessrio
passar o caminho completo do mdulo.
insmod<module_path>.ko
DESCARREGANDO UM MDULO
O comando rmmod descarrega apenas um mdulo. Possvel apenas
se o mdulo no estiver mais em uso. Deve-se passar apenas o
nome do mdulo, sem a extenso .ko e sem seu caminho completo.
rmmod<module_name>
PASSANDO PARMETROS
Descobrindo os parmetros disponveis do mdulo:
modinfo<module>
LOGS DO KERNEL
O kernel mantm um log de mensagens na memria em um buffer
circular.
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
Sistemas de Arquivo
Embedded
Labworks
SISTEMAS DE ARQUIVO
Um sistema de arquivo uma representao dos dados dentro de
um dispositivo de armazenamento.
DISPOSITIVOS DE ARMAZENAMENTO
No Linux, os dispositivos de armazenamento so classificados em dois
tipos: dispositivos de bloco e memrias flash.
cat/proc/partitions
majorminor#blocksname
80312571224sda
81303903744sda1
821sda2
858665088sda3
Embedded
Labworks
JOURNALING
Aplicao
Um sistema de arquivo com journal
foi projetado para manter a User space Escreve no arquivo
consistncia dos dados mesmo Kernel space
aps um crash do sistema ou um
reboot inesperado. Escreve uma
entrada no journal
JOURNALING (cont.)
Reboot
Devido ao mecanismo de
journaling, o sistema de
arquivo nunca fica em um
Journal estado inconsistente
No vazio? (corrompido).
Descarta entradas
incompletas no
journal
Os ltimos dados salvos,
no entanto, podem ser
Sim perdidos.
Executa
journal
Sistema de arquivo OK
Embedded
Labworks
QUAL ESCOLHER?
Na prtica, voc usar o ext3 ou o ext4 em dispositivos de bloco.
CRAMFS
O CramFS (Compressed ROM Filesystem) um exemplo de sistema
de arquivo comprimido de apenas leitura, desenvolvido
especialmente para sistemas embarcados ou dispositivos com
baixa capacidade de armazenamento.
http://sourceforge.net/projects/cramfs/
SQUASHFS
O SquashFS uma espcie de sucessor do CramFS, visando atingir os
mesmos objetivos, mas com melhor compresso, melhor
performance de leitura e suporte arquivos e sistemas maiores.
http://squashfs.sourceforge.net
TMPFS
O tmpfs um sistema de arquivo til para armazenar dados
temporrios em RAM (arquivos temporrios, logs, etc).
Como usar:
mountttmpfstmp/tmp
MISTURANDO TUDO
Voc pode dividir seu dispositivo de bloco em
parties: squashfs
Dispositivo de Bloco
Uma partio squashfs para o rootfs (kernel, rootfs
comprimido
binrios, etc). Salva espao, e por ser apenas
leitura, fica protegido de alteraes acidentais no
sistema de arquivos.
ext3
Uma partio ext3 para leitura e escrita de dados dados e
do usurio e de configurao. configurao
Dados temporrios em RAM com o tmpfs.
Tmpfs
RAM
dados
volteis
Embedded
Labworks
LABORATRIO
MEMRIAS FLASH
Algumas limitaes diferem as memrias flash de dispositivos de bloco
tradicionais como HDs.
Por este motivo, existe uma tcnica chamada de BBM (Bad Block
Management).
Hardware
Embedded
Labworks
Cada memria tem o seu MTD chip driver para possibilitar o acesso
ao hardware da flash. Mas cada sistema pode usar um ou mais
MTD user modules.
MTDCHAR
O driver mtdchar implementa o mdulo "char device" da flash. Ele
cria um dispositivo de caractere para cada partio de um dispositivo
MTD no sistema, normalmente chamado de /dev/mtdX, onde X o
nmero da partio.
Com este mdulo, voc tem acesso sequencial (byte a byte) de toda a
flash.
MTD-UTILS
O mtd-utils um conjunto de ferramentas para manipular
dispositivos MTD:
mtdinfo retorna informaes detalhadas do dispositivo.
flash_eraseall apaga todo o dispositivo.
flashcp escreve em memrias flash NOR.
nandwrite escreve um memrias flash NAND.
mkfs.jffs2 e mkfs.ubifs cria os respectivos sistemas de arquivo na
flash.
MTDBLOCK
O driver mtdblock implementa o mdulo "block device" da flash.
JFFS2
um dos sistemas de arquivo para flash mais antigos ainda em
utilizao.
http://www.linux-mtd.infradead.org/doc/jffs2.html
YAFFS2
um dos sucessores do JFFS2, com o objetivo de corrigir os
problemas de performance em memrias flash muito grandes.
http://www.yaffs.net/
UBIFS
Evoluo do jffs2, dos mesmos desenvolvedores do mtd-utils,
disponvel a partir do kernel 2.6.27.
http://www.linux-mtd.infradead.org/doc/ubifs.html
Sim Sim
No
MTD
Sim
squashfs ext2 (noatime)
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
Build system
Embedded
Labworks
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded
Labworks
INTEGRANDO TUDO
O que vimos at aqui foi um passo-a-passo de como desenvolver
um sistema Linux embarcado do zero.
DISTRIBUIO PRONTA
Existem diversas distribuies comerciais prontas para Linux
embarcado: MontaVista, Timesys Linux, Wind River Linux, etc.
Vantagens:
Simplicidade de uso.
Facilidade na instalao de novos pacotes.
Framework de desenvolvimento pronto e funcional.
Embedded
Labworks
BUILD SYSTEM
O build system permite gerar um sistema Linux completo do zero.
Desvantagens:
Tempo extra para configurar a ferramenta.
necessrio conhecimento do funcionamento da ferramenta e de
mecanismos de compilao para adicionar novos pacotes se
necessrio e corrigir possveis erros de compilao.
Embedded
Labworks
FERRAMENTAS
Buildroot, desenvolvido pela comunidade:
http://www.buildroot.net
FERRAMENTAS (cont.)
OpenEmbedded, mais flexvel (e tambm mais complexo):
http://www.openembedded.org
LTIB
LTIB (Linux Target Image Builder) uma ferramenta usada para
desenvolver e liberar BSPs (Board Support Packages).
http://ltib.org/
BUILDROOT
Desenvolvido pelos mesmos mantenedores da uClibc.
CONFIGURANDO O BUILDROOT
Permite configurar, dentre outras opes:
Arquitetura e modelo da CPU.
Toolchain.
Bootloader.
Kernel.
Bibliotecas e aplicaes.
Tipos das imagens do rootfs (ext2, jffs2, etc).
Para configurar:
makemenuconfig
Embedded
Labworks
CONFIGURANDO O BUILDROOT
Embedded
Labworks
COMPILANDO O BUILDROOT
Configurao tambm fica armazenada em um arquivo .config.
Para compilar:
make
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
Bibliotecas e aplicaes
Embedded
Labworks
BIBLIOTECAS E APLICAES
Uma das grandes vantagens do Linux a enorme quantidade de
bibliotecas e aplicaes disponveis que podem ser usadas
livremente no seu projeto.
PROCURANDO COMPONENTES
Procurar em sites que hospedam projetos de software livre:
http://www.freshmeat.net
http://directory.fsf.org
http://sourceforge.net
http://code.google.com/hosting
https://github.com
ESCOLHENDO COMPONENTES
Ao escolher um componente open source para seu projeto, voc precisa
levar em considerao:
Requisitos tcnicos: o componente deve satisfazer os requisitos tcnicos
do seu projeto. Mas no esquea tambm de que voc mesmo pode
implementar estas melhorias! E depois compartilhar!
Atividade do projeto: o projeto deve ser ativo, releases frequentes, frum
movimentado. importante ter a garantia de manuteno e suporte.
Qualidade do componente: seu uso em diversos sistemas e uma
comunidade ativa em geral significam uma qualidade relativamente boa.
Licena: a licena pode ser um impeditivo para o uso de determinado
componente no seu produto.
Embedded
Labworks
Desenvolvendo Sistemas
Linux Embarcado
LINGUAGENS DE SCRIPT
Interpretadores das mais comuns linguagens de script esto
disponveis:
Shell script
Python
Perl
Lua
Ruby
TCL
PHP
Embedded
Labworks
EDITORES DE TEXTO
vi: editor de texto em Linux embarcado mais usado.
FERRAMENTAS DE REDE
dropbear: implementao de um cliente e servidor SSH. Bom para
ter acesso remoto seguro e transferir arquivos.
SERVIDORES WEB
Busybox http server: servidor HTTP do Busybox, com suporte CGI e
autenticao, ocupando apenas 9K de tamanho. No suporta SSL.
Boa: servidor HTTP simples e rpido. Trabalha com apenas uma thread de
execuo, multiplexando o processamento de conexes simultneas. Sem
suporte controle de acesso e SSL.
lighttpd: servidor HTTP mais completo, timo para gerenciar altas cargas,
rpido e seguro, com suporte controle de acesso, CGI e SSL.
Embedded
Labworks
MULTIMEDIA
Gstreamer: framework multimdia, permite codificar e decodificar
diversos containers e formatos multimdia. Suporta codecs de hardware
atravs de plugins.
BANCO DE DADOS
SQLite: uma pequena biblioteca em C que implementa um
gerenciador de banco de dados leve que pode ser embarcado no
seu projeto.
a escolha de banco de dados em Linux embarcado.
Pode ser usado como uma biblioteca normal.
Pode ser at compilada estaticamente com uma aplicao
proprietria, j que o SQLite liberado sob domnio pblico.
Embedded
Labworks
OUTRAS BIBLIOTECAS
Bibliotecas de compresso/descompresso.
Bibliotecas de criptografia.
Bibliotecas de rede.
Etc!
Embedded
Labworks
Desenvolvendo Sistemas
Linux Embarcado
Licenas
Embedded
Labworks
LICENAS
Todo software sob a licena de software livre d todos os
usurios 4 liberdades bsicas:
Liberdade de usar.
Liberdade de estudar.
Liberdade de copiar.
Liberdade de modificar e distribuir cpias modificadas.
LICENAS (cont.)
Licenas de software livre possuem basicamente duas categorias:
Licenas copyleft.
Licenas non-copyleft.
GPL
GNU General Public Licence.
GPL (cont.)
Boa parte dos programas coberta pela GPLv2.
LGPL
GNU Lesser General Public Licence.
LICENAS NON-COPYLEFT
Verses modificadas de um software sob licena non-copyleft
podem ser mantidas proprietrias, desde que voc atribua a
autoria da verso original.
LICENAS (EXEMPLOS)
Voc modificou o Linux, o Busybox, o U-Boot ou outro software GPL:
Voc precisa liberar o software com as modificaes realizadas sob
a mesma licena, e estar pronto para distribuir o cdigo-fonte para
seus clientes.
LICENAS (EXEMPLOS)
Voc criou uma aplicao que utiliza uma biblioteca LGPL:
Voc pode manter sua aplicao proprietria, mas precisa linkar
dinamicamente com a biblioteca.
APLICANDO LICENAS
No existe uma regra nica para aplicar licenas em software open
source, j que cada licena possui sua prpria receita de bolo. De
qualquer forma, um projeto open source possui normalmente:
Uma indicao da licena utilizada e uma cpia completa desta
licena no site do projeto.
Uma cpia completa da licena utilizada no diretrio principal dos
fontes do projeto. Normalmente este arquivo nomeado como
LICENCE, LICENCE.TXT, COPYRIGHT ou COPYING.
Um descritivo da licena utilizada no cabealho de cada
arquivo-fonte do projeto. O contedo deste descritivo depende da
licena utilizada.
Embedded
Labworks
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
COMO CROSS-COMPILAR?
Basicamente, temos duas solues:
Adaptar o pacote ao seu build system.
Compilar manualmente.
MECANISMOS DE COMPILAO
Todo software open-source possui um sistema de build ou
mecanismo de compilao. Dentre eles, podemos destacar:
Makefile simples: necessrio ler e entender o que alterar para
cross-compilar o componente.
Autotools: um dos mais utilizados, iremos estudar em mais detalhes.
Cmake: Mais novo e mais simples que o autotools, usado em projetos
grandes como o KDE.
Qmake: Criado pela Trolltech para ser usado no Qt.
Embedded
Labworks
MAKE
O make uma ferramenta bastante usada para compilar
programas e bibliotecas.
http://www.gnu.org/software/make/
MAKEFILE (EXEMPLO)
TOOLCHAIN:=/opt/labs/ex/09/buildroot/output/host/usr/bin/
CROSS_COMPILE:=armlinux
PATH:=${TOOLCHAIN}:${PATH}
all:
${CROSS_COMPILE}gccteste.coteste
clean:
rmRf*.oteste
Embedded
Labworks
LABORATRIO
AUTOTOOLS
Autotools o nome dado ao sistema de build do projeto GNU, que
contm um conjunto de ferramentas para auxiliar na compilao de
uma aplicao ou biblioteca.
AUTOTOOLS (cont.)
O Autotools composto pelas seguintes ferramentas:
Autoconf: ferramenta responsvel por gerar os scripts de
configurao.
Automake: ferramenta responsvel por gerar os makefiles.
Libtool: ferramenta responsvel por compilar e criar de forma
portvel as bibliotecas da aplicao.
AUTOTOOLS (EXEMPLO)
#configurandootoolchain
exportPATH=/usr/local/armlinux/bin:$PATH
exportCC=armlinuxgcc
#configurandoaaplicao
./configurehost=armlinux
#compilando
make
#instalando
makeDESTDIR=/home/<user>/work/rootfsinstall
Embedded
Labworks
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
Integrando componentes
Embedded
Labworks
INTEGRANDO COMPONENTES
Na integrao de componentes open source com seu projeto, s vezes
necessrio realizar algumas modificaes para faz-lo funcionar, otimizar
o uso de espao em disco, corrigir algum bug, etc.
PATCHES
Como ento documentar as alteraes realizadas em projetos
open-source? Atravs de patches!
EXEMPLO DE PATCH
diffraunetcat/src/netcat.cnetcat2/src/netcat.c
netcat/src/netcat.c2011100112:03:55.000000000
+++netcat2/src/netcat.c2012031212:06:01.830816531
@@445,7+445,7@@
exit(EXIT_FAILURE);
}
debug_dv("Argumentsparsingcomplete!Total");
+printf("Linhaadicionada\n");
#if0
/*puredebuggingcode*/
c=0;
Embedded
Labworks
APLICANDO PATCHES
Com o arquivo de patch temos documentado as alteraes
realizadas no projeto original.
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
Bibliotecas grficas
Embedded
Labworks
Controladora Controladora
VGA LCD Hardware
Embedded
Labworks
Input core
Input driver Input driver Input driver Input driver Input driver Kernel
SDL
SDL (Simple Directmedia Layer) uma biblioteca multimdia para
acesso de baixo nvel em dispositivos de entrada (teclado, mouse,
joystick, etc) e sada (vdeo, udio, etc).
http://www.libsdl.org
DIRECTFB
Biblioteca de baixo nvel para trabalhar com interface grfica.
http://www.directfb.org
X.ORG KDRIVE
Kdrive (antes Tiny-X) a implementao do servidor X para
sistemas embarcados.
http://www.x.org
Desenvolvendo Sistemas
Linux Embarcado
Toolkits grficos
Embedded
Labworks
GTK
Famoso toolkit usado no Gnome, disponibilizando uma API baseada
em widgets para o desenvolvimento de aplicaes grficas.
http://www.gtk.org
Maemo
Interface
proprietria
Embedded
Labworks
Qt
Famoso toolkit usado no KDE, tambm disponibilizando uma API
baseada em widgets para o desenvolvimento de aplicaes
grficas.
http://qt-project.org/
Implementao em C++.
EXEMPLOS DE USO DO QT
Express GPS
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
Debugging
Embedded
Labworks
GDB
O GDB (GNU Debugger) o debugger padro do projeto GNU,
disponvel para diversas arquiteturas.
http://www.gnu.org/software/gdb/
DEBUG REMOTO
Problema 1: os fontes esto na mquina de desenvolvimento e o binrio
est rodando na mquina alvo.
ARQUITETURA GDB
Host Target
ARCHlinuxgdb gdbserver
Conexo
Serial ou
Ethernet
Binrios e bibliotecas Binrios e bibliotecas
com smbolos de sem smbolos de
debugging debugging
Embedded
Labworks
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
Desenvolvimento de aplicaes
Embedded
Labworks
DESENVOLVENDO APLICAES
Um sistema Linux embarcado um sistema Linux normal, apenas
com um conjunto menor e mais enxuto de componentes.
LINGUAGEM DE PROGRAMAO
A linguagem padro para desenvolvimento de aplicaes no nvel do
sistema a linguagem C. A biblioteca C padro esta sempre presente em
sistemas Linux.
AMBIENTES DE DESENVOLVIMENTO
Eclipse: Uma IDE completa baseada em plugins, ideal para
desenvolver outras IDEs. Roda em cima de uma JVM. Diversas
empresas de sistemas embarcados tem usado a plataforma
Eclipse para desenvolver IDEs para seus produtos. Ex: MontaVista
DevRocket, TimeSys TimeStorm, Windriver Workbench, TI Code
Composer, Freescale Codewarrior, etc.
CONTROLE DE VERSO
CVS: Foi bastante popular, mas hoje no mais usado em novos
projetos.
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
Ferramentas de anlise
Embedded
Labworks
VALGRIND
O Valgring um framework de instrumentao para se criar
ferramentas de anlise dinmica de aplicaes.
http://valgrind.org/
if((ptr=buf=(unsignedchar*)malloc(size+3))==NULL)
return(1);
*ptr++=STX;
strncpy(ptr,data,size);
ptr+=size;
*ptr++=ETX;
if(txSerial(buf,size+3)==1)
return(2);
free(buf);
return0;
}
Embedded
Labworks
STRACE
O strace (system calls tracer) permite capturar todas as chamadas
de sistema realizadas pela sua aplicao.
http://sourceforge.net/projects/strace/
Bastante til para debugar uma aplicao que fecha sem exibir
nenhuma mensagem de erro, ou ento para fazer engenharia
reversa em uma aplicao a qual voc tenha somente o binrio.
EXEMPLO STRACE
stracecatMakefile
execve("/bin/cat",["cat","Makefile"],[/*38vars*/])=0
brk(0)=0x98b4000
access("/etc/ld.so.nohwcap",F_OK)=1ENOENT(Nosuchfileordirectory)
mmap2(NULL,8192,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,1,0)=
access("/etc/ld.so.preload",R_OK)=1ENOENT(Nosuchfileordirectory)
open("/etc/ld.so.cache",O_RDONLY)=3
fstat64(3,{st_mode=S_IFREG|0644,st_size=111585,...})=0
mmap2(NULL,111585,PROT_READ,MAP_PRIVATE,3,0)=0xb7f69000
close(3)=0
access("/etc/ld.so.nohwcap",F_OK)=1ENOENT(Nosuchfileordirectory)
open("/lib/tls/i686/cmov/libc.so.6",O_RDONLY)=3
fstat64(3,{st_mode=S_IFREG|0755,st_size=1442180,...})=0
mprotect(0xb7f62000,4096,PROT_NONE)=0
mmap2(0xb7f63000,12288,PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE,3,0x15c)=0xb7f63000
mmap2(0xb7f66000,9840,PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS,1,0)=0xb7f66000
close(3)=0
...
Embedded
Labworks
LTRACE
O ltrace (library calls tracer) permite capturar todas as chamadas
de bibliotecas realizadas e sinais recebidos pela sua aplicao.
http://freshmeat.net/projects/ltrace/
EXEMPLO LTRACE
ltraceneditindex.html
sscanf(0x8274af1,0x8132618,0x8248640,0xbfaadfe8,0)=1
sprintf("const0","const%d",0)=7
strcmp("startScan","const0")=1
strcmp("ScanDistance","const0")=1
strcmp("const200","const0")=1
strcmp("$list_dialog_button","const0")=1
strcmp("$shell_cmd_status","const0")=1
strcmp("$read_status","const0")=1
strcmp("$search_end","const0")=1
strcmp("$string_dialog_button","const0")=1
strcmp("$rangeset_list","const0")=1
strcmp("$calltip_ID","const0")=1
...
Embedded
Labworks
SUMRIO LTRACE
ltraceccat/etc/resolv.conf
%timesecondsusecs/callcallsfunction
22.100.0007957951setlocale
8.510.0003061532read
7.810.0002812811write
7.650.0002751372__fxstat
6.840.000246614__freading
6.310.0002271132fclose
4.390.0001581581open
4.060.0001461461close
3.920.0001411411posix_fadvise
3.590.000129642fileno
3.560.000128642__fpending
...
100.000.00359729total
Embedded
Labworks
LABORATRIO
Desenvolvendo Sistemas
Linux Embarcado
E agora?
Embedded
Labworks
RECURSOS ONLINE
Site do kernel Linux:
http://www.kernel.org
Grupo sis_embarcados:
https://groups.google.com/group/sis_embarcados
Embedded Labworks