Anda di halaman 1dari 344

Desenvolvendo Sistemas

Linux Embarcado

Embedded Labworks

Por Sergio Prado. So Paulo, Novembro de 2012


Copyright Embedded Labworks 2004-2013. All rights reserved.
Embedded
Labworks

SOBRE ESTE DOCUMENTO


Este documento baseado no material de treinamento
disponibilizado pela Free Electrons em:
http://free-electrons.com/doc/training/embedded-linux
Este documento disponibilizado sob a Licena Creative
Commons BY-SA 3.0.
http://creativecommons.org/licenses/by-sa/3.0/legalcode

Os fontes deste documento esto disponveis em:


http://e-labworks.com/treinamentos/linux/source
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.

DIA 2: Sistemas de arquivo, mdulos do kernel, dispositivos de


armazenamento e sistemas de build.

DIA 3: Compilando e desenvolvendo bibliotecas e aplicaes,


licenas de software, aplicaes grficas em Qt, debugging e
tracing.
Embedded
Labworks

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...

Expresse seu ponto de vista...

Troque experincias...

Ajude...

Participe!
Embedded
Labworks

Desenvolvendo Sistemas
Linux Embarcado

Introduo Linux embarcado


Embedded
Labworks

OS 3 MARCOS
1970: Engenheiros da Bell Labs, liderados por Ken Thompson e
Dennis Ritchie, criam o sistema operacional UNIX.

1983: Richard Stallman, projeto GNU e o conceito de software livre.


Comea o desenvolvimento do gcc, gdb, glibc e outras ferramentas
importantes.

1991: Linus Torvalds, projeto do kernel Linux, um sistema


operacional UNIX-like. Em conjunto com o projeto GNU, nasce o
sistema operacional GNU/Linux.
Embedded
Labworks

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

VDEO (OS 20 ANOS DO LINUX)


Embedded
Labworks

O KERNEL
Linux o kernel!
http://www.kernel.org

As distribuies Linux (Ubuntu, Fedora, Debian, Slackware, etc)


integram o kernel Linux, bibliotecas e aplicaes.

O correto chamar estas distribuies de sistemas operacionais


GNU/Linux.

Linux embarcado o uso do kernel Linux e de diversos


componentes open-source em sistemas embarcados.
Embedded
Labworks

PRINCIPAIS CARACTERSTICAS
Portabilidade para mais de 20 arquiteturas!

Escalabilidade: o mesmo kernel roda em relgios, em celulares e


em servidores da bolsa de valores!

Livre de royalties.

Roda em dispositivos com pouqussimos recursos.


Embedded
Labworks

PRINCIPAIS CARACTERSTICAS (cont.)


Estabilidade: capaz de rodar por muito tempo sem precisar de um
nico reboot.

Modularidade: capaz de rodar apenas o que necessrio para seu


projeto.

Multicore: suporta mltiplas CPU.

Recursos infinitos disponveis na internet.


Embedded
Labworks

REUSO DE COMPONENTES
Uma das principais vantagens do uso do Linux em sistemas
embarcados: reuso de componentes!

A comunidade open-source j fornece implementaes prontas para


as principais funcionalidades dos projetos: suporte hardware,
protocolos de rede, bibliotecas grficas, criptografia, etc.

Suporte hardware. Ex: Linux foi o primeiro kernel a suportar os


padres USB 2.0, USB 3.0, bluetooth, etc.

Desenvolvimento rpido baseado em componentes prontos.

Foco no seu produto, core business, time-to-market!


Embedded
Labworks

BAIXO CUSTO
Sem royalties: use e abuse de software livre!

Se sua aplicao usa apenas software livre, incluindo as


ferramentas de desenvolvimento, seu custo de software zero! Seu
nico custo ser a aquisio de know-how.

Permite que voc possa investir mais no hardware e em


treinamento para sua equipe!
Embedded
Labworks

CONTROLE TOTAL
Trabalhando com software livre, voc tem o cdigo-fonte de todos
os componentes do seu sistema.

Liberdade para modificar, otimizar, debugar, melhorar.

No fica preso prioridade que fornecedores ou terceiros daro ao


seu projeto.

Total controle do software do seu projeto!


Embedded
Labworks

QUALIDADE
Muitos componentes open source so usados em milhares de
sistemas ao redor do mundo.

Normalmente a qualidade bem melhor que a de softwares


proprietrios (muitas pessoas olhando o mesmo problema!).

Permite uma slida base para seu projeto.

claro, nem todo software open software de boa qualidade,


portanto tome cuidado. Procure sempre aqueles mais usados em
outros projetos e com uma comunidade mais ativa.
Embedded
Labworks

SUPORTE DA COMUNIDADE
Componentes open-source so desenvolvidos por uma comunidade
de desenvolvedores e usurios.

As comunidades podem te fornecer suporte de alta qualidade. Voc


tem contato inclusive com os principais desenvolvedores dos
projetos.

Geralmente melhor que o suporte em empresas comerciais, mas


voc precisa saber como usar corretamente o suporte da
comunidade.

Permite voc resolver os problemas mais rapidamente!


Embedded
Labworks

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.

Mito 2: No consigo proteger a propriedade intelectual do meu


produto.
Consegue sim, basta tomar alguns cuidados com licenas de
software!
Embedded
Labworks

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!

Bootloader: iniciado pelo hardware, responsvel pela inicializao


bsica, carregamento e execuo do kernel Linux.

Kernel Linux: Ncleo do sistema operacional. Gerencia CPU, memria e


I/O, exportando servios para as aplicaes do usurio.

Rootfs: sistema de arquivos principal.


Biblioteca C: interface entre o kernel e as aplicaes do usurio.
Bibliotecas e aplicaes do usurio.

Toolchain: conjunto de ferramentas para gerar os binrios do sistema.


Embedded
Labworks

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).

32/64 bits: no foi feito para microcontroladores!

Originalmente projetado para CPUs com MMU (Memory Management Unit).

O projeto uClinux foi criado para que o Linux pudesse ser usado em CPUs
sem MMU.
http://www.uclinux.org/

Mas boa parte do uClinux j foi integrado rvore oficial do kernel,


possibilitando o uso do Linux em diversas CPUs sem MMU (m68k e arm
sem MMU,H8/300 da Hitachi,ADI Blackfin, etc).
Embedded
Labworks

MEMRIA RAM
Um sistema bem bsico pode funcionar com at 8MB de RAM.

Ideal para comear: 32MB.


Embedded
Labworks

DISPOSITIVOS DE ARMAZENAMENTO
Suporta armazenamento em memria flash NAND ou NOR.

Suporta dispositivos de armazenamento em bloco, incluindo discos


e cartes SD/MMC.

Um sistema bem bsico pode funcionar com 2M de armazenamento


(ou at menos!).
Embedded
Labworks

COMUNICAO
O Linux suporta muitos barramentos comuns em sistemas
embarcados: I2C, SPI, CAN, 1-wire, SDIO, USB, etc.

E tambm os principais protocolos de rede: Ethernet, Wi-Fi,


Bluetooth, CAN, IPv4, IPv6, TCP, UDP, etc.

Se o barramento ou protocolo no possuir restries de licena,


bem provvel que esteja implementado no kernel.

J protocolos ou barramentos com restries de licena tem


dificuldade para entrar na rvore oficial do kernel (Ex: Zigbee).
Embedded
Labworks

CRITRIOS PARA SELEO


Certifique-se de que o hardware j suportado pelo Linux e por um
bootloader open-source.

Suporte nas verses oficiais dos projetos (kernel e bootloader)


bem melhor: maior qualidade e novas verses disponveis.

A diferena entre uma plataforma suportada na rvore de projeto


original do kernel, e outra plataforma no suportada de forma
oficial, pode te trazer grandes consequncias em termos de custo e
tempo de desenvolvimento!
Embedded
Labworks

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.

Quando a plataforma de desenvolvimento (host) diferente da


plataforma alvo (target), chamamos o toolchain de
cross-compiling toolchain.
Embedded
Labworks

TOOLCHAIN (cont.)

Cdigo-fonte
Host
Toolchain nativo Cross-compiling toolchain
x86

Binrio x86 Binrio ARM Target


x86 ARM
Embedded
Labworks

COMPONENTES DO TOOLCHAIN
Compilador (gcc).

Assembler e Linker (binutils).

Standard C Library (glibc, uclibc, dietlibc, etc).


Embedded
Labworks

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

FERRAMENTAS OPEN SOURCE


Crosstool-ng:
http://crosstool-ng.org/

Buildroot:
http://buildroot.uclibc.org/
Embedded
Labworks

SISTEMA LINUX EMBARCADO

Biblioteca Biblioteca

Biblioteca Biblioteca

Toolchain Biblioteca C

Linux kernel

Bootloader

Hardware
Embedded
Labworks

SISTEMA LINUX EMBARCADO (NA FLASH)


Bootloader

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.

O bootloader responsvel por carregar e executar o kernel do


sistema operacional (no nosso caso, o Linux).
Embedded
Labworks

FUNCIONALIDADES DO BOOTLOADER
Inicializar o hardware antes de executar o kernel, como por
exemplo configurar a controladora de SDRAM.

Passar parmetros para o kernel.

Prover mecanismos para carregar e gravar o kernel e o sistema de


arquivos na memria flash.

Inicializar via rede ou pelo carto SD.

Rotinas de diagnstico de hardware.


Embedded
Labworks

PRINCIPAIS BOOTLOADERS
x86:
LILO
Grub

ARM, MIPS, PPC e outras arquiteturas:


U-Boot
Barebox
Redboot
Embedded
Labworks

KERNEL

Biblioteca Biblioteca

Biblioteca Biblioteca

Toolchain Biblioteca C

Linux kernel

Bootloader

Hardware
Embedded
Labworks

INICIALIZAO BSICA
Inicializa CPU, memria e barramentos.

Configura a memria virtual (se tiver MMU).

Inicializa os device drivers.

Inicia o escalonador de tarefas.

Inicia threads do kernel.

Monta sistema de arquivos principal (rootfs) e chama o processo


init.
Embedded
Labworks

CARACTERSTICAS DO KERNEL
Gerencia execuo de processos e controla acesso memria e
I/O.

Conceito de 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 dinmico dos mdulos do kernel.


Embedded
Labworks

EXEMPLO DE SYSTEM CALL


Embedded
Labworks

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

APLICAES PARA EMBARCADOS


Dropbear: cliente e servidor SSH (~110K).

Thttpd: servidor web (~88K).

DirectFB: biblioteca grfica (~1,4MB).

SQLite: Banco de dados (~250KB).


Embedded
Labworks

BUSYBOX
O canivete suo de sistemas embarcados com Linux!

Combina verses mais leves de ferramentas UNIX em um nico


binrio, otimizado por tamanho.

Geralmente as ferramentas so mais limitadas em termos de


funcionalidades comparadas s originais.
Embedded
Labworks

BUSYBOX TUDO ISSO EM ~1MB!


Embedded
Labworks

SISTEMA LINUX

Desenvolver um sistema Linux embarcado


como brincar de Lego!
Embedded
Labworks

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

ALGUNS BUILD SYSTEMS


Proprietrios:
Monta Vista.
Wind River.
TimeSys.

Open source:
Buildroot.
OpenEmbedded.
Yocto.
PTXdist.
LTIB.
Embedded
Labworks

OS 3 PAPIS DO DESENVOLVEDOR
Desenvolvedor de aplicaes: desenvolve aplicaes Linux.

Integrador: Integra todos os componentes (bootloader, kernel,


bibliotecas e aplicaes) em um sistema Linux embarcado.

Desenvolvedor de BSP (Board Support Package): porta o kernel e


o bootloader, desenvolve os device drivers para os dispositivos de
hardware usados no produto, etc.

Nosso foco neste treinamento: integrador e


desenvolvedor de aplicaes!
Embedded
Labworks

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.

Existem tambm solues open source, completamente abertas e


suportadas pela comunidade.

No nosso treinamento, usaremos solues abertas! Aprendendo a


base, migrar depois para outras solues bem mais fcil!
Embedded
Labworks

SO DE DESENVOLVIMENTO
fortemente recomendado o uso do Linux como sistema
operacional para desenvolvimento em Linux embarcado!

Todas as ferramentas disponveis na comunidade open source


