Escolar Documentos
Profissional Documentos
Cultura Documentos
Embedded Labworks
SOBRE O INSTRUTOR
✗ Sergio Prado tem mais de 17 anos de experiência 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.
✗ É sócio da Embedded Labworks, onde atua com consultoria, treinamento e
desenvolvimento de software para sistemas embarcados:
http://e-labworks.com
✗ Mantém um blog pessoal sobre Linux e sistemas embarcados em:
http://sergioprado.org
Embedded Labworks
AGENDA DO TREINAMENTO
✗ DIA 1: Introdução e arquitetura de sistemas Linux embarcado,
toolchain, bootloader e kernel.
AMBIENTE DE LABORATÓRIO
/opt/labs/ Ambiente de laboratório
dl/ Aplicações e pacotes opensource
Que serão usados durante as
atividades de laboratório
docs/ Documentação
guides/ Guias de consulta (shell, vi, etc)
hardware/ Documentação do hardware
training/ Slides e atividades de laboratório.
videos/ Vídeos
ex/ Exercícios de laboratório
tools/ Ferramentas de uso geral
Embedded Labworks
ORIENTAÇÕES GERAIS
✗ Pergunte...
✗ Troque experiências...
✗ Ajude...
✗ Participe!
Embedded Labworks
Linux embarcado
OS 3 MARCOS
✗ 1970: Engenheiros da Bell Labs, liderados por Ken Thompson e
Dennis Ritchie, criam o sistema operacional UNIX.
Em 1991...
”I'm doing a (free) operating system (just a
hobby, won't be big and professional like
gnu) for 386(486) AT clones. This has been
brewing since april, and is starting to get
ready. I'd like any feedback on things
people like/dislike in minix, as my OS
resembles it somewhat (same physical
layout of the file-system (due to practical
reasons) among other things).”
Embedded Labworks
20 ANOS DEPOIS
Embedded Labworks
O KERNEL
✗ Linux é o kernel!
http://www.kernel.org
PRINCIPAIS CARACTERÍSTICAS
✗ Código aberto e livre de royalties.
REUSO DE COMPONENTES
✗ Uma das principais vantagens do uso do Linux em sistemas
embarcados: reuso de componentes!
BAIXO CUSTO
✗ Sem royalties: use e abuse de software livre!
CONTROLE TOTAL
✗ Trabalhando com software livre, você tem o código-fonte de todos
os componentes do seu sistema.
QUALIDADE
✗ Muitos componentes open source são usados em milhares de
sistemas ao redor do mundo.
SUPORTE DA COMUNIDADE
✗ Componentes open-source são desenvolvidos por uma comunidade
de desenvolvedores e usuários.
MITOS
✗ Mito 1: ”Linux is Free”.
✗ Linux não é grátis, Linux é livre! Do 2o. parágrafo da GPL: ”When we
speak of free software, we are refering to freedom, not price”.
Linux embarcado
Arquitetura básica
Embedded Labworks
ARQUITETURA BÁSICA
Aplicação Aplicação
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded Labworks
COMPONENTES DO SISTEMA
✗ Hardware: seu produto!
HARDWARE
Aplicação Aplicação
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded Labworks
HARDWARE
Embedded Labworks
CPU
✗ Suporta mais de 28 arquiteturas diferentes (x86, ia64, ARM, PPC, MIPS,
SuperH, Blackfin, Coldfire, etc).
✗ O projeto uClinux foi criado para que o Linux pudesse ser usado em CPUs
sem MMU.
http://www.uclinux.org/
COMUNICAÇÃO
✗ O Linux suporta muitos barramentos comuns em sistemas
embarcados: I2C, SPI, CAN, 1-wire, SDIO, USB, etc.
TOOLCHAIN
Aplicação Aplicação
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded Labworks
TOOLCHAIN
✗ Conjunto de ferramentas de programação usadas para gerar
determinado produto, seja um software ou mesmo um sistema
completo.
TOOLCHAIN (cont.)
Código-fonte
Host
Toolchain nativo Cross-compiling toolchain
x86
COMPONENTES DO TOOLCHAIN
✗ Compilador (gcc).
TOOLCHAINS PRONTOS
✗ Linaro (ARM):
https://wiki.linaro.org/WorkingGroups/ToolChain
✗ Linux/MIPS:
http://www.linux-mips.org/wiki/Toolchains
Embedded Labworks
✗ Buildroot:
http://buildroot.uclibc.org/
✗ Yocto:
https://www.yoctoproject.org/
Embedded Labworks
Aplicação Aplicação
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded Labworks
Kernel
Rootfs
Memória flash
Embedded Labworks
BOOTLOADER
Aplicação Aplicação
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded Labworks
BOOTLOADER
✗ O bootloader tem basicamente duas responsabilidades:
✗ Inicializar o hardware.
✗ Carregar e executar o sistema operacional.
FUNCIONALIDADES DO BOOTLOADER
✗ Passagem de parâmetros para o kernel.
PRINCIPAIS BOOTLOADERS
✗ x86:
✗ LILO
✗ Grub
✗ Syslinux
KERNEL
Aplicação Aplicação
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded Labworks
INICIALIZAÇÃO BÁSICA
✗ Inicializa CPU, memória e barramentos.
CARACTERÍSTICAS DO KERNEL
✗ Gerenciar a execução dos processos e controlar o acesso à
memória e I/O.
ROOTFS
Aplicação Aplicação
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded Labworks
COMPONENTES BÁSICOS
✗ Biblioteca do sistema (uClibc, glibc, eglibc, dietlibc, etc).
✗ Mecanismo de inicialização.
✗ Bibliotecas e aplicações.
Embedded Labworks
BUSYBOX
✗ Pacote que combina versões mais leves de ferramentas UNIX em
um único binário, otimizado por tamanho.
SISTEMA LINUX
BUILD SYSTEM
✗ Um build system é capaz de:
✗ Gerar o toolchain.
✗ Compilar e gerar a imagem do bootloader.
✗ Configurar, compilar e gerar a imagem do kernel.
✗ Compilar bibliotecas e aplicações, e gerar a imagem final do rootfs.
Embedded Labworks
✗ Open source:
✗ Buildroot.
✗ LTIB.
✗ Yocto.
✗ OpenEmbedded.
Embedded Labworks
OS 3 PAPÉIS DO DESENVOLVEDOR
✗ Desenvolvedor de aplicações: desenvolve aplicações Linux.
VAMOS COMEÇAR?
Embedded Labworks
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 compilação).
✗ Buildsystem (ferramenta de geração do sistema Linux).
✗ IDE para desenvolvimento e debugging de aplicações.
Embedded Labworks
SOLUÇÕES
✗ Existem soluções prontas, fornecidas por empresas como
MontaVista, Wind River e TimeSys, com seu próprio ambiente e
ferramentas de desenvolvimento. Elas usam um conjunto de
componentes open-source e proprietários.
SO DE DESENVOLVIMENTO
✗ É fortemente recomendado o uso do Linux como sistema
operacional para desenvolvimento em Linux embarcado!
HOST E TARGET
✗ Host: máquina de desenvolvimento.
Serial
Host Target
Ethernet
Embedded Labworks
PERMISSÕES
✗ Linux é um sistema multi-usuário:
✗ root é o usuário administrador que tem permissão para executar
qualquer operação privilegiada como mudar a configuração do
sistema ou montar um sistema de arquivos.
✗ Outros usuários não tem todos os mesmos privilégios de
administração.
LABORATÓRIO
Linux embarcado
Wandboard Quad
Embedded Labworks
WANDBOARD QUAD
✗ i.MX6 Quad (4 núcleos ARM
Cortex-A9) rodando à 1GHz.
✗ 2G de RAM DDR3.
✗ Touchscreen capacitivo.
REFERÊNCIAS E DOCUMENTAÇÃO
✗ A documentação do hardware esta disponível no ambiente de
laboratório em docs/guides:
✗ IMX6DQRM.pdf (datasheet do i.MX6)
✗ WandboardQuadUserguide.pdf (guia de usuário da placa)
✗ FusionTouchDisplayDatasheet.pdf (datasheet do display)
✗ AdapterBoardSchematic.tar.gz (esquemático da placa adaptadora)
✗ Recursos na internet:
http://wandboard.org/
https://community.freescale.com/
Embedded Labworks
CONECTANDO O HARDWARE
Embedded Labworks
LABORATÓRIO
Linux embarcado
Toolchain
Embedded Labworks
TIPOS DE TOOLCHAIN
✗ As ferramentas de desenvolvimento normalmente disponíveis em um
desktop GNU/Linux são chamadas de toolchain nativo.
✗ Este toolchain roda na sua máquina e compila código para ser executado
na sua máquina, geralmente um x86.
Código-fonte
Host
Toolchain nativo Cross-compiling toolchain
x86
COMPONENTES DO TOOLCHAIN
Debugger (GDB)
Toolchain
Embedded Labworks
COMPILADOR GCC
✗ Compilador GNU C, o famoso compilador de software livre.
http://gcc.gnu.org/
BINUTILS
✗ Binutils é um conjunto de ferramentas para manipular arquivos
binários para uma arquitetura específica.
http://www.gnu.org/software/binutils/
BIBLIOTECA C
✗ O que é a biblioteca C?
✗ Interface entre as aplicações e o kernel.
Aplicações
✗ API para desenvolvimento de aplicações.
Biblioteca C
✗ O toolchain depende da biblioteca C, já que
ele irá linká-la com sua aplicação para
gerar os binários para a arquitetura-alvo.
Kernel
✗ Diversas bibliotecas C estão disponíveis:
glibc, eglibc, uClibc, dietlibc, musl, etc.
Embedded Labworks
GLIBC
✗ Biblioteca C do projeto GNU.
http://www.gnu.org/software/libc/
✗ Dependendo do seu sistema, pode não ser uma boa escolha, já que possui um
consumo considerável de espaço em disco/flash e memória RAM.
✗ Existe uma variante chamada eglibc (embedded glibc) compatível com a glibc
(binário e código-fonte) e com foco em sistemas embarcados. Atualmente a
eglibc é usada inclusive em algumas distribuições Linux.
Embedded Labworks
UCLIBC
✗ Mais leve e projetada para sistemas embarcados.
http://www.uclibc.org/
KERNEL HEADERS
✗ Sabemos que o toolchain depende da biblioteca C do sistema.
USANDO TOOLCHAINS
✗ Existem basicamente duas soluções para trabalhar com toolchains:
1. Usar um toolchain pronto, fornecido por uma empresa ou pela
comunidade.
2. Usar uma ferramenta para configurar e gerar um toolchain
customizado, de acordo com as suas necessidades.
Embedded Labworks
✗ Possíveis escolhas:
✗ Toolchain fornecido pelo fabricante do chip (ex: Freescale).
✗ Toolchain fornecido por empresas especializadas (ex: Mentor Graphics).
✗ Toolchain fornecido pela comunidade (ex: Linaro).
INSTALANDO E USANDO
✗ Basta seguir o procedimento do fornecedor da solução.
LABORATÓRIO
USANDO FERRAMENTAS
✗ Existem ferramentas que automatizam o processo de geração de
toolchains.
ALGUMAS FERRAMENTAS
✗ Crosstool-ng (suporta glibc, uClibc, eglibc):
http://crosstool-ng.org/
LABORATÓRIO
Linux embarcado
Bootloader
Embedded Labworks
BOOTLOADER
✗ O bootloader é o código responsável por:
✗ Inicializar o hardware (CPU, GPIO, controladora de RAM, etc).
✗ Carregar outro binário (normalmente o sistema operacional) de um
dispositivo de armazenamento para a RAM.
✗ Passar o controle da CPU para este binário.
Embedded Labworks
FUNCIONALIDADES DO BOOTLOADER
✗ Além destas funcionalidades básicas, a maioria dos bootloaders
possui uma linha de comandos com diversas funcionalidades,
dentre elas:
✗ Manipulação das memórias RAM e flash.
✗ Comunicação via rede e serial.
✗ Rotinas de diagnóstico de hardware.
✗ Suporte à variáveis de ambiente e execução de scripts.
✗ Passagem de parâmetros para o sistema operacional.
Embedded Labworks
BOOT EM ARM
✗ O processo de boot em plataformas ARM pode variar um pouco,
dependendo do sistema (SoC, placa, etc).
i.MX28 (FREESCALE)
Código de boot em ROM iniciado quando o i.MX28 é resetado. Lê
ROM Code as chaves de seleção do modo de boot para identificar a fonte
do boot (USB, SD/MMC, NAND, I2C, SPI, JTAG).
Linux Kernel
Roda da RAM. Assume o controle do sistema (a partir daqui, o
bootloader não 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 botão pode mudar a ordem da
busca.
Linux Kernel
Roda da RAM. Assume o controle do sistema (a partir daqui, o
bootloader não existe mais).
Embedded Labworks
LPC3250 (NXP)
Tenta o boot pela porta serial (modo de serviço), SPI,
ROM Code barramento externo e flash NAND, carregando o código para a
SRAM (56KB).
Linux Kernel
Roda da RAM. Assume o controle do sistema (a partir daqui, o
bootloader não existe mais).
Embedded Labworks
AT91 (ATMEL)
Procura por imagens de boot em diversos dispositivos de
ROM Code
armazenamento, e carrega para a SRAM (4KB).
Linux Kernel
Roda da RAM. Assume o controle do sistema (a partir daqui, o
bootloader não existe mais).
Embedded Labworks
i.MX53 (FREESCALE)
Código 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, cartão SD/MMC,
SATA, etc).
U-Boot (1) Carrega “um pedaço” do U-Boot para a RAM interna (72K). Este
código do U-Boot irá inicializar o hardware (clock, SDRAM, etc)
e carregar o U-Boot completo para a RAM.
Linux Kernel
Roda da RAM. Assume o controle do sistema (a partir daqui, o
bootloader não existe mais).
Embedded Labworks
U-BOOT
✗ Bootloader open-source (GPLv2) mais utilizado atualmente.
http://www.denx.de/wiki/U-Boot
FUNCIONALIDADES DO U-BOOT
✗ Exibir informações do hardware (memória, periféricos, etc).
✗ Etc!
Embedded Labworks
BAIXANDO O U-BOOT
✗ É de responsabilidade do fabricante disponibilizar os fontes do U-Boot
(porte) para a sua plataforma.
✗ 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.
CONFIGURANDO O U-BOOT
✗ O U-Boot suporta diversas arquiteturas e plataformas. Antes de
compilar o U-Boot, você precisa configurá-lo para a sua
plataforma com o comando abaixo:
$ make <board>_config
COMPILANDO O U-BOOT
✗ Para compilar o U-Boot, basta executar o comando make passando
o prefixo do cross-compiler. Exemplo:
$ make CROSS_COMPILE=armlinux
GRAVANDO O U-BOOT
✗ O processo de gravação do U-Boot pode ser feito de diferentes
formas, dependendo do target:
✗ Se o target puder iniciar por uma mídia removível (cartão SD,
pendrive, HD, etc), basta conectar o dispositivo removível na sua
máquina de desenvolvimento e gravar.
✗ Se o dispositivo usar memória flash, podem existir algumas opções:
✗ O bootloader de 1o. estágio pode fornecer um mecanismo de
escrita na flash.
✗ A CPU pode fornecer um monitor de boot que se comunica via
serial ou USB.
✗ JTAG.
Embedded Labworks
LABORATÓRIO
Linux embarcado
Kernel Linux
Embedded Labworks
VISÃO GERAL
Aplicação Aplicação
Biblioteca C
Kernel
Hardware
Embedded Labworks
HISTÓRICO
✗ O kernel é um dos componentes do sistema operacional, que requer
bibliotecas e aplicações para prover funcionalidades aos usuários.
COLABORAÇÃO
Embedded Labworks
ESTATÍSTICAS
✗ Algumas estatísticas da versão 3.9:
✗ 69 dias de desenvolvimento.
✗ 11.910 commits.
✗ 608.436 linhas adicionadas.
✗ 338.439 linhas removidas.
✗ Aproximadamente 7 commits por hora.
✗ Aproximadamente 10 linhas alteradas por minuto!
Embedded Labworks
ARQUITETURA
Embedded Labworks
GERENCIAMENTO DE PROCESSOS
✗ Um processo é um programa em execução, que possui um identificador (PID) e
esta associado à um conjunto de recursos como arquivos abertos, mapeamento
de memória, etc.
✗ Cada thread possui um contador de programa, uma região do stack e uma cópia
dos registradores da CPU.
✗ Internamente, o Linux não diferencia processos e threads. Uma thread nada mais
é do que um processo que compartilha recursos com outras threads!
GERENCIAMENTO DE MEMÓRIA
✗ O Linux trabalha com o mecanismo de memória virtual para
gerenciar a memória do sistema.
CHAMADAS DE SISTEMA
✗ O Linux possui aproximadamente 300 chamadas de sistema.
VERSIONAMENTO
✗ Antes da versão 2.6:
✗ Uma árvore de versões estáveis (1.0, 2.0, 2.2, 2.4).
✗ Uma árvore de versões de desenvolvimento (2.1, 2.3, 2.5).
CICLO DE RELEASE
✗ Processo de desenvolvimento a cada aproximadamente 3 meses.
✗ Merge window: 2 semanas (até sair 3.X-rc1).
✗ Bug fixing: 6 a 10 semanas (3.X-rc2, 3.X-rc3, etc).
FONTES DO KERNEL
✗ A versão oficial do código-fonte do kernel liberada por Linus
Torvalds encontra-se em:
http://www.kernel.org
LICENÇA
✗ Todo o código-fonte do Linux é software livre e liberado sob a
licença GPLv2.
LICENÇA (cont.)
✗ Mas e os módulos do kernel?
LABORATÓRIO
CONFIGURANDO O KERNEL
✗ O kernel possui centenas de drivers de dispositivo, diversos
protocolos de rede e muitos outros itens de configuração.
CONFIGURAÇÃO
✗ As configurações são salvas em um arquivo chamado .config no diretório
principal dos fontes do kernel, e possuem o formato key=value. Exemplo:
CONFIG_ARM=y
make xconfig
Embedded Labworks
make gconfig
Embedded Labworks
make nconfig
Embedded Labworks
make menuconfig
Embedded Labworks
OPÇÕES DE CONFIGURAÇÃO
✗ Opções booleanas (verdadeiro/falso):
[ ] → Opção desabilitada
[*] → Opção habilitada
✗ Opções de 3 estados:
< > → Opção desabilitada
<*> → Opção habilitada (builtin)
<M> → Opção habilitada (módulo)
DEPENDÊNCIAS
✗ Na configuração do kernel, podem existir dependências entre
funcionalidades:
✗ Exemplo 1: o driver de um dispositivo I2C só pode ser habilitado se o
barramento I2C for habilitado.
✗ Exemplo 2: o framework de porta serial do kernel (serial core) é
habilitado automaticamente quando um driver de UART é habilitado.
Embedded Labworks
✗ Por padrão, o kernel considera uma compilação nativa, então irá usar a
arquitetura da máquina de desenvolvimento (normalmente x86) no comando
abaixo:
$ make menuconfig
✗ Portanto, para configurar para ARM por exemplo, você precisa especificar a
arquitetura:
$ make ARCH=arm menuconfig
CONFIGURAÇÕES PRÉ-DEFINIDAS
✗ Arquivos de configuração pré-definidos para diversas plataformas
estão disponíveis em arch/<arch>/configs/.
COMPILANDO O KERNEL
✗ Depois de configurado, para compilar nativamente basta executar:
$ make
✗ O comando acima irá gerar uma imagem genérica para ARM. Se você
quiser gerar uma imagem específica para determinado bootloader, deve
adicionar ao fim do comando o nome da imagem. Exemplo para o U-Boot:
$ make ARCH=arm CROSS_COMPILE=armlinux uImage
Embedded Labworks
INSTALANDO O KERNEL
✗ Para instalar o kernel, basta executar o comando abaixo:
$ make install
FAZENDO A LIMPEZA
✗ Remove todos os arquivos gerados (imagens, arquivos-objeto, etc).
$ make clean
✗ Onde:
✗ console = dispositivo que será usado como console
✗ root = dispositivo onde se encontra o sistema de arquivos
✗ rootfstype = tipo do sistema de arquivos (JFFS2)
LABORATÓRIO
Linux embarcado
Rootfs
Embedded Labworks
SISTEMAS DE ARQUIVO
✗ Sistemas de arquivo são usados para organizar dados, de forma
hierárquica, em diretórios e arquivos disponíveis em dispositivos
de armazenamento (locais ou remotos).
O COMANDO MOUNT
✗ O comando mount permite montar um sistema de arquivo:
$ mount t type device mountpoint
✗ 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
estão armazenados os dados.
✗ mountpoint é o diretório onde os arquivos serão acessados, também
chamado de ponto de montagem.
Embedded Labworks
O COMANDO UMOUNT
✗ O comando umount permite desmontar um sistema de arquivo:
$ umount <dispositivo ou ponto de montagem>
✗ Montando um pendrive:
$ mount t vfat /dev/sda1 /mnt/usbkey
✗ Verificando o conteúdo:
$ ls /mnt/usbkey
docs prog.c picture.png movie.avi
LOCALIDADES DO ROOTFS
✗ O rootfs pode ser montado de diferentes localidades:
✗ Da partição de um HD.
✗ Da partição de um pendrive.
✗ Da partição de um cartão SD.
✗ Da partição de uma memória flash NAND.
✗ Pela rede, através do protocolo NFS.
✗ Da memória, pré-carregado pelo bootloader.
MONTANDO O ROOTFS
✗ Partição de um HD ou pendrive USB:
✗ root=/dev/sdXY, onde X é uma letra que indica o dispositivo e Y é
o número da partição.
✗ Exemplo: root=/dev/sdb2
Host Target
Servidor NFS Cliente NFS
Initramfs
Kernel
(cpio archive)
INITRAMFS
✗ Vantagens:
✗ Pode ser usado como um passo intermediário para montar o
verdadeiro rootfs (mecanismo comum em desktops e servidores).
✗ Em Linux embarcado, pode ser a solução para sistemas com
pouquíssimos recursos. O boot é mais rápido, e como o sistema de
arquivo já esta em memória, as aplicações também iniciam mais
rapidamente.
✗ Desvantagens:
✗ Como o initramfs é montado em RAM, o armazenamento é volátil
(perde as informações ao reiniciar).
Embedded Labworks
ORGANIZAÇÃO DO ROOTFS
✗ A organização do rootfs no Linux é padronizada pelo Filesystem
Hierarcy Standard.
http://www.pathname.com/fhs/
ARQUIVOS DE DISPOSITIVO
✗ Um conceito muito importante trazido do mundo Unix: boa parte
dos ”objetos do sistema” são representados como arquivos,
permitindo que as aplicações manipulem estes objetos usando uma
API comum (open, read, write, etc).
EXEMPLOS
✗ Exemplos de arquivos de dispositivo:
ls la /dev/ttyS* /dev/sda1
brwrw 1 root disk 8, 1 20120125 06:54 /dev/sda1
crwrw 1 root dialout 4, 64 20120125 06:54 /dev/ttyS0
crwrw 1 root dialout 4, 65 20120125 06:54 /dev/ttyS1
crwrw 1 root dialout 4, 66 20120125 06:54 /dev/ttyS2
crwrw 1 root dialout 4, 67 20120125 06:54 /dev/ttyS3
A INICIALIZAÇÃO
✗ Após montar o rootfs, o kernel irá tentar executar uma aplicação
de inicialização, também chamado de processo init.
A INICIALIZAÇÃO (cont.)
✗ Se nenhuma destes programas de inicialização forem encontrados,
o kernel entra em pânico!
Kernel panic not syncing: No init found.
Kernel
Monta o rootfs indicado por ”root=”
Inicia a aplicação ”init”
/sbin/init
Inicia outros serviços e aplicações
Rootfs
Embedded Labworks
MECANISMOS DE INICIALIZAÇÃO
✗ Depois que o kernel chamou a aplicação init, é responsabilidade do
rootfs o restante da inicialização do sistema.
SYSTEM V INIT
✗ O sysvinit possui basicamente os seguintes componentes:
✗ Aplicação init (o pai de todos os processos).
✗ Arquivo de configuração /etc/inittab.
✗ Scripts de inicialização em /etc/init.d/ ou /etc/rc.d/.
Embedded Labworks
/etc/inittab
# Startup the system
null::sysinit:/bin/mount t proc proc /proc
null::sysinit:/bin/mkdir p /dev/pts
# now run any rc scripts
::sysinit:/etc/init.d/rcS
# Put a getty on the serial port
ttySAC0::respawn:/sbin/getty L ttySAC0 115200 vt100
# Stuff to do for the 3finger salute
::ctrlaltdel:/sbin/reboot
# Stuff to do before rebooting
null::shutdown:/usr/bin/killall syslogd
Embedded Labworks
/etc/init.d/rcS
#!/bin/sh
for i in /etc/init.d/S??*; do
case "$i" in
*.sh)
. $i
;;
*)
$i start
;;
esac
done
Embedded Labworks
/etc/init.d/
ls l init.d/
total 8
rwxrxrx 1 root root 408 20110831 08:44 rcS
rwxrxrx 1 root root 478 20110908 15:02 S01logging
rwxrxrx 1 root root 1365 20110831 08:44 S20urandom
rwxrxrx 1 root root 282 20110831 08:44 S40network
rwxrxrx 1 root root 1092 20110908 16:05 S50dropbear
rwxrxrx 1 root root 73 20110913 14:50 S60leds
Embedded Labworks
LABORATÓRIO
Linux embarcado
Módulos do kernel
Embedded Labworks
MONOLÍTICO X MICROKERNEL
Embedded Labworks
O KERNEL LINUX
✗ O Linux é um kernel monolítico.
COMPILANDO OS MÓDULOS
✗ Para compilar os módulos, basta executar:
make modules
INSTALANDO OS MÓDULOS
✗ Para instalar os módulos nativamente, basta executar o comando
abaixo:
make modules_install
CARREGANDO UM MÓDULO
✗ O comando insmod carrega apenas um módulo. É necessário
passar o caminho completo do módulo.
insmod <module_path>.ko
DESCARREGANDO UM MÓDULO
✗ O comando rmmod descarrega apenas um módulo. Possível apenas
se o módulo não estiver mais em uso. Deve-se passar apenas o
nome do módulo, sem a extensão .ko e sem seu caminho completo.
rmmod <module_name>
PASSANDO PARÂMETROS
✗ Passando um parâmetro via linha de comando:
modprobe <module> param=value
LOGS DO KERNEL
✗ O kernel mantém um log de mensagens na memória em um buffer
circular.
LABORATÓRIO
Linux embarcado
SISTEMAS DE ARQUIVO
✗ Um sistema de arquivo é uma representação dos dados dentro de
um dispositivo de armazenamento.
DISPOSITIVOS DE ARMAZENAMENTO
✗ No Linux, os dispositivos de armazenamento são classificados em dois
tipos: dispositivos de bloco e memórias flash.
cat /proc/partitions
major minor #blocks name
8 0 312571224 sda
8 1 303903744 sda1
8 2 1 sda2
8 5 8665088 sda3
Embedded Labworks
JOURNALING
Aplicação
✗ Um sistema de arquivo com journal
foi projetado para manter a User space Escreve no arquivo
consistência dos dados mesmo Kernel space
após um crash do sistema ou um
reboot inesperado. Escreve uma
entrada no journal
JOURNALING (cont.)
Reboot
✗ Devido ao mecanismo de
journaling, o sistema de
arquivo nunca fica em um
Journal estado inconsistente
Não vazio? (corrompido).
Descarta entradas
incompletas no
journal
✗ Os últimos dados salvos,
no entanto, podem ser
Sim perdidos.
Executa
journal
Sistema de arquivo OK
Embedded Labworks
QUAL ESCOLHER?
✗ Na prática, você usará o ext4 em dispositivos de bloco.
CRAMFS
✗ O CramFS (Compressed ROM Filesystem) é um exemplo de sistema
de arquivo comprimido de apenas leitura, desenvolvido
especialmente para sistemas embarcados ou dispositivos com
baixa capacidade de armazenamento.
http://sourceforge.net/projects/cramfs/
SQUASHFS
✗ O SquashFS é uma espécie de sucessor do CramFS, visando atingir os
mesmos objetivos, mas com melhor compressão, melhor
performance de leitura e suporte à arquivos e sistemas maiores.
http://squashfs.sourceforge.net
TMPFS
✗ O tmpfs é um sistema de arquivo útil para armazenar dados
temporários em RAM (arquivos temporários, logs, etc).
✗ Como usar:
mount t tmpfs tmp /tmp
MISTURANDO TUDO
✗ Você pode dividir seu dispositivo de bloco em
partições: squashfs
Dispositivo de Bloco
✗ Uma partição squashfs para o rootfs (kernel, rootfs
comprimido
binários, etc). Salva espaço, e por ser apenas
leitura, fica protegido de alterações acidentais no
sistema de arquivos.
ext4
✗ Uma partição ext4 para leitura e escrita de dados dados e
do usuário e de configuração. configuração
✗ Dados temporários em RAM com o tmpfs.
tmpfs
RAM
dados
voláteis
Embedded Labworks
LABORATÓRIO
MEMÓRIAS FLASH
✗ Algumas limitações diferem as memórias flash de dispositivos de bloco
tradicionais como HDs.
✗ Por este motivo, existe uma técnica chamada de BBM (Bad Block
Management).
Hardware
Embedded Labworks
✗ Cada memória tem o seu MTD chip driver para possibilitar o acesso
ao hardware da flash. Mas cada sistema pode usar um ou mais
MTD user modules.
MTDCHAR
✗ O driver mtdchar implementa o módulo "char device" da flash. Ele cria
um dispositivo de caractere para cada partição de um dispositivo MTD
no sistema, normalmente chamado de /dev/mtdX, onde X é o número
da partição.
✗ Com este módulo, você tem acesso sequencial (byte a byte) de toda a
flash.
MTD-UTILS
✗ O mtd-utils é um conjunto de ferramentas para manipular
dispositivos MTD:
✗ mtdinfo retorna informações detalhadas do dispositivo.
✗ flash_eraseall apaga todo o dispositivo.
✗ flashcp escreve em memórias flash NOR.
✗ nandwrite escreve um memórias flash NAND.
✗ mkfs.jffs2 e mkfs.ubifs cria os respectivos sistemas de arquivo na
flash.
MTDBLOCK
✗ O driver mtdblock implementa o módulo "block device" da flash.
JFFS2
✗ É um dos sistemas de arquivo para flash mais antigos ainda em
utilização.
http://www.linux-mtd.infradead.org/doc/jffs2.html
YAFFS2
✗ É um dos sucessores do JFFS2, com o objetivo de corrigir os
problemas de performance em memórias flash muito grandes.
http://www.yaffs.net/
UBIFS
✗ Evolução do jffs2, dos mesmos desenvolvedores do mtd-utils,
disponível a partir do kernel 2.6.27.
http://www.linux-mtd.infradead.org/doc/ubifs.html
Sim Sim
Não
MTD
Sim
squashfs ext2 ou ext4
LABORATÓRIO
Linux embarcado
Build system
Embedded Labworks
Aplicação Aplicação
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded Labworks
INTEGRANDO TUDO
✗ O que vimos até aqui foi um passo-a-passo de como desenvolver
um sistema Linux embarcado do zero.
DISTRIBUIÇÃO PRONTA
✗ Existem diversas distribuições comerciais prontas para Linux
embarcado: MontaVista, Timesys Linux, Wind River Linux, etc.
✗ Vantagens:
✗ Simplicidade de uso.
✗ Facilidade na instalação de novos pacotes.
✗ Framework de desenvolvimento pronto e funcional.
Embedded Labworks
BUILD SYSTEM
✗ O build system permite gerar um sistema Linux completo do zero.
✗ Desvantagens:
✗ Tempo extra para aprender a usar e configurar a ferramenta para a
geração do seu sistema Linux customizado.
Embedded Labworks
FERRAMENTAS
✗ Buildroot, desenvolvido pela comunidade:
http://www.buildroot.net
FERRAMENTAS (cont.)
✗ OpenEmbedded, mais flexível (e também mais complexo):
http://www.openembedded.org
BUILDROOT
✗ Desenvolvido pelos mesmos mantenedores da uClibc.
BUILDROOT (cont.)
Fonte: http://free-electrons.com
Embedded Labworks
YOCTO
✗ Projeto patrocinado pela Linux Foundation que provê um conjunto de ferramentas
para auxiliar na criação de sistemas Linux para dispositivos embarcados.
https://www.yoctoproject.org
YOCTO (cont.)
Fonte: https://www.yoctoproject.org
Embedded Labworks
QUAL USAR?
✗ Depende, cada sistema de build tem suas características!
✗ Buildroot:
✗ Simples de usar.
✗ Ferramenta de configuração mais intuitiva.
✗ Compilação mais rápida.
✗ Ótima solução para projetos pequenos e médios.
Embedded Labworks
CONFIGURANDO O BUILDROOT
✗ Permite configurar, dentre outras opções:
✗ Arquitetura e modelo da CPU.
✗ Toolchain.
✗ Bootloader.
✗ Kernel.
✗ Bibliotecas e aplicações.
✗ Tipos das imagens do rootfs (ext2, jffs2, etc).
✗ Para configurar:
make menuconfig
Embedded Labworks
CONFIGURANDO O BUILDROOT
Embedded Labworks
COMPILANDO O BUILDROOT
✗ Configuração também fica armazenada em um arquivo .config.
✗ Para compilar:
make
LABORATÓRIO
Linux embarcado
Bibliotecas e aplicações
Embedded Labworks
BIBLIOTECAS E APLICAÇÕES
✗ Uma das grandes vantagens do Linux é a enorme quantidade de
bibliotecas e aplicações disponíveis que podem ser usadas
livremente no seu projeto.
PROCURANDO COMPONENTES
✗ Pesquisar em sites de busca.
COMO ESCOLHER?
✗ Licença: a licença pode ser um impeditivo para o uso de determinado
componente open source no seu produto.
Linux embarcado
LINGUAGENS DE SCRIPT
✗ Interpretadores das mais comuns linguagens estão disponíveis:
✗ Shell script
✗ Python
✗ Perl
✗ Lua
✗ Ruby
✗ TCL
✗ PHP
Embedded Labworks
EDITORES DE TEXTO
✗ vi: editor de texto em Linux embarcado mais usado.
FERRAMENTAS DE REDE
✗ dropbear: implementação de um cliente e servidor SSH. Bom para
ter acesso remoto seguro e transferir arquivos.
SERVIDORES WEB
✗ Busybox http server: servidor HTTP do Busybox, com suporte à CGI e
autenticação, ocupando apenas 9K de tamanho. Não suporta SSL.
✗ Boa: servidor HTTP simples e rápido. Trabalha com apenas uma thread de
execução, multiplexando o processamento de conexões simultâneas. Sem
suporte à controle de acesso e SSL.
✗ lighttpd: servidor HTTP mais completo, ótimo para gerenciar altas cargas,
rápido e seguro, com suporte à controle de acesso, CGI e SSL.
MULTIMEDIA
✗ Gstreamer: framework multimídia, permite codificar e decodificar diversos
containers e formatos multimídia. Suporta codecs de hardware através de
plugins.
BANCO DE DADOS
✗ SQLite: uma pequena biblioteca em C que implementa um
gerenciador de banco de dados leve que pode ser embarcado no
seu projeto.
✗ É ”a escolha” de banco de dados em Linux embarcado.
✗ Pode ser usado como uma biblioteca normal.
✗ Pode ser até compilada estaticamente com uma aplicação
proprietária, já que o SQLite é liberado sob domínio público.
Embedded Labworks
OUTRAS BIBLIOTECAS
✗ Bibliotecas de compressão/descompressão.
✗ Bibliotecas de criptografia.
✗ Bibliotecas de rede.
✗ Etc!
Embedded Labworks
Linux embarcado
Licenças
Embedded Labworks
LICENÇAS
✗ Todo software sob a licença de software livre dá à todos os
usuários 4 liberdades básicas:
✗ Liberdade de usar.
✗ Liberdade de estudar.
✗ Liberdade de copiar.
✗ Liberdade de modificar e distribuir cópias modificadas.
LICENÇAS (cont.)
✗ Licenças de software livre possuem basicamente duas categorias:
✗ Licenças copyleft.
✗ Licenças non-copyleft.
GPL
✗ GNU General Public Licence.
GPL (cont.)
✗ Boa parte dos programas é coberta pela GPLv2.
LGPL
✗ GNU Lesser General Public Licence.
LICENÇAS NON-COPYLEFT
✗ Versões modificadas de um software sob licença non-copyleft
podem ser mantidas proprietárias, desde que seja mantida a
autoria da versão original.
LICENÇAS (EXEMPLOS)
✗ Você modificou o Linux, o Busybox, o U-Boot ou outro software GPL:
✗ Você precisa liberar o software com as modificações realizadas sob
a mesma licença, e estar pronto para distribuir o código-fonte para
seus clientes.
LICENÇAS (EXEMPLOS)
✗ Você criou uma aplicação que utiliza uma biblioteca LGPL:
✗ Você pode manter sua aplicação proprietária desde que a linkagem
com a biblioteca seja dinâmica.
APLICANDO LICENÇAS
✗ Não existe uma regra única para aplicar licenças em software open
source, já que cada licença possui sua própria “receita de bolo”. De
qualquer forma, um projeto open source possui normalmente:
✗ Uma indicação da licença utilizada e uma cópia completa desta
licença no site do projeto.
✗ Uma cópia completa da licença utilizada no diretório principal dos
fontes do projeto. Normalmente este arquivo é nomeado como
LICENCE, LICENCE.TXT, COPYRIGHT ou COPYING.
✗ Um descritivo da licença utilizada no cabeçalho de cada arquivo-
fonte do projeto. O conteúdo deste descritivo depende da licença
utilizada.
Embedded Labworks
Linux embarcado
MECANISMOS DE COMPILAÇÃO
✗ Todo software possui um sistema de build ou mecanismo de
compilação.
MAKE
✗ O make é uma ferramenta bastante usada para compilar programas
e bibliotecas.
http://www.gnu.org/software/make/
MAKEFILE (EXEMPLO)
TOOLCHAIN:=/opt/labs/ex/09/buildroot/output/host/usr/bin/
CROSS_COMPILE:=armlinux
PATH:=${TOOLCHAIN}:${PATH}
all:
${CROSS_COMPILE}gcc teste.c o teste
clean:
rm Rf *.o teste
Embedded Labworks
LABORATÓRIO
AUTOTOOLS
✗ Autotools é o nome dado ao sistema de build do projeto GNU, que
contém um conjunto de ferramentas para auxiliar na compilação de
uma aplicação ou biblioteca.
AUTOTOOLS (cont.)
✗ O Autotools é composto pelas seguintes ferramentas:
✗ Autoconf: ferramenta responsável por gerar os scripts de
configuração.
✗ Automake: ferramenta responsável por gerar os makefiles.
✗ Libtool: ferramenta responsável por compilar e criar de forma
portável as bibliotecas da aplicação.
AUTOTOOLS (EXEMPLO)
# configurando o toolchain
export PATH=/usr/local/armlinux/bin:$PATH
# configurando a aplicação
./configure host=armlinux
# compilando
make
# instalando
make DESTDIR=/home/<user>/work/rootfs install
Embedded Labworks
LABORATÓRIO
Linux embarcado
Integrando componentes
Embedded Labworks
INTEGRANDO COMPONENTES
✗ Na integração de componentes open source com seu projeto, às vezes é
necessário realizar algumas modificações para fazê-lo funcionar, otimizar
o uso de espaço em disco, corrigir algum bug, etc.
PATCHES
✗ Como então documentar as alterações realizadas em projetos
open-source? Através de patches!
EXEMPLO DE PATCH
diff rau netcat/src/netcat.c netcat2/src/netcat.c
netcat/src/netcat.c 20111001 12:03:55.000000000
+++ netcat2/src/netcat.c 20120312 12:06:01.830816531
@@ 445,7 +445,7 @@
exit(EXIT_FAILURE);
}
debug_dv("Arguments parsing complete! Total");
+ printf("Linha adicionada\n");
#if 0
/* pure debugging code */
c = 0;
Embedded Labworks
APLICANDO PATCHES
✗ Com o arquivo de patch temos documentado as alterações
realizadas no projeto original.
Linux embarcado
Bibliotecas gráficas
Embedded Labworks
CAMADA FRAMEBUFFER
Toolkit Gráfico
Aplicação Aplicação Aplicação
(Qt, Gtk)
User
Biblioteca Toolkit Servidor Gráfico
Aplicação
(SDL, DirectFB) Gráfico (Qt) (X server)
Controladora Controladora
VGA LCD Hardware
Embedded Labworks
CAMADA INPUT
Biblioteca Toolkit Servidor
Aplicação
gráfica gráfico gráfico
User
Input core
Input driver Input driver Input driver Input driver Input driver Kernel
SDL
✗ SDL (Simple Directmedia Layer) é uma biblioteca multimídia para
acesso de baixo nível em dispositivos de entrada (teclado, mouse,
joystick, etc) e saída (vídeo, áudio, etc).
http://www.libsdl.org
DIRECTFB
✗ Biblioteca de baixo nível para trabalhar com interface gráfica.
http://www.directfb.org
X.ORG KDRIVE
✗ Kdrive (antes Tiny-X) é a implementação do servidor X para
sistemas embarcados.
http://www.x.org
Linux embarcado
Toolkits gráficos
Embedded Labworks
GTK
✗ Famoso toolkit usado no Gnome, disponibilizando uma API baseada
em widgets para o desenvolvimento de aplicações gráficas.
http://www.gtk.org
Maemo
Interface
proprietária
Embedded Labworks
Qt
✗ Famoso toolkit usado no KDE, também disponibilizando uma API
baseada em widgets para o desenvolvimento de aplicações
gráficas.
http://qt-project.org/
✗ Implementação em C++.
EXEMPLOS DE USO DO QT
Express GPS
LABORATÓRIO
Desenvolvimento de aplicações em Qt
Embedded Labworks
Linux embarcado
Ferramentas de desenvolvimento
Embedded Labworks
GDB
✗ O GDB (GNU Debugger) é o debugger padrão do projeto GNU,
disponível para diversas arquiteturas.
http://www.gnu.org/software/gdb/
DEBUG REMOTO
✗ Problema 1: os fontes estão na máquina de desenvolvimento e o binário
está rodando na máquina alvo.
ARQUITETURA GDB
Host Target
ARCHlinuxgdb gdbserver
Conexão
Serial ou
Ethernet
Binários e bibliotecas Binários e bibliotecas
com símbolos de sem símbolos de
debugging debugging
Embedded Labworks
LABORATÓRIO
Linux embarcado
Desenvolvimento de aplicações
Embedded Labworks
DESENVOLVENDO APLICAÇÕES
✗ Um sistema Linux embarcado é um sistema Linux normal, apenas
com um conjunto menor e mais enxuto de componentes.
LINGUAGEM DE PROGRAMAÇÃO
✗ A linguagem padrão para desenvolvimento de aplicações no nível do
sistema é a linguagem C. A biblioteca C padrão esta sempre presente
em sistemas Linux.
AMBIENTES DE DESENVOLVIMENTO
✗ Eclipse: Uma IDE completa baseada em plugins, ideal para
desenvolver outras IDEs. Roda em cima de uma JVM. Diversas
empresas de sistemas embarcados tem usado a plataforma
Eclipse para desenvolver IDEs para seus produtos. Ex: MontaVista
DevRocket, TimeSys TimeStorm, Windriver Workbench, TI Code
Composer, Freescale Codewarrior, etc.
CONTROLE DE VERSÃO
✗ CVS: Foi bastante popular, mas hoje não é mais usado em novos
projetos.
LABORATÓRIO
Linux embarcado
Ferramentas de análise
Embedded Labworks
VALGRIND
✗ O Valgring é um framework de instrumentação para se criar
ferramentas de análise dinâmica de aplicações.
http://valgrind.org/
STRACE
✗ O strace (system calls tracer) permite capturar todas as chamadas
de sistema realizadas pela sua aplicação.
http://sourceforge.net/projects/strace/
✗ Bastante útil para debugar uma aplicação que fecha sem exibir
nenhuma mensagem de erro, ou então para fazer engenharia
reversa em uma aplicação a qual você tenha somente o binário.
EXEMPLO STRACE
$ strace cat Makefile
execve("/bin/cat", ["cat", "Makefile"], [/* 38 vars */]) = 0
brk(0) = 0x98b4000
access("/etc/ld.so.nohwcap", F_OK) = 1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 1, 0) =
access("/etc/ld.so.preload", R_OK) = 1 ENOENT (No such file or directory)
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) = 1 ENOENT (No such file or directory)
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 aplicação.
http://freshmeat.net/projects/ltrace/
EXEMPLO LTRACE
$ ltrace nedit index.html
sscanf(0x8274af1, 0x8132618, 0x8248640, 0xbfaadfe8, 0) = 1
sprintf("const 0", "const %d", 0) = 7
strcmp("startScan", "const 0") = 1
strcmp("ScanDistance", "const 0") = 1
strcmp("const 200", "const 0") = 1
strcmp("$list_dialog_button", "const 0") = 1
strcmp("$shell_cmd_status", "const 0") = 1
strcmp("$read_status", "const 0") = 1
strcmp("$search_end", "const 0") = 1
strcmp("$string_dialog_button", "const 0") = 1
strcmp("$rangeset_list", "const 0") = 1
strcmp("$calltip_ID", "const 0") = 1
...
Embedded Labworks
SUMÁRIO LTRACE
$ ltrace c cat /etc/resolv.conf
% time seconds usecs/call calls function
22.10 0.000795 795 1 setlocale
8.51 0.000306 153 2 read
7.81 0.000281 281 1 write
7.65 0.000275 137 2 __fxstat
6.84 0.000246 61 4 __freading
6.31 0.000227 113 2 fclose
4.39 0.000158 158 1 open
4.06 0.000146 146 1 close
3.92 0.000141 141 1 posix_fadvise
3.59 0.000129 64 2 fileno
3.56 0.000128 64 2 __fpending
...
100.00 0.003597 29 total
Embedded Labworks
Linux Embarcado
E agora?
Embedded Labworks
RECURSOS ONLINE
✗ Site do kernel Linux:
http://www.kernel.org
✗ Grupo sis_embarcados:
https://groups.google.com/group/sis_embarcados
Embedded Labworks