Embedded Linux Slides PDF
Embedded Linux Slides PDF
Embedded Labworks
SOBRE O INSTRUTOR
✗ Sergio Prado tem mais de 20 anos de experiência em desenvolvimento de software
para sistemas embarcados, atuando principalmente em projetos com Linux
embarcado, Android embarcado e sistemas operacionais de tempo real.
AGENDA DO TREINAMENTO
✗ DIA 1: Introdução e arquitetura de sistemas com Linux embarcado,
toolchain, bootloader e kernel.
PRÉ-REQUISITOS
✗ Usuário nível básico de distribuições GNU/Linux.
AMBIENTE DE LABORATÓRIO
/opt/labs/ Ambiente de laboratório
dl/ Aplicações e pacotes open-source
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
Introdução
Embedded Labworks
OS 3 MARCOS
✗ 1970: Engenheiros da Bell Labs, liderados por Ken Thompson e
Dennis Ritchie, criam o sistema operacional UNIX.
Em 1991...
O KERNEL
✗ Linux é um kernel!
https://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 20 arquiteturas diferentes (x86, ia64, ARM, ARM64,
PowerPC, MIPS, RISC-V, MicroBlaze, ARC, etc).
✗ O projeto uClinux foi criado para utilizar o Linux em sistemas sem MMU.
https://en.wikipedia.org/wiki/MClinux
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).
✗ Depurador (gdb).
Embedded Labworks
TOOLCHAINS PRONTOS
✗ Linaro (ARM):
https://wiki.linaro.org/WorkingGroups/ToolChain
✗ Buildroot:
https://buildroot.org/
✗ Yocto Project:
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.
PRINCIPAIS BOOTLOADERS
✗ x86:
✗ LILO
✗ Grub
✗ Syslinux
KERNEL
Aplicação Aplicação
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded Labworks
ROOTFS
Aplicação Aplicação
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware
Embedded Labworks
COMPONENTES BÁSICOS
✗ Biblioteca do sistema (glibc, uClibc-ng, musl, dietlibc, etc).
✗ 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.
✗ OpenEmbedded/Yocto Project.
✗ OpenWrt.
✗ PTXdist.
Embedded Labworks
OS 3 PAPÉIS DO DESENVOLVEDOR
✗ Desenvolvedor de aplicações: desenvolve aplicações Linux.
VAMOS COMEÇAR?
Embedded Labworks
Linux embarcado
Kit de desenvolvimento
Embedded Labworks
TORADEX
✗ A Toradex é uma empresa Suíça que projeta e desenvolve
computadores em módulo ou sistemas em módulo juntamente com
placas base e acessórios compatíveis para o mercado de sistemas
embarcados.
HENSYS
✗ A HENSYS é uma empresa brasileira, focada em desenvolvimento de hardware
de alta qualidade, oferecendo serviços de engenharia para customização de
produtos e também desenvolvimento de firmware para sistemas embarcados.
COLIBRI IMX6DL
✗ System-on-module (SOM) da Toradex.
REFERÊNCIAS E DOCUMENTAÇÃO
✗ A documentação do hardware está disponível no ambiente de
laboratório do treinamento em /opt/labs/docs/hardware:
✗
SOC_imx6sdl_datasheet.pdf: datasheet do SOC.
✗
SOM_colibri_imx6_datasheet.pdf: datasheet do SOM.
✗
BASEBOARD_aster_datasheet.pdf: datasheet da placa base.
✗
BASEBOARD_aster_schematics_v1.1b.pdf: esquemático da placa base.
✗
CAPE_ipe_v1.3.pdf: esquemático da placa de expansão.
✗ Recursos na internet:
https://www.toradex.com/community/
https://community.nxp.com/
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 (normalmente x86 ou x86-64).
Código-fonte
Host
Toolchain nativo Cross-compiling toolchain
x86
COMPONENTES DO TOOLCHAIN
Debugger (GDB)
Toolchain
Embedded Labworks
COMPILADOR GCC
✗ O GCC (GNU Compiler Collection) é o compilador do projeto GNU.
https://gcc.gnu.org/
BINUTILS
✗ Binutils é um conjunto de ferramentas para manipular arquivos
binários para uma arquitetura específica.
https://www.gnu.org/software/binutils/
BIBLIOTECA C
✗ O que é a biblioteca C?
✗ Interface entre as aplicações e o kernel. Aplicações
✗ API para o 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, uClibc-ng, musl, dietlibc, etc.
Embedded Labworks
GLIBC
✗ Biblioteca C do projeto GNU (licença LGPL).
https://www.gnu.org/software/libc/
✗ Dependendo do 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.
UCLIBC-NG
✗ A uClibc-ng é mais leve e projetada para sistemas embarcados (licença LGPL).
https://uclibc-ng.org/
✗ Enquanto que um build mínimo da glibc pode ocupar em torno de 2MB, um build
da uClibc pode ocupar apenas 500KB!
MUSL
✗ A musl é uma outra opção de biblioteca C para sistemas
embarcados.
https://www.musl-libc.org
COMPARANDO
Linkagem estática
541752 139656 17212
Not stripped
Linkagem estática
414896 87676 9084
Stripped
Embedded Labworks
KERNEL HEADERS
✗ Sabemos que o toolchain depende da biblioteca C do sistema.
✗
Definições de constantes em <asm-generic/fcntl.h>:
#define O_RDWR 00000002
ESCOLHENDO O TOOLCHAIN
✗ Existem basicamente duas soluções para selecionar o toolchain
para um projeto com Linux embarcado:
1. Utilizar um toolchain pronto, fornecido por uma empresa ou
disponibilizado pela comunidade.
2. Utilizar 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 hardware (NXP, Toradex, etc).
✗ Toolchain fornecido por empresas especializadas (Mentor Graphics, etc).
✗ Toolchain fornecido pela comunidade (Linaro, Buildroot, etc).
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-ng, musl):
https://crosstool-ng.github.io/
CROSSTOOL-NG
✗ O crosstool-NG é a principal ferramenta de código-aberto
específica para a criação de toolchains.
https://crosstool-ng.github.io/
CROSSTOOL-NG (cont.)
Embedded Labworks
LABORATÓRIO
Gerando um toolchain
Embedded Labworks
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 interface de linha de comandos com diversas opções,
incluindo:
✗ Rotinas de diagnóstico de hardware.
✗ Manipulação das memórias RAM e flash.
✗ Comunicação via rede e serial.
✗ Suporte à variáveis de ambiente e execução de scripts.
✗ Passagem de parâmetros para o sistema operacional.
Embedded Labworks
BOOT EM ARM
O SoC tem um código de boot em uma ROM interna, responsável
ROM Code
por carregar um bootloader de 1o. estágio (SPL) para uma
memória RAM interna (SRAM ou IRAM).
i.MX28 (NXP)
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).
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).
AT91 (ATMEL)
Procura por imagens de boot em diversos dispositivos de
ROM Code
armazenamento, e carrega para a SRAM (4KB).
i.MX5/i.MX6 (NXP)
Código de boot em ROM é iniciado no reset. Lê o registrador
ROM Code BOOT_MODE ou um conjunto de GPIOs para determinar o
dispositivo de boot (NOR/NAND, cartão SD/MMC, SATA, etc).
U-Boot SPL Uma versão mínima do U-Boot que irá inicializar o hardware
(clock, SDRAM, etc) e carregar o U-Boot completo para a RAM.
A31 (ALLWINNER)
Código de boot em ROM é iniciado no reset. Verifica as
ROM Code interfaces de boot suportadas (NAND, SD Card, USB) para
carregar o SPL para a memória RAM interna do chip.
U-Boot SPL Uma versão mínima do U-Boot que irá inicializar o hardware
(clock, SDRAM, etc) e carregar o U-Boot completo para a RAM.
U-BOOT
✗ Bootloader open-source mais utilizado atualmente (licença GPLv2).
https://www.denx.de/wiki/U-Boot
FUNCIONALIDADES DO U-BOOT
✗ Exibir informações do hardware (memória, periféricos, etc).
BAIXANDO O U-BOOT
✗ É responsabilidade do fabricante do hardware disponibilizar o código-fonte do
U-Boot (porte) para a sua plataforma.
✗ O fabricante pode fazer isso e enviar o código para a árvore principal do projeto
(mainline). Neste caso, os fontes podem ser baixados no site do projeto em:
https://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.
CÓDIGO-FONTE DO U-BOOT
$ ls
api configs dts Kconfig post
arch defconfig env lib README
board disk examples Licenses scripts
cmd doc fs MAINTAINERS spl
common Documentation include Makefile test
config.mk drivers Kbuild net tools
Embedded Labworks
CONFIGURANDO O U-BOOT
✗ O U-Boot suporta diversas arquiteturas de CPU e plataformas de
hardware. Antes de compilar o U-Boot, você precisa configurá-lo
para a sua plataforma de hardware:
$ make <board_config>
COMPILANDO O U-BOOT
✗ Para compilar o U-Boot, basta executar o comando make passando
o prefixo do toolchain:
$ make CROSS_COMPILE=arm-linux-
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 o U-Boot.
✗ Se o dispositivo utilizar armazenamento interno como flash NAND ou
eMMC, podem existir algumas opções, incluindo:
✗ O ROM code pode ter um monitor de boot que se comunica via
serial ou USB com uma ferramenta de gravação no PC.
✗ Interface JTAG.
Embedded Labworks
U-BOOT PROMPT
U-Boot 2018.07-g74ce0cd-dirty (Mar 04 2019 - 08:24:27 -0300)
COMANDOS DO U-BOOT
✗ O U-Boot possui diversos comandos para manipular o hardware e o
processo de boot.
> bdinfo
arch_number = 0x00000000
boot_params = 0x10000100
DRAM bank = 0x00000000
-> start = 0x10000000
-> size = 0x20000000
eth0name = FEC
ethaddr = (not set)
current eth = FEC
ip_addr = 192.168.0.2
baudrate = 115200 bps
...
Embedded Labworks
VARIÁVEIS DE AMBIENTE
✗ A configuração do bootloader e do processo de boot é feita através
de variáveis de ambiente do U-Boot.
> saveenv
Saving Environment to MMC... Writing to MMC(0)... OK
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
✗ Estatísticas da versão 4.17:
✗ 64 dias de desenvolvimento.
✗ 1.696 desenvolvedores.
✗ 13.453 commits.
✗ 690.000 linhas adicionadas.
✗ 869.000 linhas removidas.
✗ Aproximadamente 9 commits por hora.
✗ Aproximadamente 17 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 está associado a um conjunto de recursos como arquivos abertos,
mapeamento de memória, etc.
GERENCIAMENTO DE MEMÓRIA
✗ O Linux trabalha com o mecanismo de memória virtual para
gerenciar a memória do sistema.
MMU
Endereço Endereço
virtual físico
CPU MMU Memória
Embedded Labworks
VANTAGENS DA MMU
✗ Um sistema com MMU é capaz de prover:
✗ Maior endereçamento de memória para os processos. Em uma
arquitetura de 32 bits, os processos podem ter acesso a um
endereçamento linear de até 3G de memória virtual.
✗ SWAP: se faltar memória física, possibilita salvar e recuperar
páginas de memória do disco.
✗ Gerenciamento dinâmico da memória do processo (stack, heap, etc).
✗ Compartilhamento: os processos podem compartilhar memória
(código, dados, etc), usado por exemplo em mecanismos de IPC.
✗ Proteção: cada processo só enxerga seu espaço de endereçamento,
onde um acesso inválido gera uma exceção.
Embedded Labworks
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 3 meses aproximadamente.
✗ Merge window: 2 semanas (até sair X.Y-rc1).
✗ Bug fixing: 6 a 10 semanas (X.Y-rc2, X.Y-rc3, etc).
FONTES DO KERNEL
✗ A versão oficial do código-fonte do kernel encontra-se em:
https://www.kernel.org/
LICENÇA
✗ Todo o código-fonte do kernel Linux é software livre e liberado sob
a licença GPLv2.
LICENÇA (cont.)
✗ Mas e os módulos do kernel?
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 (built-in)
<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.
✗ Por padrão, o kernel considera uma compilação nativa, então irá usar a
arquitetura da máquina de desenvolvimento no comando abaixo:
$ make 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
INSTALANDO O KERNEL
✗ Para instalar o kernel, basta executar o comando abaixo:
$ make INSTALL_PATH=<install_dir> install
DEVICE TREE
✗ Muitas plataformas possuem dispositivos de hardware que não podem
ser identificados dinamicamente pelo kernel.
LIMPANDO A COMPILAÇÃO
✗ Remove todos os arquivos gerados (imagens, arquivos-objeto, etc).
$ make ARCH=arm clean
✗ Onde:
✗ console = dispositivo serial que será utilizado como console.
✗ root = partição onde se encontra o sistema de arquivos (rootfs).
✗ rootfstype = tipo do sistema de arquivos.
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, ext4,
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
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
Kernel Initramfs
(cpio archive)
INITRAMFS
✗ Vantagens:
✗ Pode ser usado como um passo intermediário para montar o
verdadeiro rootfs (mecanismo comum em desktops e servidores).
✗ O boot é mais rápido e as aplicações iniciam mais rapidamente.
✗ É mais seguro pois impede alterações persistentes no rootfs.
✗ Pode ser utilizado para implementar um mecanismo de update de
firmware.
✗ 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 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, close, etc).
EXEMPLOS
✗ Exemplos de arquivos de dispositivo:
$ ls -la /dev/ttyS* /dev/sda1
brw-rw---- 1 root disk 8, 1 2012-01-25 06:54 /dev/sda1
crw-rw---- 1 root dialout 4, 64 2012-01-25 06:54 /dev/ttyS0
crw-rw---- 1 root dialout 4, 65 2012-01-25 06:54 /dev/ttyS1
crw-rw---- 1 root dialout 4, 66 2012-01-25 06:54 /dev/ttyS2
crw-rw---- 1 root dialout 4, 67 2012-01-25 06:54 /dev/ttyS3
PROCFS
✗ O sistema de arquivo virtual procfs exporta (normalmente para o
diretório /proc) um conjunto de informações do kernel, incluindo
estatísticas dos processos, memória e uso de I/O.
PROCFS (cont.)
✗ Montando o procfs:
$ mount -t proc none /proc
SYSFS
✗ O sistema de arquivo virtual sysfs exporta (normalmente para o
diretório /sys) informações de drivers e dispositivos de hardware
conectados ao sistema.
SYSFS (cont.)
✗ Montando o sysfs:
$ mount -t sysfs none /sys
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 nenhum destes programas de inicialização for encontrado, 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”
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/mount -t sysfs sysfs /sys
/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 /etc/init.d/
total 8
-rwxr-xr-x 1 root root 408 2011-08-31 08:44 rcS
-rwxr-xr-x 1 root root 478 2011-09-08 15:02 S01logging
-rwxr-xr-x 1 root root 1365 2011-08-31 08:44 S20urandom
-rwxr-xr-x 1 root root 282 2011-08-31 08:44 S40network
-rwxr-xr-x 1 root root 1092 2011-09-08 16:05 S50dropbear
-rwxr-xr-x 1 root root 73 2011-09-13 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 nativamente, basta executar o comando
abaixo na raiz do código-fonte do kernel:
$ 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 o módulo passado, sem
verificar suas dependências. É necessário passar o caminho
completo do módulo.
# insmod /lib/modules/4.19.17/kernel/drivers/iio/industrialio.ko
DESCARREGANDO UM MÓDULO
✗ O comando rmmod descarrega apenas o módulo passado, sem
descarregar suas dependências. Funciona 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 industrialio
MODINFO
# modinfo industrialio
filename: /lib/modules/4.19.17/kernel/drivers/iio/industrialio.ko
license: GPL
description: Industrial I/O core
author: Jonathan Cameron <jic23@kernel.org>
srcversion: 9C0B01D46E2B110B4619BFE
depends:
intree: Y
name: industrialio
vermagic: 4.19.17 SMP mod_unload modversions ARMv6 p2v8
Embedded Labworks
LSMOD
# lsmod
Module Size Used by
inv_mpu6050_i2c 16384 0
inv_mpu6050 20480 2 inv_mpu6050_i2c
industrialio_trigge 16384 1 inv_mpu6050
kfifo_buf 16384 1 industrialio_triggered_buffer
industrialio 69632 3 inv_mpu6050,industrialio_triggere...
Embedded Labworks
PASSANDO PARÂMETROS
✗ Passando parâmetros ao carregar o módulo:
# modprobe <module> param=value
LABORATÓRIO
Linux embarcado
SISTEMAS DE ARQUIVO
✗ Um sistema de arquivo é uma representação dos dados salvos em
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.
DISPOSITIVOS DE BLOCO
✗ Uma lista com todos os dispositivos de bloco disponíveis no
sistema pode ser obtido em /proc/partitions:
$ 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
Escreve uma
reboot inesperado. entrada no journal
JOURNALING (cont.)
Reboot
✗ Devido ao mecanismo de
journaling, o sistema de
arquivo nunca fica em um
Journal
vazio?
estado inconsistente
Não
(corrompido).
Descarta entradas
incompletas no
journal ✗ Os últimos dados salvos,
Sim
no entanto, podem ser
perdidos.
Executa
journal
Sistema de arquivo OK
Embedded Labworks
✗ Isso porque estes dispositivos possuem uma controladora chamada FTL (Flash
Translation Layer) que converte a flash em um disco para o sistema operacional.
✗ Para estes casos, podemos utilizar o F2FS (Flash-Friendly File System), um novo
sistema de arquivo criado pela Samsung que leva em consideração as
características e limitações da memória flash do dispositivo.
Embedded Labworks
QUAL ESCOLHER?
✗ Na prática, você utilizará por padrão o ext4 em dispositivos de
bloco (talvez o ext4 seja substituído pelo btrfs em alguns anos).
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.
https://www.kernel.org/doc/Documentation/filesystems/cramfs.txt
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 a arquivos e sistemas maiores.
https://www.kernel.org/doc/Documentation/filesystems/squashfs.txt
TMPFS
✗ O tmpfs é um sistema de arquivo útil para armazenar dados
temporários em RAM (arquivos temporários, logs, etc).
MISTURANDO TUDO
✗ Você pode dividir seu dispositivo de bloco em
partições: squashfs
rootfs
Dispositivo de Bloco
✗ Uma partição squashfs para o rootfs (kernel, comprimido
binários, etc). Salva espaço, e por ser apenas
leitura, fica protegido de alterações acidentais no
sistema de arquivos.
✗ Uma partição ext4 para leitura e escrita de dados ext4
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
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) ao conteúdo
da 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.
https://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 ext4 ou f2fs
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 manualmente.
DISTRIBUIÇÃO PRONTA
✗ Existem diversas distribuições comerciais prontas para Linux
embarcado: MontaVista, Timesys Linux, Wind River Linux, etc.
BUILD SYSTEM
✗ O build system permite gerar um sistema Linux completo do zero.
✗ Desvantagens (?):
✗ Tempo adicional para aprender a usar e configurar a ferramenta para
a geração do sistema Linux customizado.
Embedded Labworks
FERRAMENTAS
✗ Buildroot, desenvolvido pela comunidade:
https://buildroot.org/
FERRAMENTAS (cont.)
✗ OpenEmbedded, mais flexível (e também mais complexo):
https://www.openembedded.org/
BUILDROOT
✗ Desenvolvido pelos mesmos mantenedores da uClibc.
BUILDROOT (cont.)
Embedded Labworks
YOCTO PROJECT
✗ 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
✗ O sistema de build (Poky) usa uma ferramenta chamada bitbake que processa
um conjunto de arquivos chamados de receitas (recipes).
YOCTO (cont.)
Embedded Labworks
QUAL USAR?
✗ Depende, cada sistema de build tem suas vantagens!
✗ 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
✗ A configuração também fica armazenada no 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.
PROCURANDO COMPONENTES
✗ Pesquisar em sites de busca (Google).
COMO ESCOLHER?
✗ Requisitos técnicos: o componente deve satisfazer os requisitos técnicos
do projeto. Mas não esqueça também de que você mesmo pode
implementar estas melhorias (e depois compartilhar!).
Linux embarcado
LINGUAGENS DE SCRIPT
✗ Interpretadores das mais comuns linguagens estão disponíveis:
✗ Shell script
✗ Python
✗ Perl
✗ Lua
✗ Ruby
✗ 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 a controle de acesso e SSL.
✗ lighttpd: servidor HTTP mais completo, ótimo para gerenciar altas cargas,
rápido e seguro, com suporte a 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 relacional bem 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
✗ Criptografia.
✗ Manipulação do hardware.
✗ Etc!
Embedded Labworks
Linux embarcado
Licenças
Embedded Labworks
LICENÇAS
✗ Todo software sob uma licença de software livre dá aos usuários 4
liberdades básicas:
✗ Liberdade de executar (como quiser e para qualquer propósito).
✗ Liberdade de estudar e adaptar o código-fonte às suas necessidades.
✗ Liberdade de redistribuir cópias do código-fonte.
✗ Liberdade de distribuir cópias das suas versões modificadas.
LICENÇAS (cont.)
✗ As licenças de software livre possuem basicamente duas categorias:
✗ Licenças copyleft.
✗ Licenças non-copyleft (permissivas).
GPL
✗ GNU General Public Licence.
GPL (cont.)
✗ Boa parte dos projetos são cobertos 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 do
código-fonte 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 do projeto GNU bastante utilizada para
compilar aplicações e bibliotecas.
https://www.gnu.org/software/make/
MAKEFILE (EXEMPLO 1)
TOOLCHAIN:=/opt/labs/ex/09/buildroot/output/host/usr/bin/
CROSS_COMPILE:=arm-linux-
PATH:=${TOOLCHAIN}:${PATH}
all:
${CROSS_COMPILE}gcc teste.c -o teste
clean:
rm -Rf *.o teste
Embedded Labworks
MAKEFILE (EXEMPLO 2)
src = $(wildcard src/*.c) \
$(wildcard src/net/*.c) \
$(wildcard src/fs/*.c)
obj = $(src:.c=.o)
CC ?= gcc
app: $(obj)
$(CC) -o $@ $^ $(LDFLAGS)
%.o: %.c
$(CC) $(CFLAGS) -o $@ -c $<
.PHONY: clean
clean:
rm -f $(obj) app
Embedded Labworks
LABORATÓRIO
AUTOTOOLS
✗ Autotools é o nome dado ao sistema de build de aplicações do
projeto GNU, que contém um conjunto de ferramentas para auxiliar
na compilação de uma biblioteca ou aplicação.
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)
$ ./configure --host=arm-linux --enable-debug --disable-nls
checking whether make sets $(MAKE)... yes
checking for arm-linux-strip... arm-linux-strip
checking for arm-linux-gcc... arm-linux-gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... yes
checking for suffix of executables...
[...]
config.status: creating Makefile
config.status: creating m4/Makefile
config.status: creating lib/Makefile
[...]
$ make
LABORATÓRIO
Linux embarcado
Bibliotecas gráficas
Embedded Labworks
FRAMEBUFFER
Toolkit Gráfico Window
Aplicação Aplicação (Qt, Gtk) Manager/
Aplicação
User
Framebuffer framework
/dev/fbX
Kernel
Framebuffer Framebuffer
driver driver
INPUT
Aplicação Biblioteca Toolkit Servidor
gráfica gráfico gráfico
User
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).
https://www.libsdl.org/
DIRECTFB
✗ Biblioteca de baixo nível para trabalhar com interface gráfica.
https://github.com/deniskropp/DirectFB
X.ORG KDRIVE
✗ Kdrive (antes Tiny-X) é a implementação do servidor X para
sistemas embarcados.
https://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.
https://www.gtk.org/
Maemo
Interface
proprietária
Embedded Labworks
Qt
✗ O Qt é um framework completo para o desenvolvimento de
aplicações multiplataforma desktop e mobile.
https://www.qt.io/
Qt (cont.)
✗ Diversas aplicações e produtos famosos utilizam o Qt, incluindo as
smart TVs da LG e os softwares Autodesk Maya, Google Earth e
VirtualBox.
https://resources.qt.io/customer-stories-all
EXEMPLOS DE USO DO QT
Express GPS
HISTÓRICO DO QT
✗ 1990: começou a ser escrito pela Trolltech.
APIs
✗ O Qt possui uma API completa para o desenvolvimento de
aplicações, incluindo bibliotecas para trabalhar com arquivos,
threads, networking, banco de dados, multimedia, localização,
gráficos, etc.
QT QUICK
✗ Na mudança do Qt4 para o Qt5, houve um foco grande no
desenvolvimento de interfaces gráficas ricas através de um
módulo chamado Qt Quick, baseado em três principais
componentes:
✗ Uma linguagem declarativa chamada QML.
✗ Um interpretador Javascript.
✗ Elementos para o desenvolvimento de uma interface gráfica rica, com
bastante foco em animação e efeitos 3D.
EXEMPLOS QT QUICK
Embedded Labworks
LICENÇAS
✗ Até a versão 5.3, os principais módulos do Qt eram licenciados com
LGPLv2, uma licença bastante amigável do ponto de vista
comercial.
Fonte: https://www.embeddeduse.com/2016/04/10/using-qt-5-6-and-later-under-lgpl/
Embedded Labworks
Fonte: https://www.embeddeduse.com/2016/04/10/using-qt-5-6-and-later-under-lgpl/
Embedded Labworks
QT CREATOR
✗ Ambiente de desenvolvimento integrado (IDE) completo para o Qt.
https://www.qt.io/download
QT CREATOR (EDITOR)
Embedded Labworks
QT CREATOR (WIDGETS)
Embedded Labworks
QT CREATOR (QML)
Embedded Labworks
LABORATÓRIO
Desenvolvimento de aplicações em Qt
Embedded Labworks
Linux embarcado
Debugging
Embedded Labworks
GDB
✗ O GDB (GNU Debugger) é a ferramenta de depuração interativa
padrão do projeto GNU.
https://www.gnu.org/software/gdb/
DEBUG REMOTO
✗ Como no target temos o binário da aplicação em execução e no
host o código-fonte e as ferramentas de desenvolvimento, depurar
a aplicação no target envolve uma arquitetura cliente-servidor.
Host Target
arm-linux-gdb gdbserver
Conexão
Serial ou
Ethernet
COMANDOS DO GDB
✗ Assim que se conectar ao servidor do GDB, coloque breakpoints
nos trechos de código de interesse.
(gdb) break main
MODO TUI
✗ O modo tui do GDB irá abrir uma janela com o código-fonte da
aplicação, facilitando a visualização do processo de depuração:
$ arm-linux-gdb main --tui
Embedded Labworks
CORE DUMP
✗ Core dump é um arquivo que contém a imagem da memória de um
processo no momento da sua finalização.
return 0;
}
Embedded Labworks
# main
Segmentation fault (core dumped)
# ls -l core
-rw------- 1 root root 217088 Dec 6 2018 core
Embedded Labworks
(gdb) backtrace
#0 0x000104b0 in main (argc=1, argv=0xbe96de64) at main.c:8
(gdb) print c
$1 = 0x0
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/
*ptr++ = STX;
strncpy(ptr, data, size);
ptr += size;
*ptr++ = ETX;
free(buf);
return 0;
}
Embedded Labworks
STRACE
✗ O strace (system calls tracer) permite capturar todas as chamadas
de sistema realizadas pela aplicação.
https://strace.io/
✗ Bastante útil para depurar 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 aplicação.
https://www.ltrace.org/
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
LABORATÓRIO
Linux embarcado
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, NXP MCUxpresso, etc.
CONTROLE DE VERSÃO
✗ CVS: Foi bastante popular, mas possui diversas deficiências e hoje
não é mais utilizado em novos projetos.
LABORATÓRIO
Linux Embarcado
E agora?
Embedded Labworks
RECURSOS ONLINE
✗ Site do kernel Linux:
https://www.kernel.org/
✗ Grupo sis_embarcados:
https://groups.google.com/forum/#!forum/sis_embarcados
Embedded Labworks