foram feitas para rodar em Linux. Voc pode ter problemas em
tentar rodar em outro sistema operacional, e provavelmente no
ter suporte da comunidade.

Usando Linux, voc aprende Linux!


Embedded
Labworks

QUE DISTRIBUIO USAR?


Embedded
Labworks

HOST E TARGET
Host: mquina de desenvolvimento.

Target: hardware, produto, kit de desenvolvimento.

Conectados normalmente por uma conexo serial (RS232, USB,


Ethernet, etc).

Serial
Host Target
Ethernet
Embedded
Labworks

NOSSA PRINCIPAL FERRAMENTA!


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.

Durante o treinamento, para executar operaes que necessitem de


privilgios de administrador, usaremos o comando sudo. Exemplo:
$sudomount/dev/sdb1/mnt/usb
Embedded
Labworks

GUIAS DE REFERNCIA E ESTUDO


Alguns guias de referncia e estudo esto disponveis no ambiente
de laboratrio em docs/guides:
GuiaFocaLinux.pdf (guia foca Linux iniciante/intermedirio).
Guia-Ubuntu.pdf (guia do iniciante Ubuntu).
vi.pdf (editor de textos vi).
shell.pdf (linha de comandos do shell).
canivete-shell.pdf (canivete suo do shell).
lkn.tar.gz (livro Linux Kernel in a Nutshell).
ldd3.tar.bz2 (livro Linux Device Drivers 3ed).
Embedded
Labworks

LABORATRIO

Estudando a linha de comandos


Embedded
Labworks

Desenvolvendo Sistemas
Linux Embarcado

i.MX53 Quick Start Board


Embedded
Labworks

i.MX53 QUICK START BOARD


Embedded
Labworks

CARACTERSTICAS
CPU i.MX535 de 1GHz da Freescale (Cortex-A8).

1GB de memria RAM DDR3.

Conector para carto SD/MMC, microSD e interface SATA.

Sadas de udio estreo e vdeo VGA, e entrada para microfone.


Conector de expanso com sadas HDMI, display LCD, cmera e
SDIO.

Interfaces USB host/device, Ethernet, UART, JTAG, botes, leds, etc.


Embedded
Labworks

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

Conectando e testando o hardware


Embedded
Labworks

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.

Voc se lembra do processo de compilao de um cdigo em C? Ele


envolve normalmente as seguintes etapas: pr-processamento,
compilao, montagem (assembler) e linkagem.

Cada uma destas etapas executada por uma ferramenta


(pr-processador, compilador, assembler e linker), e todas elas
fazem parte do toolchain.
Embedded
Labworks

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.

Em desenvolvimento de sistemas embarcados normalmente complicado


(s vezes at impossvel) usar um toolchain nativo, porque precisamos de
bastante espao em disco, capacidade de processamento, memria, etc.

Portanto, para esta tarefa, o melhor usar um cross-compiling


toolchain, que roda na sua plataforma de desenvolvimento mas gera
cdigo para a sua plataforma alvo.
Embedded
Labworks

TIPOS DE TOOLCHAIN (cont.)

Cdigo-fonte
Host
Toolchain nativo Cross-compiling toolchain
x86

Binrio x86 Binrio ARM Target


x86 ARM
Embedded
Labworks

COMPONENTES DO TOOLCHAIN

Compilador (GCC) Biblioteca C padro

Binutils Headers do kernel

Debugger (GDB)

Toolchain
Embedded
Labworks

COMPILADOR GCC
Compilador GNU C, o famoso compilador de software livre.
http://gcc.gnu.org/

Compatvel com as linguagens C, C++, Ada, Fortran e Java, dentre


outras.

Pode gerar cdigo para diversas arquiteturas, incluindo ARM, AVR,


Blackfin, MIPS, PowerPC, x86, etc.
Embedded
Labworks

BINUTILS
Binutils um conjunto de ferramentas para manipular arquivos
binrios para uma arquitetura especfica.
http://www.gnu.org/software/binutils/

Algumas das principais ferramentas disponibilizadas pelo binutils:


as: assembler, gera o binrio baseado em um cdigo Assembly.
ld: linker.
ar, ranlib: usadas para gerar arquivos .a (normalmente bibliotecas).
objdump, readelf, size, nm, strings: inspecionar binrios.
strip: remove partes no usadas do binrio para diminuir seu
tamanho.
Embedded
Labworks

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/

Usada em boa parte dos sistemas GNU/Linux (desktop e servidores).

Projetada com foco em performance e portabilidade.

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/

Foco maior na economia de recursos do que na performance.

Em uma arquitetura ARM, chega a ser 4 vezes menor que a glibc, com
aproximadamente 600K!

Altamente configurvel.

Comunidade de desenvolvimento do projeto bem ativa.

Usada em grande parte do dispositivos de consumo com Linux embarcado.


Embedded
Labworks

COMPARANDO GLIBC E UCLIBC

Comparao realizada em uma arquitetura ARM


Embedded
Labworks

KERNEL HEADERS
Sabemos que o toolchain depende da biblioteca C do sistema.

Mas a biblioteca C, por sua vez, depende do kernel! Por que?


Chamadas de sistema.
Definies de constantes.
Estruturas de dados.

Por isso, para compilar a biblioteca C, o toolchain precisa dos


arquivos de cabealho do kernel.

Disponveis em <linux/...>, <asm/...> e alguns outros diretrios


dentro do diretrio include nos fontes do kernel.
Embedded
Labworks

KERNEL HEADERS (EXEMPLOS)


Nmeros das chamadas de sistema em <asm/unistd.h>:
#define__NR_exit1
#define__NR_fork2
#define__NR_read3

Definies de constantes em <asmgeneric/fcntl.h>:


#defineO_RDWR00000002

Estruturas de dados em <asm/stat.h>:


structstat{
unsignedlongst_dev;
unsignedlongst_ino;
[...]
};
Embedded
Labworks

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

USANDO UM TOOLCHAIN PRONTO


Soluo adotada em muitos projetos:
Vantagem: simples e conveniente.
Desvantagem: inflexvel, voc no consegue otimizar o toolchain de acordo
com suas necessidades.

Possveis escolhas:
Toolchain fornecido pelo fabricante do chip (ex: Freescale).
Toolchain fornecido por empresas especializadas (ex: Mentor Graphics).
Toolchain fornecido pela comunidade (ex: Linaro).

Uma referncia bem completa de toolchains em:


http://elinux.org/Toolchains
Embedded
Labworks

INSTALANDO E USANDO
Basta seguir o procedimento do fornecedor da soluo.

Normalmente, estes so os passos:


Baixar e descompactar a toolchain em um diretrio na sua mquina.
Adicionar no PATH o diretrio onde se encontram os binrios:
exportPATH=/path/to/toolchain/bin/:$PATH
Compilar sua aplicao usando o toolchain:
PREFIXgccteste.coteste

O PREFIX depende da configurao do toolchain, e permite


diferenciar toolchains nativos de toolchains para cross-compilao.
Embedded
Labworks

LABORATRIO

Instalando e testando um toolchain pronto


Embedded
Labworks

GERANDO SEU PRPRIO TOOLCHAIN


Gerar um toolchain manualmente uma tarefa difcil e dolorosa!
Pode levar muitos dias!
necessrio aprender muitos detalhes, muito componentes para
configurar e compilar.
Muitas decises para serem feitas manualmente: verso da
biblioteca C, headers do kernel, binutils, etc.
Precisa dos headers do kernel e dos fontes de todos os componentes.
Precisa estar familiarizado com o gcc.
Algumas plataformas necessitam que sejam aplicados patches em
alguns componentes antes de compilar.
Embedded
Labworks

USANDO FERRAMENTAS
Existem ferramentas que automatizam o processo de gerao de
toolchains.

Voc no precisa se preocupar com o processo de gerao do


toolchain, dependncias, patches, etc.

E por outro lado, estas ferramentas oferecem a flexibilidade de


configurao e seleo dos componentes do toolchain e de suas
verses.
Embedded
Labworks

ALGUMAS FERRAMENTAS
Crosstool (suporta apenas glibc):
http://www.kegel.com/crosstool

Crosstool-ng (suporta glibc, uClibc, eglibc):


http://crosstool-ng.org/

Buildroot (sistema de build completo, apenas uClibc):


http://www.buildroot.net

PTXDist (suporta uClibc ou glibc):


http://www.pengutronix.de/software/ptxdist/index_en.html

OpenEmbedded (sistema de build completo):


http://www.openembedded.org/
Embedded
Labworks

LABORATRIO

Compilando seu prprio toolchain com o crosstool-ng


Embedded
Labworks

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.

Alm destas funcionalidades bsicas, a maioria dos bootloaders


possui uma linha de comandos para a execuo de diferentes
operaes, como verificao de memria, formatao da flash e
rotinas de diagnstico.
Embedded
Labworks

BOOTLOADERS NO X86 BIOS


em ROM
Plataformas x86 normalmente vem acompanhadas de uma
memria no-voltil, a BIOS.
Estgio 1
Um programa na BIOS executado no boot do equipamento, que 512 bytes
faz a inicializao bsica do hardware, carrega para a memria e do disco
executa os primeiros 512 bytes do dispositivo de boot. Estes 512
bytes tambm so chamados de MBR.

A MBR o bootloader de 1o. estgio, que o responsvel por Estgio 2


carregar um bootloader de 2o. estgio do disco para a RAM. do disco

O bootloader de 2o. estgio mais completo, entende sistemas


de arquivo, consegue ler o sistema operacional do disco e
carregar para a memria. SO
do disco
Embedded
Labworks

BOOTLOADERS NO X86 (cont.)


LILO, j foi bastante utilizado, mas caiu em desuso.
http://lilo.alioth.debian.org/

GRUB, Grand Unified Bootloader, o mais poderoso e o padro


atualmente em desktops e servidores.
http://www.gnu.org/software/grub/

Syslinux, mais utilizado em boot pela rede e por mdias removveis


(floppy disk, pendrive, CD/DVD, etc).
http://www.syslinux.org/
Embedded
Labworks

BOOT EM CPUs EMBARCADAS


Memria
fsica
Quando alimentada, a CPU comea a execuo em
um endereo fixo.

No existe nenhum mecanismo de boot provido Execuo


pela CPU ou pela plataforma. comea aqui NOR flash

O projeto de hardware deve garantir que a


memria flash esteja com seu barramento de
endereos ligados corretamente, de forma que o
endereo de incio de execuo das instrues RAM
esteja acessvel pela CPU.

Soluo comum em microcontroladores.


Embedded
Labworks

BOOT EM CPUs EMBARCADAS (cont.)


Memria
fsica
Neste caso, como o cdigo executado direto da flash (XIP),
o uso de memrias flash NOR obrigatrio.

Mas como o Linux precisa de pelo menos alguns MBs de


memria, o uso de flash NOR invivel por ser muito mais Execuo
cara. Por este motivo, o Linux usa normalmente memrias comea aqui NOR flash
flash NAND.

Mas como no conseguimos executar cdigo diretamente de


memrias flash NAND, precisamos de RAM.

E quem ir configurar a controladora da SDRAM e carregar o RAM


cdigo da flash para a RAM no boot do equipamento? O
bootloader!
Embedded
Labworks

BOOT EM LINUX EMBARCADO


Em Linux embarcado, e principalmente em plataformas ARM,
muito comum termos um processo de boot dividido em 3 estgios:
1. A CPU tem um cdigo de boot integrado em uma ROM interna,
responsvel por carregar o bootloader de 1o. estgio de uma unidade
de armazenamento no voltil para a memria RAM interna (SRAM ou
IRAM).
2. O bootloader de 1o. estgio deve inicializar o hardware (CPU, DRAM,
GPIOs, etc) e carregar um bootloader de 2o. estgio para a RAM.
3. O bootloader de 2o. estgio carrega o sistema operacional (kernel
Linux) para a RAM e executa.
Embedded
Labworks

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).

Kickstart roda da SRAM, inicializa hardware e carrega o stage 1


Kickstart/S1L loader, um bootloader completo que possui diversas funes
para configurar o hardware. O S1L carrega o bootloader de 2o.
estgio para a RAM.

Roda da RAM. Inicializa alguns dispositivos de hardware (rede,


U-Boot USB, etc). Carrega a imagem do kernel na RAM e passa o
controle para ele.

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).

O ROM code trabalha com o conceito de boot stream, um


Bootlets conjunto de bootlets, que so pequenos executveis para
extender o bootloader, como o power_prep (configura PM) e o
boot_prep (configura a memria SDRAM e carrega o U-Boot).

Inicializa alguns dispositivos de hardware (rede, USB, etc).


U-Boot Carrega a imagem do kernel na RAM e passa o controle para
ele.

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.

Inicializa alguns dispositivos de hardware (rede, USB, etc).


U-Boot (2) Carrega a imagem do kernel na RAM e passa o controle para
ele.

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.

Roda da SRAM. Inicializa a controladora da SDRAM, NAND ou


X-Loader
MMC, e carrega o bootloader de 2o. estgio para a RAM.

Roda da RAM. Inicializa alguns dispositivos de hardware (rede,


U-Boot USB, etc). Carrega a imagem do kernel na RAM e passa o
controle para ele.

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).

Roda da SRAM. Inicializa a controladora da DRAM e carrega o


AT91Bootstrap bootloader de 2o. estgio para a RAM.

Roda da RAM. Inicializa alguns dispositivos de hardware (rede,


U-Boot USB, etc). Carrega a imagem do kernel na RAM e passa o
controle para ele.

Linux Kernel
Roda da RAM. Assume o controle do sistema (a partir daqui, o
bootloader no existe mais).
Embedded
Labworks

BOOTLOADERS EM LINUX EMBARCADO


O bootloader de 1o. estgio normalmente fornecido pelo
fabricante do chip, e cada plataforma tem o seu. Nosso foco no
bootloader de 2o. estgio.

Existem alguns bootloaders open source. Dentre eles, os dois mais


conhecidos e utilizados so:
U-Boot: bastante popular em ARM, mas tambm usado em outras
arquiteturas como MIPS e PPC.
http://www.denx.de/wiki/U-Boot
Barebox: sucessor do U-Boot, melhor projeto, melhor cdigo,
desenvolvimento ativo, mas ainda com pouco suporte hardware.
http://www.barebox.org
Embedded
Labworks

U-BOOT
Bootloader open-source (GPLv2) mais utilizado atualmente.
http://www.denx.de/wiki/U-Boot

Suporta uma grande variedade de CPUs, incluindo PPC, ARM, MIPS,


Coldfire, x86, etc.

Desde 2008, segue um intervalo fixo de release, onde a cada dois


ou trs meses uma verso liberada (as verses so nomeadas
com o formato YYYY.MM).

Documentao disponvel em:


http://www.denx.de/wiki/U-Boot/Documentation
Embedded
Labworks

FUNCIONALIDADES DO U-BOOT
Exibir informaes do hardware (memria, perifricos, etc).

Manipular a RAM (ler, escrever, comparar, testar, etc).

Manipular memrias flash (ler, escrever, apagar, etc).

Boot via memria flash.

Boot via rede (bootp, tftp, dhcp, serial).


Embedded
Labworks

FUNCIONALIDADES DO U-BOOT (cont.)


Boot por interfaces SD/MMC ou USB.

Entende parties FAT.

Configurao por variveis de ambiente e suporte scripts.

Executa cdigo bare-metal.

Carrega e executa imagens do kernel Linux.

Etc!
Embedded
Labworks

BAIXANDO O U-BOOT
de responsabilidade do fabricante disponibilizar os fontes do U-Boot
(porte) para a sua plataforma.

O fabricante pode fazer isso e enviar o cdigo para a rvore principal do


projeto (mainline). Neste caso, os fontes podem ser baixados no site do
projeto em:
http://www.denx.de/wiki/U-Boot

Mas nem sempre o fabricante faz isso! Neste caso, o fabricante ir


disponibilizar os fontes em um outro local, provavelmente no seu site junto
com o BSP (Board Support Package) da plataforma.

Portanto, consulte a documentao da sua plataforma para saber como e


onde baixar os fontes do U-Boot.
Embedded
Labworks

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

Substitua <board> pelo nome da sua plataforma no U-Boot. Por


exemplo, para configurar o U-Boot para o kit de desenvolvimento
i.MX53 Quick Start Board:
makemx53_loco_config
Embedded
Labworks

COMPILANDO O U-BOOT
Para compilar o U-Boot, basta executar o comando make passando o prefixo
do cross-compiler. Exemplo:
makeCROSS_COMPILE=armlinux

No se esquea de incluir na varivel de ambiente PATH o caminho do diretrio


do toolchain.

No final, ser gerada a imagem do u-boot para ser gravada no target.

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

Compilando e gravando o U-Boot


Embedded
Labworks

Desenvolvendo Sistemas
Linux Embarcado

Kernel Linux
Embedded
Labworks

VISO GERAL
Aplicao Aplicao
Biblioteca Biblioteca Aplicao User space
Biblioteca C

Chamadas de sistema Notificao de eventos


Exportao de informaes

Kernel

Gerenciamento do hardware Notificao de eventos

Hardware
Embedded
Labworks

HISTRICO
O kernel um dos componentes do sistema operacional, que requer
bibliotecas e aplicaes para prover funcionalidades aos usurios.

Criado em 1991 pelo estudante finlands Linus Torvalds, comeou


a ser usado rapidamente como sistema operacional em projetos de
software livre.

Linus Torvalds foi capaz de criar uma comunidade grande e


dinmica de desenvolvedores e usurios ao redor do projeto.

Atualmente, centenas de pessoas e empresas contribuem com o


projeto.
Embedded
Labworks

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.

Um processo contm uma ou mais linhas de execuo, chamadas de threads.

Cada thread possui um contador de programa, uma regio do stack e uma cpia
dos registradores da CPU.

Internamente, o Linux no diferencia processos e threads. Uma thread nada mais


do que um processo que compartilha recursos com outras threads!

Por este motivo, o Linux escalona threads, e no processos.


Embedded
Labworks

GERENCIAMENTO DE PROCESSOS (cont.)


Trade-off entre capacidade de processamento e tempo de resposta
(latncia).

O Linux um sistema multitasking preemptivo.

Ele possui o conceito de classes de escalonador, onde cada classe


possui um algoritmo de escalonamento, que decide qual processo
deve ser executado, quando e por quanto tempo.

O escalonador padro do Linux o CFS (Completely Fair


Scheduler), onde cada processo recebe uma "porcentagem justa"
da CPU (foco em performance).
Embedded
Labworks

GERENCIAMENTO DE PROCESSOS (cont.)


Possui tambm um escalonador para processos de tempo real, que
tem prioridade sobre o CFS.

Mas mesmo assim, o Linux no pode ser considerado um sistema


operacional determinstico (em alguns trechos do cdigo a latncia
para atender um pedido de interrupo pode ser muito grande).

Existem um conjunto de patches (PREEMPT_RT) que podem ser


aplicados no kernel e melhorar este cenrio de alta latncia.

Uma opo para o uso do Linux em aplicaes hard real-time a


utilizao de um kernel de tempo real em conjunto com o Linux
(RTLinux, RTAI, Xenomai).
Embedded
Labworks

GERENCIAMENTO DE MEMRIA
O Linux trabalha com o mecanismo de memria virtual para
gerenciar a memria do sistema.

Em um sistema com memria virtual, todo o acesso memria do


sistema realizado atravs de endereos virtuais, que so
convertidos (por hardware) para endereos fsicos durante o
acesso memria do sistema.

A MMU (Memory Management Unit) o hardware que implementa o


mecanismo de memria virtual, gerenciando a memria do sistema
e fazendo a converso entre endereos de memria fsicos e
virtuais.
Embedded
Labworks

GERENCIAMENTO DE MEMRIA (cont.)


Um sistema com MMU capaz de prover:
Maior endereamento de memria para os processos: em uma
arquitetura de 32 bits, os processos tem acesso um endereamento
linear de 4G de memria virtual.
Proteo: cada processo s enxerga seu espao de endereamento,
onde um acesso invlido gera uma exceo (segmentation fault).
Memory mapping: possibilidade de mapear um arquivo fsico em
memria.
Compartilhamento: os processos podem compartilhar memria (cdigo,
dados, etc), usado por exemplo em mecanismos de IPC.
SWAP: se faltar memria fsica, possibilita salvar e recuperar pginas
de memria do disco.
Embedded
Labworks

SISTEMA DE ARQUIVO VIRTUAL


O Linux fortemente baseado em arquivos (quase tudo no sistema
representado por um arquivo).

O kernel implementa a camada VFS (Virtual Filesystem) que


abstrai o acesso aos arquivos, possibilitando que rotinas de acesso
ao arquivo (open, read, write, close, etc) sejam mapeadas para
diferentes destinos.
Embedded
Labworks

SISTEMA DE ARQUIVO VIRTUAL (cont.)


Exemplo 1: Mapeando um arquivo fsico em um dispositivo de
armzenamento (copiando um arquivo do HD para um pendrive):
cp/usr/sbin/app/mnt/pendrive/

Exemplo 2: Mapeando um arquivo virtual (listando a estatstica de


uso de memria do sistema):
cat/proc/meminfo

Exemplo 3: Mapeando o acesso ao hardware (escrevendo na porta


serial):
echo"Teste">/dev/ttyS0
Embedded
Labworks

KERNEL SPACE x USER SPACE


Existe uma separao bem definida entre o kernel (kernel space) e
as bibliotecas e aplicaes do usurio (user space).

O kernel roda em modo privilegiado, com total acesso todas as


instrues da CPU, endereamento de memria e I/O, enquanto que
os processos do usurio rodam em modo restrito, com acesso
limitado aos recursos da mquina.

Por isso, existe uma interface de comunicao, baseada chamadas


de sistema (system calls), para que as bibliotecas e aplicaes
tenham acesso aos recursos da mquina.
Embedded
Labworks

CHAMADAS DE SISTEMA
O Linux possui aproximadamente 300 chamadas de sistema.

Operaes em arquivos, operaes de rede, comunicao entre


processos, gerenciamento de processos, mapeamento de memria,
timers, threads, mecanismos de sincronizao, etc.

As chamadas de sistema so abstradas pela biblioteca C padro. As


aplicaes normalmente no precisam fazer uma chamada direta.
Tudo feito atravs da biblioteca C padro.

A interface de chamadas de sistema bem estvel. Durante novas


verses do kernel, apenas novas chamadas de sistema so
adicionadas.
Embedded
Labworks

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).

A partir de 2003, apenas uma rvore: 2.6.X.

Em 2011, a verso mudou para 3.0.


Embedded
Labworks

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).

Em aproximadamente 3 meses temos a liberao do release final


3.X.

Para acompanhar as mudanas no kernel:


http://wiki.kernelnewbies.org/LinuxChanges
http://lwn.net
Embedded
Labworks

FONTES DO KERNEL
A verso oficial do cdigo-fonte do kernel liberada por Linus
Torvalds encontra-se em:
http://www.kernel.org

Baixando os fontes por http:


wgethttp://www.kernel.org/pub/linux/kernel/v3.0/linux3.6.tar.bz2
tarxjfvlinux3.6.tar.bz2

Baixando os fontes pelo git:


gitclonegit://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Embedded
Labworks

FONTES DO KERNEL (cont.)


Muitas comunidades e fabricantes de hardware podem manter verses
alternativas do kernel:
Fabricantes de hardware podem manter verses especficas do kernel com
suporte s suas plataformas de referncia (BSP).
Comunidades podem manter verses do kernel voltadas arquiteturas
especficas (ARM, MIPS, PPC), sub-sistemas (USB, PCI, network), sistemas
de tempo-real, etc.

Normalmente nestas verses alternativas so disponibilizados os


patches para serem aplicados em uma determinada verso do kernel.

Portanto, consulte a documentao da sua plataforma para saber como


e onde baixar os fontes do Linux.
Embedded
Labworks

TAMANHO DOS FONTES DO KERNEL


Fontes do kernel 3.4.9:
Tamanho total: 518MB
~38.600 Arquivos
~15.400.000 linhas de cdigo

Porque os fontes so to grandes? Milhares de drivers de


dispositivo, diversos protocolos de rede, suporte a diferentes
arquiteturas e plataformas.

O core do kernel bem pequeno!


Embedded
Labworks

TAMANHO DOS FONTES DO KERNEL (cont.)


Linux 2.6.39
Embedded
Labworks

LICENA
Todo o cdigo-fonte do Linux software livre e liberado sob a
licena GPLv2.

Isso significa que:


Quando voc receber ou comprar um equipamento com Linux
embarcado, voc tem o direito de requisitar os fontes, alter-los e
redistribu-los!
Quando voc produzir um equipamento com Linux embarcado, voc
precisa liberar os fontes do kernel sob as mesmas condies, sem
restries.
Embedded
Labworks

LICENA (cont.)
Portanto, ilegal distribuir um binrio do kernel com mdulos
compilados estaticamente.

Os mdulos do kernels so uma rea cinza: um trabalho derivado


do kernel ou no?
A opinio geral da comunidade de que drivers fechados so ruins.
Sob um ponto de vista legal, cada driver provavelmente um caso
diferente. Ex: Nvidia.
realmente til manter um driver proprietrio?
Embedded
Labworks

VANTAGENS DE DRIVERS GPL


Voc no precisa escrever um driver do zero, podendo reusar o
cdigo de outros drivers.

Voc pode integrar o seu driver na rvore oficial do kernel, e no se


preocupar com qualquer alterao em APIs internas do Linux. Custo
zero de manuteno e melhorias no driver!

Com drivers abertos voc tem suporte da comunidade, com mais


pessoas revisando e colaborando com seu driver.

Os usurios e a comunidade tem uma viso positiva da empresa.


Embedded
Labworks

LABORATRIO

Baixando e estudando os fontes do kernel


Embedded
Labworks

CONFIGURANDO O KERNEL
O kernel possui centenas de drivers de dispositivo, diversos
protocolos de rede e muitos outros itens de configurao.

O kernel bem modular, milhares de opes esto disponveis para


serem habilitadas ou desabilitadas.

O processo de configurao serve para voc configurar o kernel


para ser compilado para sua CPU/plataforma.

O conjunto de opes que voc ir habilitar depende:


Do seu hardware (device drivers, etc).
Das funcionalidades (protocolos de rede, sistemas de arquivo, etc).
Embedded
Labworks

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

Dificilmente voc vai precisar editar o arquivo .config manualmente. Existem


ferramentas de interface grfica para configurar o kernel e gerar o arquivo
de configurao automaticamente:
makemenuconfig
makegconfig
makexconfig
makenconfig
Embedded
Labworks

make xconfig
Embedded
Labworks

make gconfig
Embedded
Labworks

make nconfig
Embedded
Labworks

make menuconfig
Embedded
Labworks

CONFIGURANDO O KERNEL (cont.)


O kernel um binrio nico, resultado do processo de linkagem de
todos os arquivos-objeto das funcionalidades que voc habilitou,
incluindo os device drivers.

O kernel permite que algumas funcionalidades possam ser


habilitadas e compiladas de duas formas:
Esttica ou built-in: a funcionalidade selecionada linkada
estaticamente imagem final do kernel.
Dinmica ou mdulo: gerado um mdulo daquela funcionalidade
(arquivo com extenso .ko). Este mdulo no incluido na imagem final
do kernel. Ele incluido no sistema de arquivos e pode ser carregado
dinamicamente (em tempo de execuo), conforme a necessidade.
Embedded
Labworks

OPES DE CONFIGURAO
Opes booleanas (verdadeiro/falso):
[]Opodesabilitada
[*]Opohabilitada

Opes de 3 estados:
<>Opodesabilitada
<*>Opohabilitada(builtin)
<M>Opohabilitada(mdulo)

Nmeros inteiros. Ex: (17)Kernellogbuffersize

Strings. Ex: (iso88591)DefaultiocharsetforFAT


Embedded
Labworks

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

CONFIGURAO POR ARQUITETURA


Toda a configurao do kernel dependente da arquitetura.

Por padro, o kernel considera uma compilao nativa, ento ir usar a


arquitetura da mquina de desenvolvimento (normalmente x86) no comando
abaixo:
makemenuconfig

Portanto, para configurar para ARM por exemplo, voc precisa especificar a
arquitetura:
makeARCH=armmenuconfig

Ao invs de passar a varivel ARCH na chamada do make, voc pode tambm


defin-la como varivel de ambiente ou alterar o arquivo Makefile do diretrio
principal do kernel.
Embedded
Labworks

CONFIGURAES PR-DEFINIDAS
Arquivos de configurao pr-definidos para diversas plataformas
esto disponveis em arch/<arch>/configs/.

O uso de arquivos pr-configurados a forma padro de configurar


um kernel para uma plataforma especfica. Por exemplo, para
carregar a configurao padro do kit de desenvolvimento i.MX53
Quick Start Board:
makeimx5_defconfig

Se voc mexeu na configurao padro e deseja salv-la, pode


criar uma cpia conforme exemplo abaixo:
cp.configarch/<arch>/configs/myconfig_defconfig
Embedded
Labworks

VALIDANDO O ARQUIVO DE CONFIGURAO


O comando abaixo faz a validao e a consistncia do arquivo de
configurao do kernel:
makeoldconfig

Ele avisa e configura automaticamente parmetros e dependncias


que antes no existiam.

Deve ser usado sempre que:


Voc alterar o arquivo .config manualmente.
Voc reutilizar o mesmo .config em diferentes verses do kernel.
Embedded
Labworks

LABORATRIO

Configurando o kernel
Embedded
Labworks

COMPILANDO O KERNEL
Depois de configurado, para compilar nativamente basta executar:
make

No precisa de previlgios de root!

Para cross-compilar, voc precisa indicar a arquitetura e o prefixo do


cross-compiler. Exemplo:
makeARCH=armCROSS_COMPILE=armlinux

O comando acima ir gerar uma imagem genrica para ARM. Se voc


quiser gerar uma imagem especfica para determinado bootloader, deve
adicionar ao fim do comando o nome da imagem. Exemplo para o U-Boot:
makeARCH=armCROSS_COMPILE=armlinuxuImage
Embedded
Labworks

COMPILANDO O KERNEL (cont.)


Ao fim do processo de compilao, sero geradas as seguintes imagens:
vmlinux: gerada no diretrio raiz dos fontes, a imagem do kernel no
formato ELF, que no bootavel, mas pode ser usada para debugging.
Mdulos do kernel: arquivos com extenso .ko dentro dos respectivos
diretrios dos drivers.
Em arch/<arch>/boot/:
Image: imagem final do kernel, bootvel e descomprimida.
*Image: imagem bootvel e comprimida do kernel (bzImage para x86,
zImage para ARM, etc).
uImage: imagem do kernel para o U-Boot (opcional).
Embedded
Labworks

INSTALANDO O KERNEL
Para instalar o kernel, basta executar o comando abaixo:
makeinstall

Este comando ir instalar os seguintes arquivos no diretrio /boot:


vmlinuz-<version> (imagem do kernel comprimida)
System.map-<version> (endereos dos smbolos do kernel)
config-<version> (arquivo de configurao do kernel)

Normalmente no usado em sistemas embarcados!

Em sistemas embarcados, normalmente gravamos o kernel em um


dispositivo de armazenamento (carto SD, memria flash, etc).
Embedded
Labworks

FAZENDO A LIMPEZA
Remove todos os arquivos gerados (imagens, arquivos-objeto, etc).
makeclean

Remove todos os arquivos de gerados e arquivos de configurao


(usado quando pretende-se mudar de plataforma).
makemrproper

Alm dos arquivos gerados e arquivos de configurao, remove


tambm arquivos de backup (bom para gerar patches).
makedistclean
Embedded
Labworks

LINHA DE COMANDOS DO KERNEL


Ao ser carregado, o kernel pode receber um conjunto de
parmetros. Chamamos esses parmetros de linha de comandos do
kernel.

Esta linha de comandos pode ser passada ao kernel de duas


formas:
Pelo bootloader.
Hardcoded na
configurao do kernel, atravs da opo
CONFIG_CMDLINE.

Esta linha de comandos uma string com diversas opes no


formato key=value.
Embedded
Labworks

LINHA DE COMANDOS DO KERNEL (cont.)


console=ttySAC0root=/dev/mtdblock3rootfstype=jffs2

Onde:
console = dispositivo que ser usado como console
root = dispositivo onde se encontra o sistema de arquivos
rootfstype = tipo do sistema de arquivos (JFFS2)

Existem dezenas de outras opes!

Documentao disponvel em:


Documentation/kernel-parameters.txt
Embedded
Labworks

LABORATRIO

Compilando e testando o kernel


Embedded
Labworks

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).

Em sistemas Unix, aplicaes e usurios enxergam apenas uma


hierarquia nica e global de arquivos e diretrios, que podem ser
compostos por diferentes sistemas de arquivo.

Um ou mais sistemas de arquivo so montados em locais


especficos nesta hierarquia de diretrios.
Embedded
Labworks

SISTEMAS DE ARQUIVO (cont.)


Quando um sistema de arquivo montado em um diretrio, este
diretrio chamado de ponto de montagem ou mount point, e o
contedo deste diretrio ir refletir o contedo armazenado no
dispositivo de armazenamento.

Isso permite que aplicaes acessem diretrios e arquivos


facilmente independentemente da localizao ou do tipo do
dispositivo de armazemanento.

Tudo o que as aplicaes enxergam so arquivos e diretrios!


Embedded
Labworks

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>

Quando trabalhamos com dispositivos removveis, necessrio


executar o umount antes de remover o dispositivo, j que o Linux
por padro mantm em cache as alteraes realizadas no
dispositivo para melhorar a performance, e o umount garante que
estas alteraes sejam realizadas antes da remoo do
dispositivo.
Embedded
Labworks

MONTANDO UM SISTEMA DE ARQUIVO


Criando o diretrio (ponto de montagem):
mkdir/mnt/usbkey

Montando um pendrive:
mounttvfat/dev/sda1/mnt/usbkey

Verificando o contedo:
ls/mnt/usbkey
docsprog.cpicture.pngmovie.avi

Desmontando o dispositivo USB:


umount/mnt/usbkey
Embedded
Labworks

SISTEMA DE ARQUIVO ROOT


Um sistema de arquivo especfico montado na raiz principal da
hierarquia, identificado pelo /.

Este sistema de arquivo chamado de root ou rootfs.

Como ele o primeiro sistema de arquivo a ser montado, no tem


como faz-lo com o comando mount, j que o mesmo ainda no
esta disponvel. Lembre-se: ainda no existe nenhum sistema de
arquivo montado!

Por isso, o responsvel por esta tarefa o kernel, de acordo com a


opo root na linha de comandos do kernel.
Embedded
Labworks

SISTEMA DE ARQUIVO ROOT (cont.)


Se voc no passar a opo root na linha de comando, o kernel
entra em pnico!
Pleaseappendacorrect"root="bootoption
Kernel panic not syncing: VFS: Unable to mount
rootfsonunknownblock(0,0)

Passando a opo root para o kernel:


...console=ttyS2,115200n8root=/dev/sda2...
Embedded
Labworks

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.

nossa a deciso de como iniciar o sistema, e assim configurar


corretamente a opo root do kernel.
Embedded
Labworks

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

MONTANDO O ROOTFS (cont.)


Partio de uma memria flash NAND:
root=/dev/mtdblockX, onde X o nmero da partio.
Exemplo: root=/dev/mtdblock3
Embedded
Labworks

MONTANDO O ROOTFS VIA REDE


Uma vez que sua rede esteja funcionando, o rootfs pode estar na
sua mquina de desenvolvimento, e ser exportado via protocolo
NFS (Network File System).

Host Target
Servidor NFS Cliente NFS

Muito mais fcil e rpido de atualizar o rootfs sem precisar gravar


na flash e reiniciar o equipamento.

Possibilidade de ter um rootfs bem grande, podendo incluir


ferramentas e binrios que no caberiam na flash do equipamento.
Embedded
Labworks

MONTANDO O ROOTFS EM MEMRIA


Tambm possvel ter uma imagem de rootfs integrada imagem
do kernel, sendo por consequncia carregada em memria junto
com o kernel.

Este mecanismo chamado de initramfs.

Initramfs
Kernel
(cpio archive)

Imagem do kernel (uImage, zImage, bzImage, etc)


Embedded
Labworks

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/

A maioria dos sistemas Linux esto de acordo com este padro


porque:
As aplicaes esperam este formato.
Facilita o trabalho de usurios e desenvolvedores quando precisam
trabalhar com diferentes sistemas Linux.
Embedded
Labworks

DIRETRIOS MAIS IMPORTANTES


/bin Programasbsicos
/boot Imagemdokernel(apenasquandoo
bootloadersuportacarregarokernel
dosistemadearquivos,normalmenteusado
emarquiteturasx86)
/dev Arquivosdedispositivo
/etc Arquivosdeconfigurao
/home Diretriodearquivosdosusurios
/lib Bibliotecasbsicasdosistema
/media Pontodemontagemparamdiasremovveis
/mnt Pontodemontagemparamdiasestticas
/proc Pontodemontagemdosistemadearquivo
virtualproc
Embedded
Labworks

DIRETRIOS MAIS IMPORTANTES (cont.)


/root Homedousurioroot
/sbin Aplicaesdeadministraodosistema
/sys Pontodemontagemdosistemade
arquivovirtualsysfs
/tmp Arquivostemporrios
/usr Aplicaesedadosdosusurios
/usr/bin Aplicaesbsicasdousurio
/usr/lib Bibliotecasdousurio
/usr/sbin Aplicaesdeadministraodousurio
/var Arquivosdedados(logs,bancode
dados,arquivostemporrios,etc)
Embedded
Labworks

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).

Da mesma forma, os dispositivos de hardware tambm so


representados no Linux atravs de arquivos, chamados de arquivos
de dispositivo, e disponveis no diretrio /dev.
Embedded
Labworks

INFORMAES DOS DISPOSITIVOS


Internamente, cada arquivo de dispositivo esta associado trs
informaes bsicas:
Major number: indica a categoria do dispositivo.
Minor number: indica o nmero do dispositivo.
Tipo do dispositivo:
Dispositivos de bloco: composto por blocos de dados de
tamanho fixo, endereveis e de acesso aleatrio, que podem ser
lidos e/ou escritos. Exemplos: HD, pendrive, etc.
Dispositivo de caractere: possibilita o acesso sequencial de
bytes, sem comeo, sem fim e sem tamanho! Exemplos: portal
serial, interface de rede, placa de som, etc.
Embedded
Labworks

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

Escrevendo Hello na porta serial:


intfd;
fd=open(/dev/ttyS0,O_RDWR);
write(fd,Hello,5);
close(fd);
Embedded
Labworks

CRIANDO ARQUIVOS DE DISPOSITIVO


Para sistemas mais simples, os arquivos de dispositivo podem ser
criados manualmente com o comando mknod ( necessrio ter
privilgio de root):
mknod/dev/<device>[c|b]majorminor

Para sistemas mais complexos, existem mecanismos para


adicionar e remover arquivos de dispositivo dinamicamente:
devtmpfs
udev
mdev
Embedded
Labworks

SISTEMA DE ARQUIVO VIRTUAL PROC


O sistema de arquivo virtual proc exporta (normalmente para o
diretrio /proc) um conjunto de informaes do kernel, incluindo
estatsticas dos processos, memria e uso de I/O.

O proc tambm possibilita ajustar parmetros do kernel em tempo


de execuo.

Muitas aplicaes, como os comandos ps e top, usam as


informaes disponveis no /proc para exibirem informaes dos
processos rodando no sistema.
Embedded
Labworks

SISTEMA DE ARQUIVO VIRTUAL PROC (cont.)


Montando o proc:
mounttprocnone/proc

Mais informaes na documentao do kernel:


Documentation/filesystems/proc.txt
Embedded
Labworks

SISTEMA DE ARQUIVO VIRTUAL SYSFS


O sistema de arquivo virtual sysfs exporta (normalmente para o
diretrio /sys) informaes de drivers e dispositivos de hardware
conectados ao sistema.

Usado por aplicaes que querem ler informaes dos dispositivos


de hardware conectados ao sistema. Ex: mdev, udev, etc.

Pode ser usado tambm para parametrizar ou configurar


determinado hardware.
Embedded
Labworks

SISTEMA DE ARQUIVO VIRTUAL SYSFS (cont.)


Montando o sysfs:
mounttsysfsnone/sys

Mais informaes na documentao do kernel:


Documentation/filesystems/sysfs.txt
Embedded
Labworks

A INICIALIZAO
Aps montar o rootfs, o kernel ir tentar executar uma aplicao
de inicializao, tambm chamado de processo init.

Para isso, o kernel tenta executar os binrios /sbin/init,


/bin/init, /etc/init e /bin/sh.

Voc pode passar tambm o nome do programa de inicializao


atravs do parmetro init da linha de comandos do kernel.
Exemplo:
init=/usr/bin/init
Embedded
Labworks

A INICIALIZAO (cont.)
Se nenhuma destes programas de inicializao forem encontrados,
o kernel entra em pnico!
Kernelpanicnotsyncing:Noinitfound.

Assim que executado, o processo init o responsvel pela


inicializao do restante do sistema.
Embedded
Labworks

VISO GERAL DO BOOT


Bootloader
Carrega o kernel para a RAM e inicia

Kernel
Monta o rootfs indicado por root=
Inicia a aplicao init

/sbin/init
Inicia outros servios e aplicaes

Shell Outras aplicaes

Rootfs
Embedded
Labworks

MECANISMOS DE INICIALIZAO
Depois que o kernel chamou a aplicao init, responsabilidade do
rootfs o restante da inicializao do sistema.

Existem diferentes mecanismos de inicializao, como systemd,


upstart, openrc e sysvinit (System V Init).

Devido simplicidade de uso e utilizao em solues mais


simples, vamos estudar aqui o sysvinit.
Embedded
Labworks

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

CRIANDO UM ROOTFS BSICO


Um sistema Linux precisa de um conjunto bsico de programas
para funcionar (init, shell, comandos bsicos, etc).

Normalmente estes programas so fornecidos em diferentes


projetos e trabalhoso integrar manualmente todos estes
componentes.

O Busybox uma soluo alternativa, trazendo uma quantidade


grande e comum de programas usados em sistemas Linux, mas
com tamanho reduzido, perfeito para sistemas embarcados!
http://www.busybox.net/
Embedded
Labworks

APLICAES DISPONVEIS NO BUSYBOX


[, [[, addgroup, adduser, adjtimex, ar, arp, arping, ash, awk, basename, bbconfig, bbsh, brctl, bunzip2,
busybox, bzcat, bzip2, cal, cat, catv, chat, chattr, chcon, chgrp, chmod, chown, chpasswd, chpst, chroot,
chrt, chvt, cksum, clear, cmp, comm, cp, cpio, crond, crontab, cryptpw, cttyhack, cut, date, dc, dd, deallocvt,
delgroup, deluser, depmod, devfsd, df, dhcprelay, diff, dirname, dmesg, dnsd, dos2unix, dpkg, dpkg_deb,
du, dumpkmap, dumpleases, e2fsck, echo, ed, egrep, eject, env, envdir, envuidgid, ether_wake, expand,
expr, fakeidentd, false, fbset, fbsplash, fdflush, fdformat, fdisk, fetchmail, fgrep, find, findfs, fold, free,
freeramdisk, fsck, fsck_minix, ftpget, ftpput, fuser, getenforce, getopt, getsebool, getty, grep, gunzip, gzip,
halt, hd, hdparm, head, hexdump, hostid, hostname, httpd, hush, hwclock, id, ifconfig, ifdown, ifenslave,
ifup, inetd, init, inotifyd, insmod, install, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink, iproute, iprule, iptunnel,
kbd_mode, kill, killall, killall5, klogd, lash, last, length, less, linux32, linux64, linuxrc, ln, load_policy, loadfont,
loadkmap, logger, login, logname, logread, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lzmacat, makedevs, man,
matchpathcon, md5sum, mdev, mesg, microcom, mkdir, mke2fs, mkfifo, mkfs_minix, mknod, mkswap,
mktemp, modprobe, more, mount, mountpoint, msh, mt, mv, nameif, nc, netstat, nice, nmeter, nohup,
nslookup, od, openvt, parse, passwd, patch, pgrep, pidof, ping, ping6, pipe_progress, pivot_root, pkill,
poweroff, printenv, printf, ps, pscan, pwd, raidautorun, rdate, rdev, readahead, readlink, readprofile, realpath,
reboot, renice, reset, resize, restorecon, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, run_parts, runcon,
runlevel, runsv, runsvdir, rx, script, sed, selinuxenabled, sendmail, seq, sestatus, setarch, setconsole,
setenforce, setfiles, setfont, setkeycodes, setlogcons, setsebool, setsid, setuidgid, sh, sha1sum, showkey,
slattach, sleep, softlimit, sort, split, start_stop_daemon, stat, strings, stty, su, sulogin, sum, sv, svlogd,
swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar, taskset, tcpsvd, tee, telnet, telnetd, test,
tftp, tftpd, time, top, touch, tr, traceroute, true, tty, ttysize, tune2fs, udhcpc, udhcpd, udpsvd, umount,
uname, uncompress, unexpand, uniq, unix2dos, unlzma, unzip, uptime, usleep, uudecode, uuencode,
vconfig, vi, vlock, watch, watchdog, wc, wget, which, who, whoami, xargs, yes, zcat, zcip
Embedded
Labworks

LABORATRIO

Gerando um rootfs simples e testando com NFS


Embedded
Labworks

Desenvolvendo Sistemas
Linux Embarcado

Kernel modules
Embedded
Labworks

KERNEL MONOLTICO E MICROKERNEL


Kernel monoltico: o sistema operacional inteiro roda em kernel
space, com total acesso aos recursos da mquina (CPU, memria e
I/Os), e prov para as aplicaes (userspace) uma interface de
comunicao atravs de chamadas de sistema (system calls).

Microkernel: apenas o bsico do kernel roda em userspace


(gerenciamento de memria e processos). O resto roda em
userspace, incluindo sistemas de arquivos, device drivers,
protocolos de rede, etc!
Embedded
Labworks

MONOLTICO X MICROKERNEL
Embedded
Labworks

O KERNEL LINUX
O Linux um kernel monoltico.

Mas internamente o Linux bem modular. Cada funcionalidade


abstrada em um mdulo, com uma interface de comunicao bem
definida. Por isso, permite um sistema de configurao onde voc
pode adicionar ou remover determinada funcionalidade.

E o Linux permite que voc adicione dinamicamente pedaos de


cdigo do kernel em tempo de execuo!

Chamamos esses pedaos de cdigo de mdulos do kernel.


Embedded
Labworks

VANTAGENS DOS MDULOS


Ajuda a manter a imagem do kernel bem pequena.

Mdulos tornam fcil o desenvolvimento do kernel, como por


exemplo device drivers, sem precisar reiniciar o equipamento.

O tempo de boot fica menor: menos cdigo para ser executado na


inicializao do kernel.

Cuidado: mdulos rodam em kernel space. Uma vez carregados,


eles tem total controle do sistema! Por isso s podem ser
carregados como root.
Embedded
Labworks

COMPILANDO OS MDULOS
Para compilar apenas os mdulos, basta executar:
makemodules

Para cross-compilar os mdulos, no esquea de indicar a


arquitetura e o prefixo do cross-compiler. Exemplo:
makeARCH=armCROSS_COMPILE=armlinuxmodules
Embedded
Labworks

INSTALANDO OS MDULOS
Para instalar os mdulos nativamente, basta executar o comando
abaixo:
makemodules_install

No caso de um ambiente de compilao cruzada, os mdulos


devem ser instalados no rootfs do target.

Para isso, devemos passar o parmetro INSTALL_MOD_PATH no


comando de instalao:
makeARCH=<arch>INSTALL_MOD_PATH=<dir>/modules_install
Embedded
Labworks

DEPENDNCIAS DOS MDULOS


Alguns mdulos dependem de outros mdulos, que precisam ser
carregados primeiro.

Exemplo: o mdulo usb_storage depende do mdulo usbcore.

As dependncias entre os mdulos esto descritas em


/lib/modules/<kernelversion>/modules.dep .

Este arquivo gerado quando voc instala os mdulos.


Embedded
Labworks

CARREGANDO UM MDULO
O comando insmod carrega apenas um mdulo. necessrio
passar o caminho completo do mdulo.
insmod<module_path>.ko

O comando modprobe carrega um mdulo e todas as suas


dependncias. Deve-se passar apenas o nome do mdulo, sem a
extenso .ko e sem seu caminho completo.
modprobe<module_name>
Embedded
Labworks

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>

O comando modprobe descarrega um mdulo e todas as suas


dependncias (que no esto sendo usadas). Deve-se passar
apenas o nome do mdulo, sem a extenso .ko e sem seu caminho
completo.
modprober<module_name>
Embedded
Labworks

LISTANDO INFORMAES DOS MDULOS


O comando modinfo l informaes de um mdulo, como sua
descrio, parmetros, licena e dependncias. Deve-se passar
apenas o nome do mdulo, sem a extenso .ko e sem seu caminho
completo.
modinfo<module_name>

O comando lsmod lista todos os mdulos carregados.


lsmod
Embedded
Labworks

PASSANDO PARMETROS
Descobrindo os parmetros disponveis do mdulo:
modinfo<module>

Passando um parmetro via insmod:


insmod<module>param=value

Para passar um parmetro via modprobe, configurar o parmetro em


/etc/modprobe.conf ou em qualquer arquivo em /etc/modprobe.d/:
options<module>param=value

Para passar um parmetro via linha de comandos do kernel:


<module>.param=value
Embedded
Labworks

LOGS DO KERNEL
O kernel mantm um log de mensagens na memria em um buffer
circular.

Quando um novo mdulo carregado, informaes relevantes so


enviadas ao log do kernel.

Este log de mensagens pode ser exibido atravs do comando


dmesg (diagnostic message).

Mensagens de log tambm so exibidas na console.


Embedded
Labworks

LABORATRIO

Compilando, instalando e carregando mdulos


Embedded
Labworks

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.

Exemplos de sistemas de arquivo: FAT, NTFS, EXT2, EXT3, JFFS2.

Mas por que existem diferentes sistemas de arquivo?


Performance.
Segurana.
Economia de espao em disco.
Uso em diferentes tipos de dispositivo de armazenamento.
Embedded
Labworks

DISPOSITIVOS DE ARMAZENAMENTO
No Linux, os dispositivos de armazenamento so classificados em dois
tipos: dispositivos de bloco e memrias flash.

Isso porque, dentro do kernel, eles so manipulados por sub-sistemas


diferentes:
Dispositivos de bloco podem ser lidos ou escritos normalmente sem a
necessidade de apagar antes, e virtualmente no possuem limites de
escrita. Exemplo: HD.
Memrias flash trabalham em blocos e para serem escritas precisam ser
apagadas antes. Exemplo: flash NAND.

Por este motivo, vamos estudar estes dois sub-sistemas


separadamente.
Embedded
Labworks

LISTANDO DISPOSITIVOS DE BLOCO


Uma lista com todos os dispositivos de bloco disponveis no
sistema pode ser obtido em /proc/partitions:

cat/proc/partitions
majorminor#blocksname

80312571224sda
81303903744sda1
821sda2
858665088sda3
Embedded
Labworks

SISTEMAS DE ARQUIVO TRADICIONAIS


Existem sistemas de arquivo especficos para dispositivos de
bloco.

E tudo comeou com o tradicional sistema de arquivo ext2,


presente no Linux desde praticamente as primeiras verses.

um sistema de arquivo bem estvel, mas com um grande


problema: pode deixar o sistema em um estado inconsistente aps
um crash ou um reboot no esperado, fazendo com que o sistema
precise usar ferramentas de verificao de disco no prximo boot
(fsck.ext2).
Embedded
Labworks

SISTEMAS DE ARQUIVO TRADICIONAIS (cont.)


o mesmo caso do vfat, a implementao do sistema de arquivo
FAT no Linux. Quem nunca precisou executar um Scandisk depois de
um reboot inesperado no DOS ou no Windows!?

O ext2 foi usado durante um bom tempo no Linux (quase 10 anos).


Ento comearam a aparecer alguns sistemas de arquivo com uma
caracterstica especial chamada de journaling.
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

Todas as alteraes so salvas em


um journal (uma espcie de log) Escreve no arquivo
antes de serem aplicadas no
arquivo.
Limpa entrada no
journal
Embedded
Labworks

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

SISTEMAS DE ARQUIVO COM JOURNALING


O ext3 foi o padro para sistemas de arquivo com journal durante um bom
tempo. Ele basicamente o ext2 com a funcionalidade de journaling.

O ext4 a nova gerao com muitas melhorias, e o sistema de arquivo padro


das distribuies Linux atuais.

O btrfs (tambm chamado de ButterFS) a prxima gerao e visa substituir o


ext4. J esta disponvel na rvore oficial do kernel, mas ainda em estado
experimental.

Existem muitos outros sistemas de arquivo com journaling, incluindo reiserFS,


JFS e XFS, que possuem aplicaes especficas, como por exemplo trabalhar
com arquivos muito pequenos ou com carga de trabalho muito alta.
Embedded
Labworks

QUAL ESCOLHER?
Na prtica, voc usar o ext3 ou o ext4 em dispositivos de bloco.

Para dispositivos de bloco que usam memria flash (carto SD/MMC,


pendrive, etc), voc pode querer desabilitar o journaling ou usar o
ext2 para limitar a quantidade de escritas geradas pelo journal.

Voc s usar o vfat e o ntfs se quiser manter interoperabilidade com


sistemas Windows.

Sistemas de arquivo como o reiserFS, o JFS e o XFS so usados


normalmente em servidores, e tem pouca aplicao em Linux
embarcado.
Embedded
Labworks

SISTEMAS DE ARQUIVO COMPRIMIDOS


Sistemas embarcados possuem normalmente poucos recursos de
armazenamento. Por este motivo, voc pode querer usar um sistema de
arquivo que comprima os dados, deixando o tamanho da imagem do
sistema de arquivo menor, e ocupando menos espao no dispositivo de
armazenamento.

Um sistema de arquivo comprimido, como o prprio nome diz, armazena


os dados de forma comprimida no dispositivo de armazenamento.

Como algoritmos para escrever de forma comprimida so bem mais


complicados de implementar sem afetar a performance e a confiabilidade
do sistema, boa parte dos sistemas de arquivo comprimidos so de
apenas leitura.
Embedded
Labworks

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/

Os dados so comprimidos com a biblioteca zlib, suportando


arquivos de at 16M, e com tamanho mximo total da imagem de
at 256MB.

Voc s vai precisar do CramFS se seu kernel for muito antigo


(anterior verso 2.6.29).
Embedded
Labworks

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

Gera um sistema de arquivo em torno de 3 vezes menor que o ext3.


http://elinux.org/Squash_Fs_Comparisons

Muito usado em sistemas embarcados para parties que podem ser


apenas de leitura (kernel, binrios, etc).

Usado tambm em distribuies que rodam direto de um pendrive ou


CD/DVD (Live CD).
Embedded
Labworks

SISTEMAS DE ARQUIVO VOLTEIS


Quando trabalhamos com Linux embarcado, s vezes precisamos
criar arquivos temporrios, armazenar informaes de processos
em execuo, fazer log, etc.

Fazer isso em um dispositivo de armazenamento pode ser muito


custoso, envolve operaes de I/O e pode consumir a vida til do
dispositivo no caso de memrias flash.

Outro ponto que estas informaes so volteis, ou seja, no tem


mais utilidade aps o boot.

So nestes casos que usamos sistemas de arquivo volteis.


Embedded
Labworks

SISTEMAS DE ARQUIVO VOLTEIS (cont.)


Com um sistema de arquivo voltil, voc consegue manter um
diretrio do sistema montado em RAM. Ou seja, tudo o que voc
escrever neste diretrio, vai para a memria RAM!

Consequentemente, voc ir perder estas informaes no boot do


equipamento. Mas a soluo perfeita para armazenar dados e
arquivos temporrios.

O sistema de arquivo voltil padro no Linux atualmente o tmpfs.


Embedded
Labworks

TMPFS
O tmpfs um sistema de arquivo til para armazenar dados
temporrios em RAM (arquivos temporrios, logs, etc).

No gasta muita RAM, cresce e diminui automaticamente conforme


o uso (configurvel durante a montagem).

Como usar:
mountttmpfstmp/tmp

Para mais informaes, veja a documentao no kernel:


Documentation/filesystems/tmpfs.txt
Embedded
Labworks

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

Iniciando o rootfs de um dispositivo de bloco


Embedded
Labworks

MEMRIAS FLASH
Algumas limitaes diferem as memrias flash de dispositivos de bloco
tradicionais como HDs.

As memrias flash s podem ser apagadas em blocos. Estes blocos so


chamados de erase blocks, e podem variar de algumas dezenas para
algumas centenas de KB.

Quando voc apaga um bloco da flash, todos os bits assumem tipicamente


o valor 1. Com um bloco apagado, voc pode escrever em qualquer posio
da flash.

Porm, se voc escrever 0 em qualquer um dos bits de qualquer posio


da flash, voc s consegue faz-lo voltar para 1 apagando todo o bloco
correspondente da flash!
Embedded
Labworks

MEMRIAS FLASH (cont.)


Outra limitao das memrias flash a quantidade de vezes que
voc pode apagar e escrever nela (program/erase cycles).

Esta limitao, dependendo do modelo e do fabricante da flash,


pode variar entre 100.000 e 1.000.000 ciclos. Parece muito, mas
basta voc deixar sua aplicao fazendo log em memria flash
para transform-la em um peso de papel!

por este motivo que existe uma funcionalidade chamada wear


leveling, que minimiza o problema, e que pode ser implementada
por software ou diretamente em chips controladores de flash.
Embedded
Labworks

MEMRIAS FLASH (cont.)


Mesmo assim, depois de certo tempo de uso da flash, um ou mais
blocos sero inutilizados.

Por este motivo, existe uma tcnica chamada de BBM (Bad Block
Management).

Quando sai de fbrica, as memrias flash j possuem gravada


nelas uma tabela de bad blocks.

Toda camada de software que trabalha com memrias flash deve


ser capaz de ler e identificar estes bad blocks para no utilizar
regies invlidas da flash.
Embedded
Labworks

TIPOS DE MEMRIAS FLASH


Alm destas caractersticas especiais, existem basicamente dois
tipos de memria flash:
Flash NOR: Acesso aleatrio para leitura de dados (byte a byte),
velocidade alta para leitura mas lenta para apagar e escrever, baixa
densidade, menor durabilidade, alto custo por MB. Usada para armazenar
cdigo, substituir ROM.
Flash NAND: Acesso de leitura em blocos, velocidade baixa para leitura
mas alta para apagar e escrever, alta densidade, maior durabilidade,
baixo custo por MB. Usada para armazenar dados.

por causa de todas estas caractersticas e limitaes das memrias


flash que existe um sub-sistema especfico no kernel chamado de
MTD para tratar memrias flash.
Embedded
Labworks

MTD (MEMORY TECHNOLOGY DEVICES)

Interface com o sistema de arquivos


MTD User modules
ubifs jffs2 yaffs2

Char device Read-only block device Block device

MTD Chip drivers


NOR flash RAM chips
Block device Virtual memory

NAND flash DiskOnChip flash ROM chips Virtual devices

Hardware
Embedded
Labworks

CAMADAS DO SUB-SISTEMA MTD


A camada de baixo (MTD chip drivers) conversa diretamente com o
hardware, enquanto que a camada de cima (MTD user modules)
implementa os diferentes sistemas de arquivo e mecanismos de
acesso flash.

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.

Cada um dos MTD user modules ir tratar de forma diferente a


flash. neste contexto que as memrias flash tambm so
chamadas de dispositivos MTD.
Embedded
Labworks

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.

Alm disso, ele disponibiliza comandos ioctl() para voc poder


manipular a flash (ler informaes, apagar/gravar na flash, etc).

A principal utilidade deste mdulo no gerenciamento da flash,


quando usamos o pacote mtd-utils.
Embedded
Labworks

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.

Para mais informaes consulte o site do projeto:


http://www.linux-mtd.infradead.org/
Embedded
Labworks

MTDBLOCK
O driver mtdblock implementa o mdulo "block device" da flash.

Ele cria um dispositivo de bloco para cada partio de um dispositivo


MTD no sistema, normalmente nomeado /dev/mtdblockX, onde X o
nmero da partio.

Este mdulo permite acesso de leitura/escrita por bloco, como se


fosse um HD mesmo, mas no gerencia bad blocks e tambm no
trabalha com wear leveling em escritas.

Portanto, se voc quiser um sistema de arquivo que trabalhe com


todas as limitaes da flash, incluindo bad blocks e wear leveling,
voc vai precisar de um sistema de arquivo especfico para flash.
Embedded
Labworks

JFFS2
um dos sistemas de arquivo para flash mais antigos ainda em
utilizao.
http://www.linux-mtd.infradead.org/doc/jffs2.html

Vantagens: compresso em tempo de execuo (economiza espao),


confiabilidade, wear leveling e algoritmo ECC.

Desvantagens: no escala muito bem em memrias flash com


capacidades muito grandes. O kernel precisa varrer todo o sistema
de arquivo no momento da montagem.

Habilitando no kernel a opo CONFIG_JFFS2_SUMMARY reduz


drasticamente este tempo de montagem.
Embedded
Labworks

YAFFS2
um dos sucessores do JFFS2, com o objetivo de corrigir os
problemas de performance em memrias flash muito grandes.
http://www.yaffs.net/

Vantagens: tempo de boot rpido, confiabilidade, wear leveling e


algoritmo ECC.

Desvantagens: suporta apenas memrias flash NAND e no


comprime os dados.
Embedded
Labworks

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

Trabalha com volumes lgicos em cima de dispositivos MTD.

Overhead de metadata em parties pequenas.

Mas com a capacidade das memrias flash aumentando cada vez


mais, deve se tornar nos prximos anos o sistema de arquivo
padro para dispositivos MTD.
Embedded
Labworks

DICAS PARA TRABALHAR COM FLASH


No use a memria flash como regio de swap!

No use a memria flash para armazenamento voltil como logs e


arquivos temporrios (use tmpfs nestes casos).

Monte seu rootfs como apenas leitura, ou use o squashfs, quando


possvel.

Use a opo de montagem noatime para evitar atualizar o sistema de


arquivos toda vez que voc acessa um arquivo.

No use a opo de montagem sync (atualizao escreve


imediatamente no sistema de arquivo).
Embedded
Labworks

ESCOLHENDO O SISTEMA DE ARQUIVO

Dados No Somente No Bloco


Dispositivo Tem flash?
Volteis? Leitura?

Sim Sim
No
MTD
Sim
squashfs ext2 (noatime)

tmpfs ubifs ou jffs2 ext3 ou ext4


Embedded
Labworks

LABORATRIO

Iniciando o rootfs da memria flash


Embedded
Labworks

Desenvolvendo Sistemas
Linux Embarcado

Build system
Embedded
Labworks

O DESAFIO: INTEGRAR TUDO ISSO

Biblioteca Biblioteca

Biblioteca Biblioteca

Toolchain Biblioteca C

Linux kernel

Bootloader

Hardware
Embedded
Labworks

O DESAFIO: INTEGRAR TUDO ISSO (cont.)

u-boot.bin uImage rootfs.img


Embedded
Labworks

INTEGRANDO TUDO
O que vimos at aqui foi um passo-a-passo de como desenvolver
um sistema Linux embarcado do zero.

Na prtica, no precisamos desenvolver um sistema Linux


manualmente, ja que uma atividade trabalhosa, demorada e
suscetvel erros.

Portanto, temos normalmente duas possveis solues para


trabalhar no desenvolvimento de sistemas com Linux embarcado:
1. Usar uma distribuio Linux pronta.
2. Usar um sistema de build (build system).
Embedded
Labworks

DISTRIBUIO PRONTA
Existem diversas distribuies comerciais prontas para Linux
embarcado: MontaVista, Timesys Linux, Wind River Linux, etc.

Existem tambm diversas solues abertas, incluindo Android,


Emdebian, Ubuntu embedded, Tizen, Angstrom, Meego, etc.

Vantagens:
Simplicidade de uso.
Facilidade na instalao de novos pacotes.
Framework de desenvolvimento pronto e funcional.
Embedded
Labworks

DISTRIBUIO PRONTA (cont.)


Desvantagens:
Falta flexibilidade (compatibilidade com plataforma de hardware,
mecanismo de inicializao, framework de desenvolvimento
disponvel, erros em pacotes da distribuio, etc).
Normalmente o rootfs grande, ocupa muito espao no dispositivo de
armazenamento.
Tempo de boot normalmente alto.
Requer customizao para deixar o sistema mais leve.
Difcil de levantar quais pacotes open source so usados.
Embedded
Labworks

BUILD SYSTEM
O build system permite gerar um sistema Linux completo do zero.

Ele automatiza o processo de gerao dos diversos componentes


do sistema, incluindo o toolchain, o kernel, o bootloader, as
bibliotecas e as aplicaes.

Normalmente j contm um conjunto grande de pacotes


configurados para serem habilitados e utilizados pelo seu sistema.

E facilita o trabalho de adicionar novos pacotes se necessrio.


Embedded
Labworks

BUILD SYSTEM (cont.)


Vantagens:
Flexibilidade.
O processo de build torna-se reproduzvel, facilitando o trabalho de
recompilao, correo de problemas e adio de novas
funcionalidades.

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

PTXdist, desenvolvido pela empresa Pengutronix:


http://www.pengutronix.de/software/ptxdist/index_en.html

LTIB, desenvolvido principalmente pela Freescale:


http://www.ltib.org/
Embedded
Labworks

FERRAMENTAS (cont.)
OpenEmbedded, mais flexvel (e tambm mais complexo):
http://www.openembedded.org

Yocto, evoluo do OpenEmbedded:


http://www.yoctoproject.org/

Sistemas comerciais (MontaVista, WindRiver, Timesys).


Embedded
Labworks

LTIB
LTIB (Linux Target Image Builder) uma ferramenta usada para
desenvolver e liberar BSPs (Board Support Packages).
http://ltib.org/

Projeto inicialmente patrocionado pela Freescale, suporta gerar


imagens para ARM, PPC e Coldfire.

Permite gerar imagens do bootloader, kernel e rootfs.

Usa o sistema de pacotes RPM, e possui em torno de 200


aplicaes/bibliotecas disponveis.
Embedded
Labworks

BUILDROOT
Desenvolvido pelos mesmos mantenedores da uClibc.

Possibilita gerar o toolchain, o bootloader, o kernel e o rootfs com


muitas bibliotecas e aplicaes disponveis.

Mais de 700 aplicaes e bibliotecas integradas, de utilitrios


bsicos bibliotecas mais elaboradas como X.org, Qt, Gtk, Webkit,
Gstreamer, etc.

tima soluo para projetos pequenos e mdios.

Desde a verso 2009.02 um novo release liberado a cada 3 meses.


Embedded
Labworks

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

No final do processo de compilao, as imagens estaro


disponveis no diretrio abaixo:
lsoutput/images/
rootfs.ext2rootfs.jffs2uboot.binuImage
Embedded
Labworks

LABORATRIO

Gerando um sistema Linux do zero com o Buildroot


Embedded
Labworks

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.

Estas bibliotecas e aplicaes so normalmente disponibilizadas e


distribudas gratuitamente, e graas sua natureza open-source,
podem ser analisadas e modificadas de acordo com seu projeto.

Entretanto, o uso eficiente destes componentes nem sempre fcil.

Voc precisa encontrar e escolher o componente mais apropriado,


compilar e integrar ao seu projeto.
Embedded
Labworks

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

Pesquisar outros produtos com Linux embarcado, e identificar seus


componentes.

Perguntar comunidade (fruns, listas de discusso, etc).

Pesquisar no Google ou em outros sites de busca.


Embedded
Labworks

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

Pacotes open source


Embedded
Labworks

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.

nano: timo editor para os iniciantes.

uemacs: um emacs de tamanho reduzido.


Embedded
Labworks

FERRAMENTAS DE REDE
dropbear: implementao de um cliente e servidor SSH. Bom para
ter acesso remoto seguro e transferir arquivos.

dnsmasq: servidor DNS e DHCP.

iptables: ferramentas userspace para gerenciar o firewall.

netsnmp: implementao do protocolo SNMP.

openssl: biblioteca para conexes SLL e TLS.

vsftpd: servidor SFTP.


Embedded
Labworks

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.

thttpd: servidor HTTP simples, rpido e portvel, com suporte CGI e


autenticao. Sem suporte nativo 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.

FFmpeg: ferramenta completa para gravar, converter e tocar mdias.


Implementa a libavcodec, uma das mais usadas e famosas bibliotecas de
udio e vdeo da atualidade.

Mplayer: player multimdia (usa a libavcodec).

Alsalib: biblioteca associada com o sistema de som no Linux.

Outras bibliotecas e codecs como flac, libogg, libtheora, libvorbis, libmad,


libsndfile, speex, etc.
Embedded
Labworks

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 manipulao do hardware.

Bibliotecas de rede.

Bibliotecas para manipular arquivos XML.

Bibliotecas grficas (veremos em detalhes mais adiante).

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.

Veja o link abaixo para uma definio completa de software livre:


http://www.gnu.org/philosophy/free-sw.html
Embedded
Labworks

LICENAS (cont.)
Licenas de software livre possuem basicamente duas categorias:
Licenas copyleft.
Licenas non-copyleft.

Quando voc modifica e distribui um software sob licena copyleft,


voc precisa liber-lo sob a mesma licena original.
Mesma liberdade novos usurios.
Incentivo para voc contribuir de volta comunidade.

Licenas non-copyleft no tem estes requisitos, e verses modificadas


podem ser mantidas proprietrias, sendo necessrio apenas manter a
atribuio de autoria do projeto ao autor original.
Embedded
Labworks

GPL
GNU General Public Licence.

Cobre mais da metade dos projetos de software livre, incluindo o


U-Boot, o Linux, o Busybox e muitas aplicaes.

uma licena copyleft:


Trabalhos derivados precisam ser liberados sob a mesma licena.
Programas linkados com uma biblioteca GPL tambm precisam ser
liberados sob a GPL.
Embedded
Labworks

GPL (cont.)
Boa parte dos programas coberta pela GPLv2.

Alguns programas esto migrando para a GPLv3.


Principal diferena: o usurio deve ser capaz de rodar verses
modificadas do programa no dispositivo.
Embedded
Labworks

LGPL
GNU Lesser General Public Licence.

Cobre ~10% dos projetos de software livre.

uma licena copyleft:


Trabalhos derivados precisam ser liberados sob a mesma licena.
Mas programas linkados com uma biblioteca LGPL no precisam ser
liberados pela LGPL e podem ser mantidos proprietrios.
Entretanto, o usurio precisa ter a possibilidade de atualizar a biblioteca
independentemente do programa, portanto, a linkagem precisa ser
dinmica.

Licena usada nas maioria das bibliotecas.


Embedded
Labworks

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.

Existe uma grande famlia de licenas non-copyleft relativamente


similares em suas caractersticas, dentre elas:
Apache Licence
BSD Licence
MIT Licence
X11 Licence
Artistic Licence
Embedded
Labworks

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.

Voc modificou uma biblioteca qualquer sob a licena LGPL:


Voc precisa liberar as verses modificadas sob a mesma licena.
Embedded
Labworks

LICENAS (EXEMPLOS)
Voc criou uma aplicao que utiliza uma biblioteca LGPL:
Voc pode manter sua aplicao proprietria, mas precisa linkar
dinamicamente com a biblioteca.

Voc fez modificaes em um software non-copyleft:


Voc pode manter suas modificaes proprietrias, mas precisa
manter o crdito aos autores.
Embedded
Labworks

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

Identificando e analisando licenas open source


Embedded
Labworks

Desenvolvendo Sistemas
Linux Embarcado

Cross-compilando bibliotecas e aplicaes


Embedded
Labworks

COMO CROSS-COMPILAR?
Basicamente, temos duas solues:
Adaptar o pacote ao seu build system.
Compilar manualmente.

O processo de adaptao do pacote ao build system dependente do build


system utilizado. Por exemplo, para compilar um pacote dentro do Buildroot,
os procedimentos esto disponveis no manual do Buildroot:
http://buildroot.uclibc.org/downloads/manual/manual.html

Para compilar manualmente, voc precisa:


Toolchain.
Conhecer o mecanismo de compilao do pacote.
Embedded
Labworks

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/

Ele interpreta arquivos Makefile, que contm os comandos a


serem executados durante o processo de compilao.

Para compilar um programa ou biblioteca baseado em makefiles,


basta digitar o comando abaixo (considerando-se que voc tenha
um arquivo Makefile no diretrio corrente):
make
Embedded
Labworks

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

Desenvolvendo uma aplicao baseada em Makefile


Embedded
Labworks

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.

Ele tem basicamente os seguintes objetivos:


Ser um sistema de build universal e multiplataforma.
Analisar e verificar se a plataforma possui os requisitos necessrios
para compilar o pacote (biblioteca ou aplicao).
Configurar a aplicao, habilitando ou desabilitando funcionalidades
antes da compilao.
Embedded
Labworks

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.

Para compilar um software baseado em autotools, normalmente


usamos os comandos abaixo:
./configure
make
makeinstall
Embedded
Labworks

CROSS-COMPILANDO COM AUTOTOOLS


Para cross-compilar um software baseado em autotools, voc
precisar prestar ateno em alguns detalhes adicionais.

No script de configurao, voc precisa indicar o host (onde ir


executar o software) com a opo --host.

Dependendo do pacote, voc precisar indicar o nome das


ferramentas de compilao do toolchain, setando as variveis de
ambiente AR, AS, LD, CC, GCC, CPP, CXX.

Voc precisa indicar onde ir instalar o software usando a varivel


DESTDIR, que deve estar apontando para o diretrio onde se
encontra o rootfs do seu sistema.
Embedded
Labworks

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

Cross-compilando um software baseado em autotools


Embedded
Labworks

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.

Precisamos saber documentar as alteraes realizadas em pacotes


open-source, porque quando atualizarmos este pacote para uma nova
verso, ser necessrio aplicar as alteraes realizadas no pacote
original.

Precisamos de um mecanismo para distribuir estas alteraes, e tambm


para contribuir de volta com a comunidade.

Como a comunidade de software livre muito grande, precisamos de uma


linguagem comum.
Embedded
Labworks

PATCHES
Como ento documentar as alteraes realizadas em projetos
open-source? Atravs de patches!

Um patch descreve basicamente as diferenas entre um ou mais


arquivos de determinado diretrio ou projeto.

Um patch pode ser gerado automaticamente por uma ferramenta


de controle de verso (svn, git, mercurial), ou pode ser gerado
manualmente atravs da ferramenta diff:
diffrauprjorigprjalt>prj.patch
Embedded
Labworks

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.

Para aplicar o patch, basta entrar no diretrio do projeto original e


executar a ferramenta patch:
cdprjorig/
patchp1<../prj.patch
Embedded
Labworks

LABORATRIO

Criando e aplicando patches


Embedded
Labworks

Desenvolvendo Sistemas
Linux Embarcado

Bibliotecas grficas
Embedded
Labworks

CAMADA DE VDEO NO LINUX


Toolkit Grfico
Aplicao Aplicao Aplicao
(Qt, Gtk)
User
Biblioteca Toolkit Servidor Grfico
Aplicao
(SDL, DirectFB) Grfico (Qt) (X server)

Framebuffer driver comum Acesso


/dev/fbX direto
memria
Kernel
/dev/mem
Framebuffer Framebuffer
driver driver

Controladora Controladora
VGA LCD Hardware
Embedded
Labworks

CAMADA INPUT NO LINUX


Biblioteca Toolkit Servidor
Aplicao
grfica grfico grfico
User

Input event driver (/dev/input/eventX)

Input core

Input driver Input driver Input driver Input driver Input driver Kernel

Serio USB HID SPI I2C GPIO

Teclado ou Teclado ou Controladora


mouse PS2 Mouse USB Touchscreen
Acelermetro Joystick Hardware
Embedded
Labworks

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

Suporta acelerao de hardware 3D via OpenGL e acesso ao


framebuffer para grficos 2D.

Usada basicamente para desenvolvimento de aplicaes que


desejam acessar diretamente o hardware. Exemplos: jogos, mdia
players, etc.
Embedded
Labworks

JOGO CIVILIZATION USANDO SDL


Embedded
Labworks

DIRECTFB
Biblioteca de baixo nvel para trabalhar com interface grfica.
http://www.directfb.org

Pode ser utilizada para desenvolvimento de UI em aplicaes


simples, ou como uma camada de baixo nvel para bibliotecas
grficas de mais alto nvel.

Manipula eventos de entrada como mouse, teclado, joystick, etc.

Capacidade de trabalhar com aceleradores grficos em diferentes


hardwares.
Embedded
Labworks

MEDIACENTER USANDO DIRECTFB


Embedded
Labworks

X.ORG KDRIVE
Kdrive (antes Tiny-X) a implementao do servidor X para
sistemas embarcados.
http://www.x.org

Tambm trabalha diretamente sobre o framebuffer.

Suporte total ao protocolo X11, e permite o uso de qualquer


aplicao ou biblioteca baseada no X11.

O uso feito normalmente com um Toolkit rodando por cima (Qt,


Gtk, EFL, WxEmbedded, etc).
Embedded
Labworks

DESKTOP USANDO KDRIVE


Embedded
Labworks

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

Pode usar o servidor X ou o DirectFB como backend grfico.

No inclui um sistema de janelas.

Em desktop comum o Gnome como sistema de janelas. Em


sistemas embarcados, uma possibilidade o Matchbox.
Embedded
Labworks

EXEMPLOS DE USO DO GTK


OpenMoko

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/

J inclui um sistema de janelas, e fornece um framework completo


de desenvolvimento para trabalhar com estrutura de dados, thread,
networking, banco de dados, etc.

Implementao em C++.

Trabalha direto no framebuffer ou em cima do X11 ou DirectFB.


Embedded
Labworks

EXEMPLOS DE USO DO QT

Express GPS

OpenMoko Netflix Player


Embedded
Labworks

LABORATRIO

Desenvolvendo uma aplicao em Qt


Embedded
Labworks

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/

Interface via console, mas com frontends disponveis (Eclipse,


DDD, GDB/Insight, Kdbg, etc).

Pode ser usado para diversas tarefas, incluindo controlar a


execuo de um programa, colocar breakpoints, mudar o estado de
variveis ou fazer um dump da memria.
Embedded
Labworks

DEBUG REMOTO
Problema 1: os fontes esto na mquina de desenvolvimento e o binrio
est rodando na mquina alvo.

Problema 2: A mquina-alvo no tem recursos para instalar o gdb


completo e aplicaes com smbolos de debugging.

A soluo: gdb client na mquina de desenvolvimento e gdb server na


mquina alvo.
Embedded
Labworks

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

Debugging com GDB


Embedded
Labworks

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.

Em termos de desenvolvimento de aplicaes, o mesmo processo


comparado ao desenvolvimento para desktop, o que inclusive facilita
os testes.

Voc pode reusar aplicaes e bibliotecas sem nenhuma adaptao


na maioria das vezes.

Mas sempre leve em conta a limitao de recursos do seu


equipamento (capacidade de processamento, memria e
armazenamento).
Embedded
Labworks

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.

C++ pode ser usada para o desenvolvimento de aplicaes maiores. A


biblioteca C++ precisa normalmente ser adicionada ao sistema.

Java tambm uma possibilidade, mas leve em considerao o consumo


de recursos do dispositivo.

Linguagens de script so muito teis em determinadas tarefas, e ajudam


em aumentar a velocidade do desenvolvimento, mas requerem um
interpretador que tambm consome recursos de memria e
processamento.
Embedded
Labworks

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.

Kdevelop: uma IDE completa. Roda nativamente. Suporta diversas


linguagens incluindo C, C++ e Java.

Outras opes: Anjuta, Netbeans, vim, emacs, etc.


Embedded
Labworks

CONTROLE DE VERSO
CVS: Foi bastante popular, mas hoje no mais usado em novos
projetos.

Subversion: Tambm chamado de SVN, criado como substituto do


CVS, removendo diversas limitaes e com melhor performance.

Git: Sistema de controle de verso distribudo, permite ter cpias


locais e remotas. Desenvolvido por uma equipe comandada por
Linus e hoje o padro para novos projetos open source.

Mercurial: Trabalha da mesma forma que o Git, e uma opo


para sistemas de controle de verso distribudos.
Embedded
Labworks

LABORATRIO

Configurando e usando o Eclipse


Embedded
Labworks

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/

Atualmente, o Valgrind fornece ferramentas de anlise de memria


e profiling de aplicaes.

Um dos principais usos do Valgring na anlise de alocao


dinmica de memria e deteco de memory leak nas aplicaes.
Embedded
Labworks

APLICAO COM BUG


inttxData(char*data)
{
unsignedchar*ptr=NULL,*buf=NULL;
intsize=strlen(data);

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

TESTANDO COM VALGRIND


valgrind./leak
==3811==Memcheck,amemoryerrordetector
==3811==Copyright(C)20022009,andGNUGPL,byJulianSewardetal.
==3811==UsingValgrind3.6.0.SVNDebianandLibVEX;rerunwithhfor
copyrightinfo
==3811==Command:./leak
==3811==
Erroaoenviarmensagem!
==3811==
==3811==HEAPSUMMARY:
==3811==inuseatexit:13bytesin1blocks
==3811==totalheapusage:1allocs,0frees,13bytesallocated
==3811==
==3811==LEAKSUMMARY:
==3811==definitelylost:13bytesin1blocks
==3811==indirectlylost:0bytesin0blocks
==3811==possiblylost:0bytesin0blocks
==3811==stillreachable:0bytesin0blocks
==3811==suppressed:0bytesin0blocks
==3811==Rerunwithleakcheck=fulltoseedetailsofleakedmemory
==3811==
==3811==Forcountsofdetectedandsuppressederrors,rerunwith:v
==3811==ERRORSUMMARY:0errorsfrom0contexts(suppressed:13from8)
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.

Disponvel em sistemas GNU/Linux, e pode ser compilada para sua


plataforma alvo.
Embedded
Labworks

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/

Complementa o uso do strace, que no exibe as chamadas de


biblioteca.
Embedded
Labworks

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

Usando ferramentas de anlise


Embedded
Labworks

Desenvolvendo Sistemas
Linux Embarcado

E agora?
Embedded
Labworks

RECURSOS ONLINE
Site do kernel Linux:
http://www.kernel.org

Linux kernel mailing list:


http://www.tux.org/lkml

Acompanhar as mudanas nas novas verses do kernel:


http://wiki.kernelnewbies.org/LinuxChanges

Notcias e novidades sobre o desenvolvimento do kernel:


http://lwn.net
Embedded
Labworks

RECURSOS ONLINE (cont.)


Linux Foundation (notcias, blog e vdeos):
http://linuxfoundation.org

Free electrons (documentos e vdeos):


http://free-electrons.com

Revista eletrnica sobre Linux:


http://www.linuxjournal.com/

Notcias sobre Linux e software livre (brasileiro):


http://br-linux.org
Embedded
Labworks

RECURSOS ONLINE (cont.)


Portal Embarcados:
http://embarcados.com.br

Grupo sis_embarcados:
https://groups.google.com/group/sis_embarcados

Blog do Sergio Prado:


http://sergioprado.org
Embedded
Labworks

LIVRO SOFTWARE LIVRE

The Cathedral & The Bazaar


Eric S. Raymond
Embedded
Labworks

LIVROS DESENVOLVIMENTO DE SOFTWARE


The Linux programming interface
Michael Kerrisk

The art of UNIX Programming


Eric S. Raymond
Embedded
Labworks

LIVROS LINUX EMBARCADO

Embedded Linux Primer


Christopher Hallinan

Building Embedded Linux Systems


Karim Yaghmour & others
Embedded
Labworks

LIVROS LINUX KERNEL

Linux Kernel in a Nutshell


Greg Kroah-Hartman

Linux Kernel Development


Robert Love
Embedded
Labworks

LIVROS LINUX DEVICE DRIVERS


Essential Linux Device Drivers
Sreekrishnan Venkateswaran

Linux Device Drivers


Jonathan Corbet & others
OBRIGADO!
E-mail sergio.prado@e-labworks.com
Website http://e-labworks.com

Embedded Labworks

Por Sergio Prado. So Paulo, Novembro de 2012


Copyright Embedded Labworks 2004-2013. All rights reserved.

Anda mungkin juga menyukai