Embedded Linux Slides

344
Embedded Labworks Por Sergio Prado. São Paulo, Novembro de 2012 ® Copyright Embedded Labworks 2004-2013. All rights reserved. Desenvolvendo Sistemas Linux Embarcado

Transcript of Embedded Linux Slides

Page 1: Embedded Linux Slides

Embedded Labworks

Por Sergio Prado. São Paulo, Novembro de 2012® Copyright Embedded Labworks 2004-2013. All rights reserved.

Desenvolvendo SistemasLinux Embarcado

Page 2: Embedded Linux Slides

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 Licença Creative Commons BY-SA 3.0.http://creativecommons.org/licenses/by-sa/3.0/legalcode

✗ Os fontes deste documento estão disponíveis em:http://e-labworks.com/treinamentos/linux/source

Page 3: Embedded Linux Slides

Embedded Labworks

SOBRE O INSTRUTOR

✗ Sergio Prado tem mais de 15 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

Page 4: Embedded Linux Slides

Embedded Labworks

AGENDA DO TREINAMENTO

✗ DIA 1: Introdução e arquitetura de sistemas Linux embarcado, shell do Linux, hardware, toolchain, bootloader e kernel.

✗ DIA 2: Sistemas de arquivo, módulos do kernel, dispositivos de armazenamento e sistemas de build.

✗ DIA 3: Compilando e desenvolvendo bibliotecas e aplicações, licenças de software, aplicações gráficas em Qt, debugging e tracing.

Page 5: Embedded Linux Slides

Embedded Labworks

AMBIENTE DE LABORATÓRIO

/opt/labs/ Ambiente de laboratóriodl/ Aplicações e pacotes open­source

Que serão usados durante asatividades de laboratório

docs/ Documentaçãoguides/ Guias de consulta (shell, vi, etc)

  hardware/ Documentação do hardware  training/ Slides e atividades de laboratório.  videos/ Vídeosex/ Exercícios de laboratóriotools/ Ferramentas de uso geral

Page 6: Embedded Linux Slides

Embedded Labworks

ORIENTAÇÕES GERAIS

✗ Pergunte...

✗ Expresse seu ponto de vista...

✗ Troque experiências...

✗ Ajude...

✗ Participe!

Page 7: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Introdução à Linux embarcado

Page 8: Embedded Linux Slides

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. Começa 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.

Page 9: Embedded Linux Slides

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

Page 10: Embedded Linux Slides

Embedded Labworks

20 ANOS DEPOIS

Page 11: Embedded Linux Slides

Embedded Labworks

VÍDEO (OS 20 ANOS DO LINUX)

Page 12: Embedded Linux Slides

Embedded Labworks

O KERNEL

✗ Linux é o kernel!http://www.kernel.org

✗ As distribuições Linux (Ubuntu, Fedora, Debian, Slackware, etc) integram o kernel Linux, bibliotecas e aplicações.

✗ O correto é chamar estas distribuições de sistemas operacionais GNU/Linux.

✗ Linux embarcado é o uso do kernel Linux e de diversos componentes open-source em sistemas embarcados.

Page 13: Embedded Linux Slides

Embedded Labworks

PRINCIPAIS CARACTERÍSTICAS

✗ Portabilidade para mais de 20 arquiteturas!

✗ Escalabilidade: o mesmo kernel roda em relógios, em celulares e em servidores da bolsa de valores!

✗ Livre de royalties.

✗ Roda em dispositivos com pouquíssimos recursos.

Page 14: Embedded Linux Slides

Embedded Labworks

PRINCIPAIS CARACTERÍSTICAS (cont.)

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

✗ Modularidade: capaz de rodar apenas o que é necessário para seu projeto.

✗ Multicore: suporta múltiplas CPU.

✗ Recursos ”infinitos” disponíveis na internet.

Page 15: Embedded Linux Slides

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 implementações prontas para as principais funcionalidades dos projetos: suporte à hardware, protocolos de rede, bibliotecas gráficas, criptografia, etc.

✗ Suporte à hardware. Ex: Linux foi o primeiro kernel a suportar os padrões USB 2.0, USB 3.0, bluetooth, etc.

✗ Desenvolvimento rápido baseado em componentes prontos.

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

Page 16: Embedded Linux Slides

Embedded Labworks

BAIXO CUSTO

✗ Sem royalties: use e abuse de software livre!

✗ Se sua aplicação usa apenas software livre, incluindo as ferramentas de desenvolvimento, seu custo de software é zero! Seu único custo será a aquisição de know-how.

✗ Permite que você possa investir mais no hardware e em treinamento para sua equipe!

Page 17: Embedded Linux Slides

Embedded Labworks

CONTROLE TOTAL

✗ Trabalhando com software livre, você tem o código-fonte de todos os componentes do seu sistema.

✗ Liberdade para modificar, otimizar, debugar, melhorar.

✗ Não fica preso à prioridade que fornecedores ou terceiros darão ao seu projeto.

✗ Total controle do software do seu projeto!

Page 18: Embedded Linux Slides

Embedded Labworks

QUALIDADE

✗ Muitos componentes open source são usados em milhares de sistemas ao redor do mundo.

✗ Normalmente a qualidade é bem melhor que a de softwares proprietários (muitas pessoas olhando o mesmo problema!).

✗ Permite uma sólida 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.

Page 19: Embedded Linux Slides

Embedded Labworks

SUPORTE DA COMUNIDADE

✗ Componentes open-source são desenvolvidos por uma comunidade de desenvolvedores e usuários.

✗ 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!

Page 20: Embedded Linux Slides

Embedded Labworks

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

✗ Mito 2: ”Não consigo proteger a propriedade intelectual do meu produto”.

✗ Consegue sim, basta tomar alguns cuidados com licenças de software!

Page 21: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Arquitetura básica

Page 22: Embedded Linux Slides

Embedded Labworks

ARQUITETURA BÁSICA

Hardware

Bootloader

Linux kernel

Biblioteca C

Biblioteca Biblioteca

Biblioteca Biblioteca

Toolchain

Page 23: Embedded Linux Slides

Embedded Labworks

COMPONENTES DO SISTEMA

✗ Hardware: seu produto!

✗ Bootloader: iniciado pelo hardware, responsável pela inicialização básica, carregamento e execução do kernel Linux.

✗ Kernel Linux: Núcleo do sistema operacional. Gerencia CPU, memória e I/O, exportando serviços para as aplicações do usuário.

✗ Rootfs: sistema de arquivos principal.✗ Biblioteca C: interface entre o kernel e as aplicações do usuário.

✗ Bibliotecas e aplicações do usuário.

✗ Toolchain: conjunto de ferramentas para gerar os binários do sistema.

Page 24: Embedded Linux Slides

Embedded Labworks

HARDWARE

Hardware

Bootloader

Linux kernel

Biblioteca C

Biblioteca Biblioteca

Biblioteca Biblioteca

Toolchain

Page 25: Embedded Linux Slides

Embedded Labworks

HARDWARE

Page 26: Embedded Linux Slides

Embedded Labworks

CPU

✗ Suporta mais de 25 arquiteturas diferentes (x86, ia64, ARM, PPC, MIPS, SuperH, Blackfin, Coldfire, etc).

✗ 32/64 bits: não 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).

Page 27: Embedded Linux Slides

Embedded Labworks

MEMÓRIA RAM

✗ Um sistema bem básico pode funcionar com até 8MB de RAM.

✗ Ideal para começar: 32MB.

Page 28: Embedded Linux Slides

Embedded Labworks

DISPOSITIVOS DE ARMAZENAMENTO

✗ Suporta armazenamento em memória flash NAND ou NOR.

✗ Suporta dispositivos de armazenamento em bloco, incluindo discos e cartões SD/MMC.

✗ Um sistema bem básico pode funcionar com 2M de armazenamento (ou até menos!).

Page 29: Embedded Linux Slides

Embedded Labworks

COMUNICAÇÃO

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

✗ E também os principais protocolos de rede: Ethernet, Wi-Fi, Bluetooth, CAN, IPv4, IPv6, TCP, UDP, etc.

✗ Se o barramento ou protocolo não possuir restrições de licença, é bem provável que esteja implementado no kernel.

✗ Já protocolos ou barramentos com restrições de licença tem dificuldade para entrar na árvore oficial do kernel (Ex: Zigbee).

Page 30: Embedded Linux Slides

Embedded Labworks

CRITÉRIOS PARA SELEÇÃO

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

✗ Suporte nas versões oficiais dos projetos (kernel e bootloader) é bem melhor: maior qualidade e novas versões disponíveis.

✗ A diferença entre uma plataforma suportada na árvore de projeto original do kernel, e outra plataforma não suportada de forma oficial, pode te trazer grandes consequências em termos de custo e tempo de desenvolvimento!

Page 31: Embedded Linux Slides

Embedded Labworks

TOOLCHAIN

Hardware

Bootloader

Linux kernel

Biblioteca C

Biblioteca Biblioteca

Biblioteca Biblioteca

Toolchain

Page 32: Embedded Linux Slides

Embedded Labworks

TOOLCHAIN

✗ Conjunto de ferramentas de programação usadas para gerar determinado produto, seja um software ou mesmo um sistema completo.

✗ Quando a plataforma de desenvolvimento (host) é diferente da plataforma alvo (target), chamamos o toolchain de cross-compiling toolchain.

Page 33: Embedded Linux Slides

Embedded Labworks

TOOLCHAIN (cont.)

Binário x86

x86

Binário ARM

ARM

Código-fonte

x86

Toolchain nativo Cross-compiling toolchainHost

Target

Page 34: Embedded Linux Slides

Embedded Labworks

COMPONENTES DO TOOLCHAIN

✗ Compilador (gcc).

✗ Assembler e Linker (binutils).

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

Page 35: Embedded Linux Slides

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

Page 36: Embedded Linux Slides

Embedded Labworks

FERRAMENTAS OPEN SOURCE

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

✗ Buildroot: http://buildroot.uclibc.org/

Page 37: Embedded Linux Slides

Embedded Labworks

SISTEMA LINUX EMBARCADO

Hardware

Bootloader

Linux kernel

Biblioteca C

Biblioteca Biblioteca

Biblioteca Biblioteca

Toolchain

Page 38: Embedded Linux Slides

Embedded Labworks

SISTEMA LINUX EMBARCADO (NA FLASH)

Bootloader

Kernel

Rootfs

Memória flash

Page 39: Embedded Linux Slides

Embedded Labworks

BOOTLOADER

Hardware

Bootloader

Linux kernel

Biblioteca C

Biblioteca Biblioteca

Biblioteca Biblioteca

Toolchain

Page 40: Embedded Linux Slides

Embedded Labworks

BOOTLOADER

✗ Todo hardware possui um mecanismo de inicialização, que é responsável por carregar e executar o bootloader.

✗ O bootloader é responsável por carregar e executar o kernel do sistema operacional (no nosso caso, o Linux).

Page 41: Embedded Linux Slides

Embedded Labworks

FUNCIONALIDADES DO BOOTLOADER

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

✗ Passar parâmetros para o kernel.

✗ Prover mecanismos para carregar e gravar o kernel e o sistema de arquivos na memória flash.

✗ Inicializar via rede ou pelo cartão SD.

✗ Rotinas de diagnóstico de hardware.

Page 42: Embedded Linux Slides

Embedded Labworks

PRINCIPAIS BOOTLOADERS

✗ x86:✗ LILO

✗ Grub

✗ ARM, MIPS, PPC e outras arquiteturas:✗ U-Boot

✗ Barebox

✗ Redboot

Page 43: Embedded Linux Slides

Embedded Labworks

KERNEL

Hardware

Bootloader

Linux kernel

Biblioteca C

Biblioteca Biblioteca

Biblioteca Biblioteca

Toolchain

Page 44: Embedded Linux Slides

Embedded Labworks

INICIALIZAÇÃO BÁSICA

✗ Inicializa CPU, memória e barramentos.

✗ Configura a memória 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.

Page 45: Embedded Linux Slides

Embedded Labworks

CARACTERÍSTICAS DO KERNEL

✗ Gerencia execução de processos e controla acesso à memória 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 dinâmico dos módulos do kernel.

Page 46: Embedded Linux Slides

Embedded Labworks

EXEMPLO DE SYSTEM CALL

Page 47: Embedded Linux Slides

Embedded Labworks

ROOTFS

Hardware

Bootloader

Linux kernel

Biblioteca C

Biblioteca Biblioteca

Biblioteca Biblioteca

Toolchain

Page 48: Embedded Linux Slides

Embedded Labworks

COMPONENTES BÁSICOS

✗ Biblioteca do sistema (uClibc, glibc, eglibc, dietlibc, etc).

✗ Mecanismo de inicialização.

✗ Bibliotecas e aplicações.

Page 49: Embedded Linux Slides

Embedded Labworks

APLICAÇÕES PARA EMBARCADOS

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

✗ Thttpd: servidor web (~88K).

✗ DirectFB: biblioteca gráfica (~1,4MB).

✗ SQLite: Banco de dados (~250KB).

Page 50: Embedded Linux Slides

Embedded Labworks

BUSYBOX

✗ O canivete suíço de sistemas embarcados com Linux!

✗ Combina versões mais leves de ferramentas UNIX em um único binário, otimizado por tamanho.

✗ Geralmente as ferramentas são mais limitadas em termos de funcionalidades comparadas às originais.

Page 51: Embedded Linux Slides

Embedded Labworks

BUSYBOX – TUDO ISSO EM ~1MB!

Page 52: Embedded Linux Slides

Embedded Labworks

SISTEMA LINUX

“Desenvolver um sistema Linux embarcado é como brincar de Lego!”

Page 53: Embedded Linux Slides

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 aplicações, e gerar a imagem final do rootfs.

Page 54: Embedded Linux Slides

Embedded Labworks

ALGUNS BUILD SYSTEMS

✗ Proprietários: ✗ Monta Vista.

✗ Wind River.

✗ TimeSys.

✗ Open source: ✗ Buildroot.

✗ OpenEmbedded.

✗ Yocto.

✗ PTXdist.

✗ LTIB.

Page 55: Embedded Linux Slides

Embedded Labworks

OS 3 PAPÉIS DO DESENVOLVEDOR

✗ Desenvolvedor de aplicações: desenvolve aplicações Linux.

✗ Integrador: Integra todos os componentes (bootloader, kernel, bibliotecas e aplicações) 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 aplicações!

Page 56: Embedded Linux Slides

Embedded Labworks

VAMOS COMEÇAR?

Page 57: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Ambiente de desenvolvimento

Page 58: Embedded Linux Slides

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.

Page 59: Embedded Linux Slides

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.

✗ Existem também soluções open source, completamente abertas e suportadas pela comunidade.

✗ No nosso treinamento, usaremos soluções abertas! Aprendendo a base, migrar depois para outras soluções é bem mais fácil!

Page 60: Embedded Linux Slides

Embedded Labworks

SO DE DESENVOLVIMENTO

✗ É fortemente recomendado o uso do Linux como sistema operacional para desenvolvimento em Linux embarcado!

✗ Todas as ferramentas disponíveis na comunidade open source foram feitas para rodar em Linux. Você pode ter problemas em tentar rodar em outro sistema operacional, e provavelmente não terá suporte da comunidade.

✗ Usando Linux, você aprende Linux!

Page 61: Embedded Linux Slides

Embedded Labworks

QUE DISTRIBUIÇÃO USAR?

Page 62: Embedded Linux Slides

Embedded Labworks

HOST E TARGET

✗ Host: máquina de desenvolvimento.

✗ Target: hardware, produto, kit de desenvolvimento.

✗ Conectados normalmente por uma conexão serial (RS232, USB, Ethernet, etc).

Host Target

Serial

Ethernet

Page 63: Embedded Linux Slides

Embedded Labworks

NOSSA PRINCIPAL FERRAMENTA!

Page 64: Embedded Linux Slides

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.

✗ Durante o treinamento, para executar operações que necessitem de privilégios de administrador, usaremos o comando sudo. Exemplo:

$ sudo mount /dev/sdb1 /mnt/usb

Page 65: Embedded Linux Slides

Embedded Labworks

GUIAS DE REFERÊNCIA E ESTUDO

✗ Alguns guias de referência e estudo estão disponíveis no ambiente de laboratório em docs/guides:

✗ GuiaFocaLinux.pdf (guia foca Linux iniciante/intermediário).

✗ Guia-Ubuntu.pdf (guia do iniciante Ubuntu).

✗ vi.pdf (editor de textos vi).

✗ shell.pdf (linha de comandos do shell).

✗ canivete-shell.pdf (canivete suíço do shell).

✗ lkn.tar.gz (livro Linux Kernel in a Nutshell).

✗ ldd3.tar.bz2 (livro Linux Device Drivers 3ed).

Page 66: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Estudando a linha de comandos

Page 67: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

i.MX53 Quick Start Board

Page 68: Embedded Linux Slides

Embedded Labworks

i.MX53 QUICK START BOARD

Page 69: Embedded Linux Slides

Embedded Labworks

CARACTERÍSTICAS

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

✗ 1GB de memória RAM DDR3.

✗ Conector para cartão SD/MMC, microSD e interface SATA.

✗ Saídas de áudio estéreo e vídeo VGA, e entrada para microfone. Conector de expansão com saídas HDMI, display LCD, câmera e SDIO.

✗ Interfaces USB host/device, Ethernet, UART, JTAG, botões, leds, etc.

Page 70: Embedded Linux Slides

Embedded Labworks

DIAGRAMA DE BLOCOS

Page 71: Embedded Linux Slides

Embedded Labworks

REFERÊNCIAS E DOCUMENTAÇÃO

✗ A documentação do hardware esta disponível no ambiente de laboratório 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/imxquickstarthttp://community.freescale.com/community/imx

Page 72: Embedded Linux Slides

Embedded Labworks

CONECTANDO O HARDWARE

Page 73: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Conectando e testando o hardware

Page 74: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Toolchain

Page 75: Embedded Linux Slides

Embedded Labworks

O QUE SÃO TOOLCHAINS?

✗ Ao pé da letra, e traduzindo literalmente, toolchain é uma "corrente de ferramentas". Na prática, é um conjunto de ferramentas de compilação.

✗ Você se lembra do processo de compilação de um código em C? Ele envolve normalmente as seguintes etapas: pré-processamento, compilação, 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.

Page 76: Embedded Linux Slides

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.

✗ Em desenvolvimento de sistemas embarcados normalmente é complicado (às vezes até impossível) usar um toolchain nativo, porque precisamos de bastante espaço em disco, capacidade de processamento, memória, etc.

✗ Portanto, para esta tarefa, o melhor é usar um cross-compiling toolchain, que roda na sua plataforma de desenvolvimento mas gera código para a sua plataforma alvo.

Page 77: Embedded Linux Slides

Embedded Labworks

TIPOS DE TOOLCHAIN (cont.)

Binário x86

x86

Binário ARM

ARM

Código-fonte

x86

Toolchain nativo Cross-compiling toolchainHost

Target

Page 78: Embedded Linux Slides

Embedded Labworks

COMPONENTES DO TOOLCHAIN

Compilador (GCC)

Binutils Headers do kernel

Debugger (GDB)

Biblioteca C padrão

Toolchain

Page 79: Embedded Linux Slides

Embedded Labworks

COMPILADOR GCC

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

✗ Compatível com as linguagens C, C++, Ada, Fortran e Java, dentre outras.

✗ Pode gerar código para diversas arquiteturas, incluindo ARM, AVR, Blackfin, MIPS, PowerPC, x86, etc.

Page 80: Embedded Linux Slides

Embedded Labworks

BINUTILS

✗ Binutils é um conjunto de ferramentas para manipular arquivos binários para uma arquitetura específica.http://www.gnu.org/software/binutils/

✗ Algumas das principais ferramentas disponibilizadas pelo binutils:✗ as: assembler, gera o binário baseado em um código Assembly.

✗ ld: linker.

✗ ar, ranlib: usadas para gerar arquivos .a (normalmente bibliotecas).

✗ objdump, readelf, size, nm, strings: inspecionar binários.

✗ strip: remove partes não usadas do binário para diminuir seu tamanho.

Page 81: Embedded Linux Slides

Embedded Labworks

BIBLIOTECA C

✗ O que é a biblioteca C?✗ Interface entre as aplicações e o kernel.

✗ API para desenvolvimento de aplicações.

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

✗ Diversas bibliotecas C estão disponíveis: glibc, eglibc, uClibc, dietlibc, etc.

Kernel

Biblioteca C

Aplicações

Page 82: Embedded Linux Slides

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

Page 83: Embedded Linux Slides

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 configurável.

✗ Comunidade de desenvolvimento do projeto bem ativa.

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

Page 84: Embedded Linux Slides

Embedded Labworks

COMPARANDO GLIBC E UCLIBC

Comparação realizada em uma arquitetura ARM

Page 85: Embedded Linux Slides

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.

✗ Definições de constantes.

✗ Estruturas de dados.

✗ Por isso, para compilar a biblioteca C, o toolchain precisa dos arquivos de cabeçalho do kernel.

✗ Disponíveis em <linux/...>, <asm/...> e alguns outros diretórios dentro do diretório include nos fontes do kernel.

Page 86: Embedded Linux Slides

Embedded Labworks

KERNEL HEADERS (EXEMPLOS)

✗ Números das chamadas de sistema em <asm/unistd.h>:

✗ Definições de constantes em <asm­generic/fcntl.h>:

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

#define __NR_exit                 1#define __NR_fork                 2#define __NR_read                 3

#define O_RDWR          00000002

struct stat {        unsigned long  st_dev;        unsigned long  st_ino;

 [...]};

Page 87: Embedded Linux Slides

Embedded Labworks

USANDO TOOLCHAINS

✗ Existem basicamente duas soluções para instalar e usar um toolchain:

1. Usar um toolchain pronto, fornecido por uma empresa ou pela comunidade.

2. Configurar e gerar seu próprio toolchain de acordo com suas necessidades.

Page 88: Embedded Linux Slides

Embedded Labworks

USANDO UM TOOLCHAIN PRONTO

✗ Solução adotada em muitos projetos:✗ Vantagem: simples e conveniente.

✗ Desvantagem: inflexível, você não consegue otimizar o toolchain de acordo com suas necessidades.

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

✗ Uma referência bem completa de toolchains em:http://elinux.org/Toolchains

Page 89: Embedded Linux Slides

Embedded Labworks

INSTALANDO E USANDO

✗ Basta seguir o procedimento do fornecedor da solução.

✗ Normalmente, estes são os passos:✗ Baixar e descompactar a toolchain em um diretório na sua máquina.

✗ Adicionar no PATH o diretório onde se encontram os binários:

export PATH=/path/to/toolchain/bin/:$PATH

✗ Compilar sua aplicação usando o toolchain:

PREFIX­gcc teste.c ­o teste

✗ O PREFIX depende da configuração do toolchain, e permite diferenciar toolchains nativos de toolchains para cross-compilação.

Page 90: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Instalando e testando um toolchain pronto

Page 91: Embedded Linux Slides

Embedded Labworks

GERANDO SEU PRÓPRIO TOOLCHAIN

✗ Gerar um toolchain manualmente é uma tarefa difícil e dolorosa! Pode levar muitos dias!

✗ É necessário aprender muitos detalhes, muito componentes para configurar e compilar.

✗ Muitas decisões para serem feitas manualmente: versão 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.

Page 92: Embedded Linux Slides

Embedded Labworks

USANDO FERRAMENTAS

✗ Existem ferramentas que automatizam o processo de geração de toolchains.

✗ Você não precisa se preocupar com o processo de geração do toolchain, dependências, patches, etc.

✗ E por outro lado, estas ferramentas oferecem a flexibilidade de configuração e seleção dos componentes do toolchain e de suas versões.

Page 93: Embedded Linux Slides

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/

Page 94: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Compilando seu próprio toolchain com o crosstool-ng

Page 95: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Bootloader

Page 96: Embedded Linux Slides

Embedded Labworks

BOOTLOADERS

✗ O bootloader é o código responsável por:✗ Inicialização básica do hardware.

✗ Carregar outro binário (normalmente um sistema operacional) da memória flash, da rede ou de outro dispositivo de armazenamento não volátil para a RAM.

✗ Passar o controle da CPU para este binário.

✗ Além destas funcionalidades básicas, a maioria dos bootloaders possui uma linha de comandos para a execução de diferentes operações, como verificação de memória, formatação da flash e rotinas de diagnóstico.

Page 97: Embedded Linux Slides

Embedded Labworks

BOOTLOADERS NO X86

✗ Plataformas x86 normalmente vem acompanhadas de uma memória não-volátil, a BIOS.

✗ Um programa na BIOS é executado no boot do equipamento, que faz a inicialização básica do hardware, carrega para a memória e executa os primeiros 512 bytes do dispositivo de boot. Estes 512 bytes também são chamados de MBR.

✗ A MBR é o bootloader de 1o. estágio, que é o responsável por carregar um bootloader de 2o. estágio do disco para a RAM.

✗ O bootloader de 2o. estágio é mais completo, entende sistemas de arquivo, consegue ler o sistema operacional do disco e carregar para a memória.

BIOSem ROM

Estágio 2do disco

Estágio 1512 bytesdo disco

SOdo disco

Page 98: Embedded Linux Slides

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 padrão atualmente em desktops e servidores.http://www.gnu.org/software/grub/

✗ Syslinux, mais utilizado em boot pela rede e por mídias removíveis (floppy disk, pendrive, CD/DVD, etc).http://www.syslinux.org/

Page 99: Embedded Linux Slides

Embedded Labworks

BOOT EM CPUs EMBARCADAS

✗ Quando alimentada, a CPU começa a execução em um endereço fixo.

✗ Não existe nenhum mecanismo de boot provido pela CPU ou pela plataforma.

✗ O projeto de hardware deve garantir que a memória flash esteja com seu barramento de endereços ligados corretamente, de forma que o endereço de início de execução das instruções esteja acessível pela CPU.

✗ Solução comum em microcontroladores.

RAM

NOR flash

Memória física

Execuçãocomeça aqui

Page 100: Embedded Linux Slides

Embedded Labworks

BOOT EM CPUs EMBARCADAS (cont.)

✗ Neste caso, como o código é executado direto da flash (XIP), o uso de memórias flash NOR é obrigatório.

✗ Mas como o Linux precisa de pelo menos alguns MBs de memória, o uso de flash NOR é inviável por ser muito mais cara. Por este motivo, o Linux usa normalmente memórias flash NAND.

✗ Mas como não conseguimos executar código diretamente de memórias flash NAND, precisamos de RAM.

✗ E quem irá configurar a controladora da SDRAM e carregar o código da flash para a RAM no boot do equipamento? O bootloader!

RAM

NOR flash

Memória física

Execuçãocomeça aqui

Page 101: Embedded Linux Slides

Embedded Labworks

BOOT EM LINUX EMBARCADO

✗ Em Linux embarcado, e principalmente em plataformas ARM, é muito comum termos um processo de boot dividido em 3 estágios:

1. A CPU tem um código de boot integrado em uma ROM interna, responsável por carregar o bootloader de 1o. estágio de uma unidade de armazenamento não volátil para a memória RAM interna (SRAM ou IRAM).

2. O bootloader de 1o. estágio deve inicializar o hardware (CPU, DRAM, GPIOs, etc) e carregar um bootloader de 2o. estágio para a RAM.

3. O bootloader de 2o. estágio carrega o sistema operacional (kernel Linux) para a RAM e executa.

Page 102: Embedded Linux Slides

Embedded Labworks

LPC3250 (NXP)Tenta o boot pela porta serial (modo de serviço), SPI, barramento externo e flash NAND, carregando o código para a SRAM (56KB).

Kickstart roda da SRAM, inicializa hardware e carrega o stage 1 loader, um bootloader completo que possui diversas funções para configurar o hardware. O S1L carrega o bootloader de 2o. estágio para a RAM.

Roda da RAM. Inicializa alguns dispositivos de hardware (rede, USB, etc). Carrega a imagem do kernel na RAM e passa o controle para ele.

Roda da RAM. Assume o controle do sistema (a partir daqui, o bootloader não existe mais).

ROM Code

Kickstart/S1L

U-Boot

Linux Kernel

Page 103: Embedded Linux Slides

Embedded Labworks

i.MX28 (FREESCALE)Código de boot em ROM iniciado quando o i.MX28 é resetado. Lê as chaves de seleção 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 conjunto de bootlets, que são pequenos executáveis para extender o bootloader, como o “power_prep” (configura PM) e o “boot_prep” (configura a memória SDRAM e carrega o U-Boot).

Inicializa alguns dispositivos de hardware (rede, USB, etc). Carrega a imagem do kernel na RAM e passa o controle para ele.

Roda da RAM. Assume o controle do sistema (a partir daqui, o bootloader não existe mais).

ROM Code

Bootlets

U-Boot

Linux Kernel

Page 104: Embedded Linux Slides

Embedded Labworks

i.MX53 (FREESCALE)Código de boot em ROM iniciado quando o i.MX53 é resetado. Lê o registrador BOOT_MODE ou um conjunto de GPIOs para determinar o dispositivo de boot (NOR/NAND, cartão SD/MMC, SATA, etc).

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.

Inicializa alguns dispositivos de hardware (rede, USB, etc). Carrega a imagem do kernel na RAM e passa o controle para ele.

Roda da RAM. Assume o controle do sistema (a partir daqui, o bootloader não existe mais).

ROM Code

U-Boot (1)

U-Boot (2)

Linux Kernel

Page 105: Embedded Linux Slides

Embedded Labworks

OMAP3530/AM35x (TI)Procura por imagens de boot na NAND, UART, USB e MMC, e carrega para a SRAM (64KB). Um botão pode mudar a ordem da busca.

Roda da SRAM. Inicializa a controladora da SDRAM, NAND ou MMC, e carrega o bootloader de 2o. estágio para a RAM.

Roda da RAM. Inicializa alguns dispositivos de hardware (rede, USB, etc). Carrega a imagem do kernel na RAM e passa o controle para ele.

Roda da RAM. Assume o controle do sistema (a partir daqui, o bootloader não existe mais).

ROM Code

X-Loader

U-Boot

Linux Kernel

Page 106: Embedded Linux Slides

Embedded Labworks

AT91 (ATMEL)

Procura por imagens de boot em diversos dispositivos de armazenamento, e carrega para a SRAM (4KB).

Roda da SRAM. Inicializa a controladora da DRAM e carrega o bootloader de 2o. estágio para a RAM.

Roda da RAM. Inicializa alguns dispositivos de hardware (rede, USB, etc). Carrega a imagem do kernel na RAM e passa o controle para ele.

Roda da RAM. Assume o controle do sistema (a partir daqui, o bootloader não existe mais).

ROM Code

AT91Bootstrap

U-Boot

Linux Kernel

Page 107: Embedded Linux Slides

Embedded Labworks

BOOTLOADERS EM LINUX EMBARCADO

✗ O bootloader de 1o. estágio é normalmente fornecido pelo fabricante do chip, e cada plataforma tem o seu. Nosso foco é no bootloader de 2o. estágio.

✗ Existem alguns bootloaders open source. Dentre eles, os dois mais conhecidos e utilizados são:

✗ U-Boot: bastante popular em ARM, mas também usado em outras arquiteturas como MIPS e PPC.http://www.denx.de/wiki/U-Boot

✗ Barebox: sucessor do U-Boot, melhor projeto, melhor código, desenvolvimento ativo, mas ainda com pouco suporte à hardware.http://www.barebox.org

Page 108: Embedded Linux Slides

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 três meses uma versão é liberada (as versões são nomeadas com o formato YYYY.MM).

✗ Documentação disponível em:http://www.denx.de/wiki/U-Boot/Documentation

Page 109: Embedded Linux Slides

Embedded Labworks

FUNCIONALIDADES DO U-BOOT

✗ Exibir informações do hardware (memória, periféricos, etc).

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

✗ Manipular memórias flash (ler, escrever, apagar, etc).

✗ Boot via memória flash.

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

Page 110: Embedded Linux Slides

Embedded Labworks

FUNCIONALIDADES DO U-BOOT (cont.)

✗ Boot por interfaces SD/MMC ou USB.

✗ Entende partições FAT.

✗ Configuração por variáveis de ambiente e suporte à scripts.

✗ Executa código bare-metal.

✗ Carrega e executa imagens do kernel Linux.

✗ Etc!

Page 111: Embedded Linux Slides

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 código 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 documentação da sua plataforma para saber como e onde baixar os fontes do U-Boot.

Page 112: Embedded Linux Slides

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:

make mx53_loco_config

Page 113: Embedded Linux Slides

Embedded Labworks

COMPILANDO O U-BOOT

✗ Para compilar o U-Boot, basta executar o comando make passando o prefixo do cross-compiler. Exemplo:

make CROSS_COMPILE=arm­linux­

✗ Não se esqueça de incluir na variável de ambiente PATH o caminho do diretório do toolchain.

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

✗ Se você quiser fazer uma compilação limpa, ou configurar o U-Boot para outra placa, execute antes o comando abaixo para fazer a limpeza:

make mrproper

Page 114: Embedded Linux Slides

Embedded Labworks

GRAVANDO O U-BOOT

✗ O processo de gravação do U-Boot pode ser feito de diferentes formas, dependendo do target:

✗ O bootloader de 1o. estágio pode fornecer um mecanismo de escrita na flash.

✗ O sistema pode ser configurado para iniciar por uma mídia removível (Ex: cartão SD).

✗ A CPU pode fornecer um monitor de boot que se comunica via serial ou USB.

✗ JTAG.

✗ Etc!

Page 115: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Compilando e gravando o U-Boot

Page 116: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Kernel Linux

Page 117: Embedded Linux Slides

Embedded Labworks

VISÃO GERAL

Biblioteca C

Hardware

Biblioteca Biblioteca Aplicação User space

Kernel

AplicaçãoAplicação

Chamadas de sistema Notificação de eventosExportação de informações

Gerenciamento do hardware Notificação de eventos

Page 118: Embedded Linux Slides

Embedded Labworks

HISTÓRICO

✗ O kernel é um dos componentes do sistema operacional, que requer bibliotecas e aplicações para prover funcionalidades aos usuários.

✗ Criado em 1991 pelo estudante finlandês Linus Torvalds, começou a ser usado rapidamente como sistema operacional em projetos de software livre.

✗ Linus Torvalds foi capaz de criar uma comunidade grande e dinâmica de desenvolvedores e usuários ao redor do projeto.

✗ Atualmente, centenas de pessoas e empresas contribuem com o projeto.

Page 119: Embedded Linux Slides

Embedded Labworks

COLABORAÇÃO

Page 120: Embedded Linux Slides

Embedded Labworks

ARQUITETURA

Page 121: Embedded Linux Slides

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.

✗ Um processo contém uma ou mais linhas de execução, chamadas de threads.

✗ 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!

✗ Por este motivo, o Linux escalona threads, e não processos.

Page 122: Embedded Linux Slides

Embedded Labworks

GERENCIAMENTO DE PROCESSOS (cont.)

✗ Trade-off entre capacidade de processamento e tempo de resposta (latência).

✗ 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 padrão do Linux é o CFS (Completely Fair Scheduler), onde cada processo recebe uma "porcentagem justa" da CPU (foco em performance).

Page 123: Embedded Linux Slides

Embedded Labworks

GERENCIAMENTO DE PROCESSOS (cont.)

✗ Possui também um escalonador para processos de tempo real, que tem prioridade sobre o CFS.

✗ Mas mesmo assim, o Linux não pode ser considerado um sistema operacional determinístico (em alguns trechos do código a latência para atender um pedido de interrupção pode ser muito grande).

✗ Existem um conjunto de patches (PREEMPT_RT) que podem ser aplicados no kernel e melhorar este cenário de alta latência.

✗ Uma opção para o uso do Linux em aplicações hard real-time é a utilização de um kernel de tempo real em conjunto com o Linux (RTLinux, RTAI, Xenomai).

Page 124: Embedded Linux Slides

Embedded Labworks

GERENCIAMENTO DE MEMÓRIA

✗ O Linux trabalha com o mecanismo de memória virtual para gerenciar a memória do sistema.

✗ Em um sistema com memória virtual, todo o acesso à memória do sistema é realizado através de endereços virtuais, que são convertidos (por hardware) para endereços físicos durante o acesso à memória do sistema.

✗ A MMU (Memory Management Unit) é o hardware que implementa o mecanismo de memória virtual, gerenciando a memória do sistema e fazendo a conversão entre endereços de memória físicos e virtuais.

Page 125: Embedded Linux Slides

Embedded Labworks

GERENCIAMENTO DE MEMÓRIA (cont.)

✗ Um sistema com MMU é capaz de prover:✗ Maior endereçamento de memória para os processos: em uma

arquitetura de 32 bits, os processos tem acesso à um endereçamento linear de 4G de memória virtual.

✗ Proteção: cada processo só enxerga seu espaço de endereçamento, onde um acesso inválido gera uma exceção (segmentation fault).

✗ Memory mapping: possibilidade de mapear um arquivo físico em memória.

✗ Compartilhamento: os processos podem compartilhar memória (código, dados, etc), usado por exemplo em mecanismos de IPC.

✗ SWAP: se faltar memória física, possibilita salvar e recuperar páginas de memória do disco.

Page 126: Embedded Linux Slides

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.

Page 127: Embedded Linux Slides

Embedded Labworks

SISTEMA DE ARQUIVO VIRTUAL (cont.)

✗ Exemplo 1: Mapeando um arquivo físico 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 estatística de uso de memória do sistema):

cat /proc/meminfo

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

echo "Teste" > /dev/ttyS0

Page 128: Embedded Linux Slides

Embedded Labworks

KERNEL SPACE x USER SPACE

✗ Existe uma separação bem definida entre o kernel (kernel space) e as bibliotecas e aplicações do usuário (user space).

✗ O kernel roda em modo privilegiado, com total acesso à todas as instruções da CPU, endereçamento de memória e I/O, enquanto que os processos do usuário rodam em modo restrito, com acesso limitado aos recursos da máquina.

✗ Por isso, existe uma interface de comunicação, baseada chamadas de sistema (system calls), para que as bibliotecas e aplicações tenham acesso aos recursos da máquina.

Page 129: Embedded Linux Slides

Embedded Labworks

CHAMADAS DE SISTEMA

✗ O Linux possui aproximadamente 300 chamadas de sistema.

✗ Operações em arquivos, operações de rede, comunicação entre processos, gerenciamento de processos, mapeamento de memória, timers, threads, mecanismos de sincronização, etc.

✗ As chamadas de sistema são abstraídas pela biblioteca C padrão. As aplicações normalmente não precisam fazer uma chamada direta. Tudo é feito através da biblioteca C padrão.

✗ A interface de chamadas de sistema é bem estável. Durante novas versões do kernel, apenas novas chamadas de sistema são adicionadas.

Page 130: Embedded Linux Slides

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

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

✗ Em 2011, a versão mudou para 3.0.

Page 131: Embedded Linux Slides

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 liberação do release final 3.X.

✗ Para acompanhar as mudanças no kernel:http://wiki.kernelnewbies.org/LinuxChangeshttp://lwn.net

Page 132: Embedded Linux Slides

Embedded Labworks

FONTES DO KERNEL

✗ A versão oficial do código-fonte do kernel liberada por Linus Torvalds encontra-se em:http://www.kernel.org

✗ Baixando os fontes por http:wget http://www.kernel.org/pub/linux/kernel/v3.0/linux­3.6.tar.bz2

tar xjfv linux­3.6.tar.bz2

✗ Baixando os fontes pelo git:git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

Page 133: Embedded Linux Slides

Embedded Labworks

FONTES DO KERNEL (cont.)

✗ Muitas comunidades e fabricantes de hardware podem manter versões alternativas do kernel:✗ Fabricantes de hardware podem manter versões específicas do kernel com

suporte às suas plataformas de referência (BSP).

✗ Comunidades podem manter versões do kernel voltadas à arquiteturas específicas (ARM, MIPS, PPC), sub-sistemas (USB, PCI, network), sistemas de tempo-real, etc.

✗ Normalmente nestas versões alternativas são disponibilizados os patches para serem aplicados em uma determinada versão do kernel.

✗ Portanto, consulte a documentação da sua plataforma para saber como e onde baixar os fontes do Linux.

Page 134: Embedded Linux Slides

Embedded Labworks

TAMANHO DOS FONTES DO KERNEL

✗ Fontes do kernel 3.4.9:✗ Tamanho total: 518MB

✗ ~38.600 Arquivos

✗ ~15.400.000 linhas de código

✗ Porque os fontes são tão grandes? Milhares de drivers de dispositivo, diversos protocolos de rede, suporte a diferentes arquiteturas e plataformas.

✗ O core do kernel é bem pequeno!

Page 135: Embedded Linux Slides

Embedded Labworks

TAMANHO DOS FONTES DO KERNEL (cont.)

Linux 2.6.39

Page 136: Embedded Linux Slides

Embedded Labworks

LICENÇA

✗ Todo o código-fonte do Linux é software livre e liberado sob a licença 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 condições, sem restrições.

Page 137: Embedded Linux Slides

Embedded Labworks

LICENÇA (cont.)

✗ Portanto, é ilegal distribuir um binário do kernel com módulos compilados estaticamente.

✗ Os módulos do kernels são uma área cinza: é um trabalho derivado do kernel ou não?

✗ A opinião geral da comunidade é de que drivers fechados são ruins.

✗ Sob um ponto de vista legal, cada driver é provavelmente um caso diferente. Ex: Nvidia.

✗ É realmente útil manter um driver proprietário?

Page 138: Embedded Linux Slides

Embedded Labworks

VANTAGENS DE DRIVERS GPL

✗ Você não precisa escrever um driver do zero, podendo reusar o código de outros drivers.

✗ Você pode integrar o seu driver na árvore oficial do kernel, e não se preocupar com qualquer alteração em APIs internas do Linux. Custo zero de manutenção e melhorias no driver!

✗ Com drivers abertos você tem suporte da comunidade, com mais pessoas revisando e colaborando com seu driver.

✗ Os usuários e a comunidade tem uma visão positiva da empresa.

Page 139: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Baixando e estudando os fontes do kernel

Page 140: Embedded Linux Slides

Embedded Labworks

CONFIGURANDO O KERNEL

✗ O kernel possui centenas de drivers de dispositivo, diversos protocolos de rede e muitos outros itens de configuração.

✗ O kernel é bem modular, milhares de opções estão disponíveis para serem habilitadas ou desabilitadas.

✗ O processo de configuração serve para você configurar o kernel para ser compilado para sua CPU/plataforma.

✗ O conjunto de opções que você irá habilitar depende:✗ Do seu hardware (device drivers, etc).

✗ Das funcionalidades (protocolos de rede, sistemas de arquivo, etc).

Page 141: Embedded Linux Slides

Embedded Labworks

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

✗ Dificilmente você vai precisar editar o arquivo .config manualmente. Existem ferramentas de interface gráfica para configurar o kernel e gerar o arquivo de configuração automaticamente:

make menuconfig

make gconfig

make xconfig

make nconfig

Page 142: Embedded Linux Slides

Embedded Labworks

make xconfig

Page 143: Embedded Linux Slides

Embedded Labworks

make gconfig

Page 144: Embedded Linux Slides

Embedded Labworks

make nconfig

Page 145: Embedded Linux Slides

Embedded Labworks

make menuconfig

Page 146: Embedded Linux Slides

Embedded Labworks

CONFIGURANDO O KERNEL (cont.)

✗ O kernel é um binário ú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:✗ Estática ou built-in: a funcionalidade selecionada é linkada

estaticamente à imagem final do kernel.

✗ Dinâmica ou módulo: é gerado um módulo daquela funcionalidade (arquivo com extensão .ko). Este módulo não é incluido na imagem final do kernel. Ele é incluido no sistema de arquivos e pode ser carregado dinamicamente (em tempo de execução), conforme a necessidade.

Page 147: Embedded Linux Slides

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

✗ Números inteiros. Ex: (17) Kernel log buffer size

✗ Strings. Ex: (iso8859­1) Default iocharset for FAT

Page 148: Embedded Linux Slides

Embedded Labworks

DEPENDÊNCIAS

✗ Na configuração do kernel, podem existir dependências entre funcionalidades:

✗ Exemplo 1: o driver de um dispositivo I2C depende da habilitação do barramento I2C para ser habilitado.

✗ Exemplo 2: o driver do barramento USB é habilitado automaticamente quando o driver de um dispositivo USB é habilitado.

Page 149: Embedded Linux Slides

Embedded Labworks

CONFIGURAÇÃO POR ARQUITETURA

✗ Toda a configuração do kernel é dependente da arquitetura.

✗ 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

✗ Ao invés de passar a variável ARCH na chamada do make, você pode também definí-la como variável de ambiente ou alterar o arquivo Makefile do diretório principal do kernel.

Page 150: Embedded Linux Slides

Embedded Labworks

CONFIGURAÇÕES PRÉ-DEFINIDAS

✗ Arquivos de configuração pré-definidos para diversas plataformas estão disponíveis em arch/<arch>/configs/.

✗ O uso de arquivos pré-configurados é a forma padrão de configurar um kernel para uma plataforma específica. Por exemplo, para carregar a configuração padrão do kit de desenvolvimento i.MX53 Quick Start Board:

make imx5_defconfig

✗ Se você mexeu na configuração padrão e deseja salvá-la, pode criar uma cópia conforme exemplo abaixo:

cp .config arch/<arch>/configs/myconfig_defconfig

Page 151: Embedded Linux Slides

Embedded Labworks

VALIDANDO O ARQUIVO DE CONFIGURAÇÃO

✗ O comando abaixo faz a validação e a consistência do arquivo de configuração do kernel:

make oldconfig

✗ Ele avisa e configura automaticamente parâmetros e dependências que antes não existiam.

✗ Deve ser usado sempre que:✗ Você alterar o arquivo .config manualmente.

✗ Você reutilizar o mesmo .config em diferentes versões do kernel.

Page 152: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Configurando o kernel

Page 153: Embedded Linux Slides

Embedded Labworks

COMPILANDO O KERNEL

✗ Depois de configurado, para compilar nativamente basta executar:

make

✗ Não precisa de previlégios de root!

✗ Para cross-compilar, você precisa indicar a arquitetura e o prefixo do cross-compiler. Exemplo:

make ARCH=arm CROSS_COMPILE=arm­linux­

✗ 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=arm­linux­ uImage

Page 154: Embedded Linux Slides

Embedded Labworks

COMPILANDO O KERNEL (cont.)

✗ Ao fim do processo de compilação, serão geradas as seguintes imagens:✗ vmlinux: gerada no diretório raiz dos fontes, é a imagem do kernel no

formato ELF, que não é bootavel, mas pode ser usada para debugging.

✗ Módulos do kernel: arquivos com extensáo .ko dentro dos respectivos diretórios dos drivers.

✗ Em arch/<arch>/boot/:

✗ Image: imagem final do kernel, bootável e descomprimida.✗ *Image: imagem bootável e comprimida do kernel (bzImage para x86,

zImage para ARM, etc).✗ uImage: imagem do kernel para o U-Boot (opcional).

Page 155: Embedded Linux Slides

Embedded Labworks

INSTALANDO O KERNEL

✗ Para instalar o kernel, basta executar o comando abaixo:

make install

✗ Este comando irá instalar os seguintes arquivos no diretório /boot:✗ vmlinuz-<version> (imagem do kernel comprimida)

✗ System.map-<version> (endereços dos símbolos do kernel)

✗ config-<version> (arquivo de configuração do kernel)

✗ Normalmente não é usado em sistemas embarcados!

✗ Em sistemas embarcados, normalmente gravamos o kernel em um dispositivo de armazenamento (cartão SD, memória flash, etc).

Page 156: Embedded Linux Slides

Embedded Labworks

FAZENDO A LIMPEZA

✗ Remove todos os arquivos gerados (imagens, arquivos-objeto, etc).

make clean

✗ Remove todos os arquivos de gerados e arquivos de configuração (usado quando pretende-se mudar de plataforma).

make mrproper

✗ Além dos arquivos gerados e arquivos de configuração, remove também arquivos de backup (bom para gerar patches).

make distclean

Page 157: Embedded Linux Slides

Embedded Labworks

LINHA DE COMANDOS DO KERNEL

✗ Ao ser carregado, o kernel pode receber um conjunto de parâmetros. Chamamos esses parâmetros de linha de comandos do kernel.

✗ Esta linha de comandos pode ser passada ao kernel de duas formas:

✗ Pelo bootloader.

✗ Hardcoded na configuração do kernel, através da opção CONFIG_CMDLINE.

✗ Esta linha de comandos é uma string com diversas opções no formato key=value.

Page 158: Embedded Linux Slides

Embedded Labworks

LINHA DE COMANDOS DO KERNEL (cont.)

console=ttySAC0 root=/dev/mtdblock3 rootfstype=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 opções!

✗ Documentação disponível em:Documentation/kernel-parameters.txt

Page 159: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Compilando e testando o kernel

Page 160: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Rootfs

Page 161: Embedded Linux Slides

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

✗ Em sistemas Unix, aplicações e usuários enxergam apenas uma hierarquia única e global de arquivos e diretórios, que podem ser compostos por diferentes sistemas de arquivo.

✗ Um ou mais sistemas de arquivo são montados em locais específicos nesta hierarquia de diretórios.

Page 162: Embedded Linux Slides

Embedded Labworks

SISTEMAS DE ARQUIVO (cont.)

✗ Quando um sistema de arquivo é montado em um diretório, este diretório é chamado de ponto de montagem ou mount point, e o conteúdo deste diretório irá refletir o conteúdo armazenado no dispositivo de armazenamento.

✗ Isso permite que aplicações acessem diretórios e arquivos facilmente independentemente da localização ou do tipo do dispositivo de armazemanento.

✗ Tudo o que as aplicações enxergam são arquivos e diretórios!

Page 163: Embedded Linux Slides

Embedded Labworks

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.

Page 164: Embedded Linux Slides

Embedded Labworks

O COMANDO UMOUNT

✗ O comando umount permite desmontar um sistema de arquivo:

umount <dispositivo ou ponto de montagem>

✗ Quando trabalhamos com dispositivos removíveis, é necessário executar o umount antes de remover o dispositivo, já que o Linux por padrão mantém em cache as alterações realizadas no dispositivo para melhorar a performance, e o umount garante que estas alterações sejam realizadas antes da remoção do dispositivo.

Page 165: Embedded Linux Slides

Embedded Labworks

MONTANDO UM SISTEMA DE ARQUIVO

✗ Criando o diretório (ponto de montagem):mkdir /mnt/usbkey

✗ Montando um pendrive:mount ­t vfat /dev/sda1 /mnt/usbkey

✗ Verificando o conteúdo:ls /mnt/usbkeydocs prog.c picture.png movie.avi

✗ Desmontando o dispositivo USB:umount /mnt/usbkey

Page 166: Embedded Linux Slides

Embedded Labworks

SISTEMA DE ARQUIVO ROOT

✗ Um sistema de arquivo específico é 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, não tem como fazê-lo com o comando mount, já que o mesmo ainda não esta disponível. Lembre-se: ainda não existe nenhum sistema de arquivo montado!

✗ Por isso, o responsável por esta tarefa é o kernel, de acordo com a opção root na linha de comandos do kernel.

Page 167: Embedded Linux Slides

Embedded Labworks

SISTEMA DE ARQUIVO ROOT (cont.)

✗ Se você não passar a opção root na linha de comando, o kernel entra em pânico!

Please append a correct "root=" boot option Kernel  panic  ­  not  syncing:  VFS:  Unable  to  mount root fs on unknown block(0,0) 

✗ Passando a opção root para o kernel:

... console=ttyS2,115200n8 root=/dev/sda2 ...

Page 168: Embedded Linux Slides

Embedded Labworks

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.

✗ É nossa a decisão de como iniciar o sistema, e assim configurar corretamente a opção root do kernel.

Page 169: Embedded Linux Slides

Embedded Labworks

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

✗ Partição de um cartão SD✗ root=/dev/mmcblkXpY, onde X é um número de identificação do

dispositivo, e Y é o número da partição.

✗ Exemplo: root=/dev/mmcblk0p2

Page 170: Embedded Linux Slides

Embedded Labworks

MONTANDO O ROOTFS (cont.)

✗ Partição de uma memória flash NAND:✗ root=/dev/mtdblockX, onde X é o número da partição.

✗ Exemplo: root=/dev/mtdblock3

Page 171: Embedded Linux Slides

Embedded Labworks

MONTANDO O ROOTFS VIA REDE

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

✗ Muito mais fácil e rápido de atualizar o rootfs sem precisar gravar na flash e reiniciar o equipamento.

✗ Possibilidade de ter um rootfs bem grande, podendo incluir ferramentas e binários que não caberiam na flash do equipamento.

HostServidor NFS

TargetCliente NFS

Page 172: Embedded Linux Slides

Embedded Labworks

MONTANDO O ROOTFS EM MEMÓRIA

✗ Também é possível ter uma imagem de rootfs integrada à imagem do kernel, sendo por consequência carregada em memória junto com o kernel.

✗ Este mecanismo é chamado de initramfs.

Kernel Initramfs(cpio archive)

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

Page 173: Embedded Linux Slides

Embedded Labworks

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

Page 174: Embedded Linux Slides

Embedded Labworks

ORGANIZAÇÃO DO ROOTFS

✗ A organização do rootfs no Linux é padronizada pelo Filesystem Hierarcy Standard.http://www.pathname.com/fhs/

✗ A maioria dos sistemas Linux estão de acordo com este padrão porque:

✗ As aplicações esperam este formato.

✗ Facilita o trabalho de usuários e desenvolvedores quando precisam trabalhar com diferentes sistemas Linux.

Page 175: Embedded Linux Slides

Embedded Labworks

DIRETÓRIOS MAIS IMPORTANTES

/bin Programas básicos/boot Imagem do kernel (apenas quando o 

bootloader suporta carregar o kerneldo sistema de arquivos, normalmente usadoem arquiteturas x86)

/dev Arquivos de dispositivo/etc Arquivos de configuração/home Diretório de arquivos dos usuários/lib Bibliotecas básicas do sistema/media Ponto de montagem para mídias removíveis/mnt Ponto de montagem para mídias estáticas/proc Ponto de montagem do sistema de arquivo 

virtual ”proc”

Page 176: Embedded Linux Slides

Embedded Labworks

DIRETÓRIOS MAIS IMPORTANTES (cont.)

/root Home do usuário root/sbin Aplicações de administração do sistema/sys Ponto de montagem do sistema de

arquivo virtual sysfs/tmp Arquivos temporários/usr Aplicações e dados dos usuários   /usr/bin Aplicações básicas do usuário   /usr/lib Bibliotecas do usuário   /usr/sbin Aplicações de administração do usuário /var Arquivos de dados (logs, banco de

dados, arquivos temporários, etc)

Page 177: Embedded Linux Slides

Embedded Labworks

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

✗ Da mesma forma, os dispositivos de hardware também são representados no Linux através de arquivos, chamados de arquivos de dispositivo, e disponíveis no diretório /dev.

Page 178: Embedded Linux Slides

Embedded Labworks

INFORMAÇÕES DOS DISPOSITIVOS

✗ Internamente, cada arquivo de dispositivo esta associado à três informações básicas:

✗ Major number: indica a categoria do dispositivo.

✗ Minor number: indica o número do dispositivo.

✗ Tipo do dispositivo:

✗ Dispositivos de bloco: composto por blocos de dados de tamanho fixo, endereçáveis e de acesso aleatório, que podem ser lidos e/ou escritos. Exemplos: HD, pendrive, etc.

✗ Dispositivo de caractere: possibilita o acesso sequencial de bytes, sem começo, sem fim e sem tamanho! Exemplos: portal serial, interface de rede, placa de som, etc.

Page 179: Embedded Linux Slides

Embedded Labworks

EXEMPLOS

✗ Exemplos de arquivos de dispositivo:ls ­la /dev/ttyS* /dev/sda1brw­rw­­­­ 1 root disk    8,  1 2012­01­25 06:54 /dev/sda1crw­rw­­­­ 1 root dialout 4, 64 2012­01­25 06:54 /dev/ttyS0crw­rw­­­­ 1 root dialout 4, 65 2012­01­25 06:54 /dev/ttyS1crw­rw­­­­ 1 root dialout 4, 66 2012­01­25 06:54 /dev/ttyS2crw­rw­­­­ 1 root dialout 4, 67 2012­01­25 06:54 /dev/ttyS3

✗ Escrevendo ”Hello” na porta serial:

int fd;fd = open(“/dev/ttyS0”, O_RDWR);write(fd, “Hello”, 5);close(fd);

Page 180: Embedded Linux Slides

Embedded Labworks

CRIANDO ARQUIVOS DE DISPOSITIVO

✗ Para sistemas mais simples, os arquivos de dispositivo podem ser criados manualmente com o comando mknod (é necessário ter privilégio de root):

mknod /dev/<device> [c|b] major minor

✗ Para sistemas mais complexos, existem mecanismos para adicionar e remover arquivos de dispositivo dinamicamente:

✗ devtmpfs

✗ udev

✗ mdev

Page 181: Embedded Linux Slides

Embedded Labworks

SISTEMA DE ARQUIVO VIRTUAL PROC

✗ O sistema de arquivo virtual proc 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.

✗ O proc também possibilita ajustar parâmetros do kernel em tempo de execução.

✗ Muitas aplicações, como os comandos ps e top, usam as informações disponíveis no /proc para exibirem informações dos processos rodando no sistema.

Page 182: Embedded Linux Slides

Embedded Labworks

SISTEMA DE ARQUIVO VIRTUAL PROC (cont.)

✗ Montando o proc:

mount ­t proc none /proc

✗ Mais informações na documentação do kernel:Documentation/filesystems/proc.txt

Page 183: Embedded Linux Slides

Embedded Labworks

SISTEMA DE ARQUIVO VIRTUAL 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.

✗ Usado por aplicações que querem ler informações dos dispositivos de hardware conectados ao sistema. Ex: mdev, udev, etc.

✗ Pode ser usado também para parametrizar ou configurar determinado hardware.

Page 184: Embedded Linux Slides

Embedded Labworks

SISTEMA DE ARQUIVO VIRTUAL SYSFS (cont.)

✗ Montando o sysfs:

mount ­t sysfs none /sys

✗ Mais informações na documentação do kernel:Documentation/filesystems/sysfs.txt

Page 185: Embedded Linux Slides

Embedded Labworks

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.

✗ Para isso, o kernel tenta executar os binários /sbin/init, /bin/init, /etc/init e /bin/sh.

✗ Você pode passar também o nome do programa de inicialização através do parâmetro init da linha de comandos do kernel. Exemplo:

init=/usr/bin/init

Page 186: Embedded Linux Slides

Embedded Labworks

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.

✗ Assim que executado, o processo init é o responsável pela inicialização do restante do sistema.

Page 187: Embedded Linux Slides

Embedded Labworks

VISÃO GERAL DO BOOTBootloader

Carrega o kernel para a RAM e inicia

/sbin/initInicia outros serviços e aplicações

KernelMonta o rootfs indicado por ”root=”

Inicia a aplicação ”init”

Shell Outras aplicações

Rootfs

Page 188: Embedded Linux Slides

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.

✗ Existem diferentes mecanismos de inicialização, como systemd, upstart, openrc e sysvinit (System V Init).

✗ Devido à simplicidade de uso e utilização em soluções mais simples, vamos estudar aqui o sysvinit.

Page 189: Embedded Linux Slides

Embedded Labworks

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

Page 190: Embedded Linux Slides

Embedded Labworks

/etc/inittab# Startup the systemnull::sysinit:/bin/mount ­t proc proc /procnull::sysinit:/bin/mkdir ­p /dev/pts

# now run any rc scripts::sysinit:/etc/init.d/rcS

# Put a getty on the serial portttySAC0::respawn:/sbin/getty ­L ttySAC0 115200 vt100

# Stuff to do for the 3­finger salute::ctrlaltdel:/sbin/reboot

# Stuff to do before rebootingnull::shutdown:/usr/bin/killall syslogd

Page 191: Embedded Linux Slides

Embedded Labworks

/etc/init.d/rcS#!/bin/sh

for i in /etc/init.d/S??*; do

    case "$i" in

        *.sh)            . $i         ;;

        *)            $i start        ;;

    esacdone

Page 192: Embedded Linux Slides

Embedded Labworks

/etc/init.d/

ls ­l 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

Page 193: Embedded Linux Slides

Embedded Labworks

CRIANDO UM ROOTFS BÁSICO

✗ Um sistema Linux precisa de um conjunto básico de programas para funcionar (init, shell, comandos básicos, etc).

✗ Normalmente estes programas são fornecidos em diferentes projetos e é trabalhoso integrar manualmente todos estes componentes.

✗ O Busybox é uma solução 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/

Page 194: Embedded Linux Slides

Embedded Labworks

APLICAÇÕES DISPONÍVEIS 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

Page 195: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Gerando um rootfs simples e testando com NFS

Page 196: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Kernel modules

Page 197: Embedded Linux Slides

Embedded Labworks

KERNEL MONOLÍTICO E MICROKERNEL

✗ Kernel monolítico: o sistema operacional inteiro roda em kernel space, com total acesso aos recursos da máquina (CPU, memória e I/Os), e provê para as aplicações (userspace) uma interface de comunicação através de chamadas de sistema (system calls).

✗ Microkernel: apenas o básico do kernel roda em userspace (gerenciamento de memória e processos). O resto roda em userspace, incluindo sistemas de arquivos, device drivers, protocolos de rede, etc!

Page 198: Embedded Linux Slides

Embedded Labworks

MONOLÍTICO X MICROKERNEL

Page 199: Embedded Linux Slides

Embedded Labworks

O KERNEL LINUX

✗ O Linux é um kernel monolítico.

✗ Mas internamente o Linux é bem modular. Cada funcionalidade é abstraída em um módulo, com uma interface de comunicação bem definida. Por isso, permite um sistema de configuração onde você pode adicionar ou remover determinada funcionalidade.

✗ E o Linux permite que você adicione dinamicamente “pedaços de código do kernel” em tempo de execução!

✗ Chamamos esses “pedaços de código” de módulos do kernel.

Page 200: Embedded Linux Slides

Embedded Labworks

VANTAGENS DOS MÓDULOS

✗ Ajuda a manter a imagem do kernel bem pequena.

✗ Módulos tornam fácil o desenvolvimento do kernel, como por exemplo device drivers, sem precisar reiniciar o equipamento.

✗ O tempo de boot fica menor: menos código para ser executado na inicialização do kernel.

✗ Cuidado: módulos rodam em kernel space. Uma vez carregados, eles tem total controle do sistema! Por isso só podem ser carregados como root.

Page 201: Embedded Linux Slides

Embedded Labworks

COMPILANDO OS MÓDULOS

✗ Para compilar apenas os módulos, basta executar:

make modules

✗ Para cross-compilar os módulos, não esqueça de indicar a arquitetura e o prefixo do cross-compiler. Exemplo:

make ARCH=arm CROSS_COMPILE=arm­linux­ modules

Page 202: Embedded Linux Slides

Embedded Labworks

INSTALANDO OS MÓDULOS

✗ Para instalar os módulos nativamente, basta executar o comando abaixo:

make modules_install

✗ No caso de um ambiente de compilação cruzada, os módulos devem ser instalados no rootfs do target.

✗ Para isso, devemos passar o parâmetro INSTALL_MOD_PATH no comando de instalação:make ARCH=<arch> INSTALL_MOD_PATH=<dir>/ modules_install

Page 203: Embedded Linux Slides

Embedded Labworks

DEPENDÊNCIAS DOS MÓDULOS

✗ Alguns módulos dependem de outros módulos, que precisam ser carregados primeiro.

✗ Exemplo: o módulo usb_storage depende do módulo usbcore.

✗ As dependências entre os módulos estão descritas em /lib/modules/<kernel­version>/modules.dep.

✗ Este arquivo é gerado quando você instala os módulos.

Page 204: Embedded Linux Slides

Embedded Labworks

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

✗ O comando modprobe carrega um módulo e todas as suas dependências. Deve-se passar apenas o nome do módulo, sem a extensão .ko e sem seu caminho completo.

modprobe <module_name>

Page 205: Embedded Linux Slides

Embedded Labworks

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>

✗ O comando modprobe descarrega um módulo e todas as suas dependências (que não estão sendo usadas). Deve-se passar apenas o nome do módulo, sem a extensão .ko e sem seu caminho completo.

modprobe ­r <module_name>

Page 206: Embedded Linux Slides

Embedded Labworks

LISTANDO INFORMAÇÕES DOS MÓDULOS

✗ O comando modinfo lê informações de um módulo, como sua descrição, parâmetros, licença e dependências. Deve-se passar apenas o nome do módulo, sem a extensão .ko e sem seu caminho completo.

modinfo <module_name>

✗ O comando lsmod lista todos os módulos carregados.

lsmod

Page 207: Embedded Linux Slides

Embedded Labworks

PASSANDO PARÂMETROS

✗ Descobrindo os parâmetros disponíveis do módulo:

modinfo <module>

✗ Passando um parâmetro via insmod:

insmod <module> param=value

✗ Para passar um parâmetro via modprobe, configurar o parâmetro em /etc/modprobe.conf ou em qualquer arquivo em /etc/modprobe.d/:

options <module> param=value

✗ Para passar um parâmetro via linha de comandos do kernel:

<module>.param=value

Page 208: Embedded Linux Slides

Embedded Labworks

LOGS DO KERNEL

✗ O kernel mantém um log de mensagens na memória em um buffer circular.

✗ Quando um novo módulo é carregado, informações relevantes são enviadas ao log do kernel.

✗ Este log de mensagens pode ser exibido através do comando dmesg (diagnostic message).

✗ Mensagens de log também são exibidas na console.

Page 209: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Compilando, instalando e carregando módulos

Page 210: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Sistemas de Arquivo

Page 211: Embedded Linux Slides

Embedded Labworks

SISTEMAS DE ARQUIVO

✗ Um sistema de arquivo é uma representação 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.

✗ Segurança.

✗ Economia de espaço em disco.

✗ Uso em diferentes tipos de dispositivo de armazenamento.

Page 212: Embedded Linux Slides

Embedded Labworks

DISPOSITIVOS DE ARMAZENAMENTO

✗ No Linux, os dispositivos de armazenamento são classificados em dois tipos: dispositivos de bloco e memórias flash.

✗ Isso porque, dentro do kernel, eles são manipulados por sub-sistemas diferentes:✗ Dispositivos de bloco podem ser lidos ou escritos normalmente sem a

necessidade de apagar antes, e ”virtualmente” não possuem limites de escrita. Exemplo: HD.

✗ Memórias 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.

Page 213: Embedded Linux Slides

Embedded Labworks

LISTANDO 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

Page 214: Embedded Linux Slides

Embedded Labworks

SISTEMAS DE ARQUIVO TRADICIONAIS

✗ Existem sistemas de arquivo específicos para dispositivos de bloco.

✗ E tudo começou com o tradicional sistema de arquivo ext2, presente no Linux desde praticamente as primeiras versões.

✗ É um sistema de arquivo bem estável, mas com um grande problema: pode deixar o sistema em um estado inconsistente após um crash ou um reboot não esperado, fazendo com que o sistema precise usar ferramentas de verificação de disco no próximo boot (fsck.ext2).

Page 215: Embedded Linux Slides

Embedded Labworks

SISTEMAS DE ARQUIVO TRADICIONAIS (cont.)

✗ É o mesmo caso do vfat, a implementação 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). Então começaram a aparecer alguns sistemas de arquivo com uma característica especial chamada de journaling.

Page 216: Embedded Linux Slides

Embedded Labworks

JOURNALING

✗ Um sistema de arquivo com journal foi projetado para manter a consistência dos dados mesmo após um crash do sistema ou um reboot inesperado.

✗ Todas as alterações são salvas em um journal (uma espécie de log) antes de serem aplicadas no arquivo.

Escreve uma entrada no journal

Escreve no arquivo

Aplicação

Escreve no arquivoUser space

Kernel space

Limpa entrada no journal

Page 217: Embedded Linux Slides

Embedded Labworks

JOURNALING (cont.)

✗ Devido ao mecanismo de journaling, o sistema de arquivo nunca fica em um estado inconsistente (corrompido).

✗ Os últimos dados salvos, no entanto, podem ser perdidos.

Reboot

Journalvazio?

Executajournal

Sistema de arquivo OK

Sim

Descarta entradasincompletas no

journal

Não

Page 218: Embedded Linux Slides

Embedded Labworks

SISTEMAS DE ARQUIVO COM JOURNALING

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

✗ O ext4 é a nova geração com muitas melhorias, e é o sistema de arquivo padrão das distribuições Linux atuais.

✗ O btrfs (também chamado de ”ButterFS”) é a próxima geração e visa substituir o ext4. Já esta disponível 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 aplicações específicas, como por exemplo trabalhar com arquivos muito pequenos ou com carga de trabalho muito alta.

Page 219: Embedded Linux Slides

Embedded Labworks

QUAL ESCOLHER?

✗ Na prática, você usará o ext3 ou o ext4 em dispositivos de bloco.

✗ Para dispositivos de bloco que usam memória flash (cartão 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 são usados normalmente em servidores, e tem pouca aplicação em Linux embarcado.

Page 220: Embedded Linux Slides

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 espaço no dispositivo de armazenamento.

✗ Um sistema de arquivo comprimido, como o próprio nome diz, armazena os dados de forma comprimida no dispositivo de armazenamento.

✗ Como algoritmos para escrever de forma comprimida são bem mais complicados de implementar sem afetar a performance e a confiabilidade do sistema, boa parte dos sistemas de arquivo comprimidos são de apenas leitura.

Page 221: Embedded Linux Slides

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 são comprimidos com a biblioteca zlib, suportando arquivos de até 16M, e com tamanho máximo total da imagem de até 256MB.

✗ Você só vai precisar do CramFS se seu kernel for muito antigo (anterior à versão 2.6.29).

Page 222: Embedded Linux Slides

Embedded Labworks

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

✗ 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 partições que podem ser apenas de leitura (kernel, binários, etc).

✗ Usado também em distribuições que rodam direto de um pendrive ou CD/DVD (Live CD).

Page 223: Embedded Linux Slides

Embedded Labworks

SISTEMAS DE ARQUIVO VOLÁTEIS

✗ Quando trabalhamos com Linux embarcado, às vezes precisamos criar arquivos temporários, armazenar informações de processos em execução, fazer log, etc.

✗ Fazer isso em um dispositivo de armazenamento pode ser muito custoso, envolve operações de I/O e pode consumir a vida útil do dispositivo no caso de memórias flash.

✗ Outro ponto é que estas informações são voláteis, ou seja, não tem mais utilidade após o boot.

✗ São nestes casos que usamos sistemas de arquivo voláteis.

Page 224: Embedded Linux Slides

Embedded Labworks

SISTEMAS DE ARQUIVO VOLÁTEIS (cont.)

✗ Com um sistema de arquivo volátil, você consegue manter um diretório do sistema montado em RAM. Ou seja, tudo o que você escrever neste diretório, vai para a memória RAM!

✗ Consequentemente, você irá perder estas informações no boot do equipamento. Mas é a solução perfeita para armazenar dados e arquivos temporários.

✗ O sistema de arquivo volátil padrão no Linux atualmente é o tmpfs.

Page 225: Embedded Linux Slides

Embedded Labworks

TMPFS

✗ O tmpfs é um sistema de arquivo útil para armazenar dados temporários em RAM (arquivos temporários, logs, etc).

✗ Não gasta muita RAM, cresce e diminui automaticamente conforme o uso (configurável durante a montagem).

✗ Como usar:

mount ­t tmpfs tmp /tmp

✗ Para mais informações, veja a documentação no kernel:Documentation/filesystems/tmpfs.txt

Page 226: Embedded Linux Slides

Embedded Labworks

MISTURANDO TUDO

✗ Você pode dividir seu dispositivo de bloco em partições:

✗ Uma partição squashfs para o rootfs (kernel, binários, etc). Salva espaço, e por ser apenas leitura, fica protegido de alterações acidentais no sistema de arquivos.

✗ Uma partição ext3 para leitura e escrita de dados do usuário e de configuração.

✗ Dados temporários em RAM com o tmpfs.

squashfsrootfs

comprimido

ext3dados e

configuração

Tmpfsdados

voláteis RAM

Disp

osit

ivo

de B

loco

Page 227: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Iniciando o rootfs de um dispositivo de bloco

Page 228: Embedded Linux Slides

Embedded Labworks

MEMÓRIAS FLASH

✗ Algumas limitações diferem as memórias flash de dispositivos de bloco tradicionais como HDs.

✗ As memórias flash só podem ser apagadas em blocos. Estes blocos são 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 posição da flash.

✗ Porém, se você escrever 0 em qualquer um dos bits de qualquer posição da flash, você só consegue fazê-lo voltar para 1 apagando todo o bloco correspondente da flash!

Page 229: Embedded Linux Slides

Embedded Labworks

MEMÓRIAS FLASH (cont.)

✗ Outra limitação das memórias flash é a quantidade de vezes que você pode apagar e escrever nela (program/erase cycles).

✗ Esta limitação, 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 aplicação fazendo log em memória 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.

Page 230: Embedded Linux Slides

Embedded Labworks

MEMÓRIAS FLASH (cont.)

✗ Mesmo assim, depois de certo tempo de uso da flash, um ou mais blocos serão inutilizados.

✗ Por este motivo, existe uma técnica chamada de BBM (Bad Block Management).

✗ Quando sai de fábrica, as memórias flash já possuem gravada nelas uma tabela de bad blocks.

✗ Toda camada de software que trabalha com memórias flash deve ser capaz de ler e identificar estes bad blocks para não utilizar regiões inválidas da flash.

Page 231: Embedded Linux Slides

Embedded Labworks

TIPOS DE MEMÓRIAS FLASH

✗ Além destas características especiais, existem basicamente dois tipos de memória flash:✗ Flash NOR: Acesso aleatório 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 código, 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 características e limitações das memórias flash que existe um sub-sistema específico no kernel chamado de MTD para tratar memórias flash.

Page 232: Embedded Linux Slides

Embedded Labworks

MTD (MEMORY TECHNOLOGY DEVICES)

MTD Chip drivers

Interface com o sistema de arquivos

NOR flash

MTD User modules

Hardware

DiskOnChip flash

RAM chips

ROM chipsNAND flash

Block device Virtual memory

Virtual devices

jffs2

Char device Block deviceRead-only block device

yaffs2ubifs

Page 233: Embedded Linux Slides

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

✗ Cada um dos MTD user modules irá tratar de forma diferente a flash. É neste contexto que as memórias flash também são chamadas de dispositivos MTD.

Page 234: Embedded Linux Slides

Embedded Labworks

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.

✗ Além disso, ele disponibiliza comandos ioctl() para você poder manipular a flash (ler informações, apagar/gravar na flash, etc).

✗ A principal utilidade deste módulo é no gerenciamento da flash, quando usamos o pacote mtd-utils.

Page 235: Embedded Linux Slides

Embedded Labworks

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.

✗ Para mais informações consulte o site do projeto:http://www.linux-mtd.infradead.org/

Page 236: Embedded Linux Slides

Embedded Labworks

MTDBLOCK

✗ O driver mtdblock implementa o módulo "block device" da flash.

✗ Ele cria um dispositivo de bloco para cada partição de um dispositivo MTD no sistema, normalmente nomeado /dev/mtdblockX, onde X é o número da partição.

✗ Este módulo permite acesso de leitura/escrita por bloco, como se fosse um HD mesmo, mas não gerencia bad blocks e também não trabalha com wear leveling em escritas.

✗ Portanto, se você quiser um sistema de arquivo que trabalhe com todas as limitações da flash, incluindo bad blocks e wear leveling, você vai precisar de um sistema de arquivo específico para flash.

Page 237: Embedded Linux Slides

Embedded Labworks

JFFS2

✗ É um dos sistemas de arquivo para flash mais antigos ainda em utilização.http://www.linux-mtd.infradead.org/doc/jffs2.html

✗ Vantagens: compressão em tempo de execução (economiza espaço), confiabilidade, wear leveling e algoritmo ECC.

✗ Desvantagens: não escala muito bem em memórias flash com capacidades muito grandes. O kernel precisa varrer todo o sistema de arquivo no momento da montagem.

✗ Habilitando no kernel a opção CONFIG_JFFS2_SUMMARY reduz drasticamente este tempo de montagem.

Page 238: Embedded Linux Slides

Embedded Labworks

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/

✗ Vantagens: tempo de boot rápido, confiabilidade, wear leveling e algoritmo ECC.

✗ Desvantagens: suporta apenas memórias flash NAND e não comprime os dados.

Page 239: Embedded Linux Slides

Embedded Labworks

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

✗ Trabalha com volumes lógicos em cima de dispositivos MTD.

✗ Overhead de metadata em partições pequenas.

✗ Mas com a capacidade das memórias flash aumentando cada vez mais, deve se tornar nos próximos anos o sistema de arquivo padrão para dispositivos MTD.

Page 240: Embedded Linux Slides

Embedded Labworks

DICAS PARA TRABALHAR COM FLASH

✗ Não use a memória flash como região de swap!

✗ Não use a memória flash para armazenamento volátil como logs e arquivos temporários (use tmpfs nestes casos).

✗ Monte seu rootfs como apenas leitura, ou use o squashfs, quando possível.

✗ Use a opção de montagem noatime para evitar atualizar o sistema de arquivos toda vez que você acessa um arquivo.

✗ Não use a opção de montagem sync (atualização escreve imediatamente no sistema de arquivo).

Page 241: Embedded Linux Slides

Embedded Labworks

ESCOLHENDO O SISTEMA DE ARQUIVO

DadosVoláteis?

SomenteLeitura?

Dispositivo Tem flash?

tmpfs

squashfs

ubifs ou jffs2

ext2 (noatime)

ext3 ou ext4

Sim

Sim SimNão

NãoNão

MTD

Bloco

Page 242: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Iniciando o rootfs da memória flash

Page 243: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Build system

Page 244: Embedded Linux Slides

Embedded Labworks

O DESAFIO: INTEGRAR TUDO ISSO

Hardware

Bootloader

Linux kernel

Biblioteca C

Biblioteca Biblioteca

Biblioteca Biblioteca

Toolchain

Page 245: Embedded Linux Slides

Embedded Labworks

O DESAFIO: INTEGRAR TUDO ISSO (cont.)

u-boot.bin uImage rootfs.img

Page 246: Embedded Linux Slides

Embedded Labworks

INTEGRANDO TUDO

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

✗ Na prática, não precisamos desenvolver um sistema Linux manualmente, ja que é uma atividade trabalhosa, demorada e suscetível à erros.

✗ Portanto, temos normalmente duas possíveis soluções para trabalhar no desenvolvimento de sistemas com Linux embarcado:

1. Usar uma distribuição Linux pronta.

2. Usar um sistema de build (build system).

Page 247: Embedded Linux Slides

Embedded Labworks

DISTRIBUIÇÃO PRONTA

✗ Existem diversas distribuições comerciais prontas para Linux embarcado: MontaVista, Timesys Linux, Wind River Linux, etc.

✗ Existem também diversas soluções abertas, incluindo Android, Emdebian, Ubuntu embedded, Tizen, Angstrom, Meego, etc.

✗ Vantagens: ✗ Simplicidade de uso.

✗ Facilidade na instalação de novos pacotes.

✗ Framework de desenvolvimento pronto e funcional.

Page 248: Embedded Linux Slides

Embedded Labworks

DISTRIBUIÇÃO PRONTA (cont.)

✗ Desvantagens: ✗ Falta flexibilidade (compatibilidade com plataforma de hardware,

mecanismo de inicialização, framework de desenvolvimento disponível, erros em pacotes da distribuição, etc).

✗ Normalmente o rootfs é grande, ocupa muito espaço no dispositivo de armazenamento.

✗ Tempo de boot normalmente alto.

✗ Requer customização para deixar o sistema mais leve.

✗ Difícil de levantar quais pacotes open source são usados.

Page 249: Embedded Linux Slides

Embedded Labworks

BUILD SYSTEM

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

✗ Ele automatiza o processo de geração dos diversos componentes do sistema, incluindo o toolchain, o kernel, o bootloader, as bibliotecas e as aplicações.

✗ Normalmente já contém um conjunto grande de pacotes configurados para serem habilitados e utilizados pelo seu sistema.

✗ E facilita o trabalho de adicionar novos pacotes se necessário.

Page 250: Embedded Linux Slides

Embedded Labworks

BUILD SYSTEM (cont.)

✗ Vantagens: ✗ Flexibilidade.

✗ O processo de build torna-se reproduzível, facilitando o trabalho de recompilação, correção de problemas e adição de novas funcionalidades.

✗ Desvantagens:✗ Tempo extra para configurar a ferramenta.

✗ É necessário conhecimento do funcionamento da ferramenta e de mecanismos de compilação para adicionar novos pacotes se necessário e corrigir possíveis erros de compilação.

Page 251: Embedded Linux Slides

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/

Page 252: Embedded Linux Slides

Embedded Labworks

FERRAMENTAS (cont.)

✗ OpenEmbedded, mais flexível (e também mais complexo):http://www.openembedded.org

✗ Yocto, evolução do OpenEmbedded:http://www.yoctoproject.org/

✗ Sistemas comerciais (MontaVista, WindRiver, Timesys).

Page 253: Embedded Linux Slides

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 aplicações/bibliotecas disponíveis.

Page 254: Embedded Linux Slides

Embedded Labworks

BUILDROOT

✗ Desenvolvido pelos mesmos mantenedores da uClibc.

✗ Possibilita gerar o toolchain, o bootloader, o kernel e o rootfs com muitas bibliotecas e aplicações disponíveis.

✗ Mais de 700 aplicações e bibliotecas integradas, de utilitários básicos à bibliotecas mais elaboradas como X.org, Qt, Gtk, Webkit, Gstreamer, etc.

✗ Ótima solução para projetos pequenos e médios.

✗ Desde a versão 2009.02 um novo release é liberado a cada 3 meses.

Page 255: Embedded Linux Slides

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

Page 256: Embedded Linux Slides

Embedded Labworks

CONFIGURANDO O BUILDROOT

Page 257: Embedded Linux Slides

Embedded Labworks

COMPILANDO O BUILDROOT

✗ Configuração também fica armazenada em um arquivo .config.

✗ Para compilar:

make 

✗ No final do processo de compilação, as imagens estarão disponíveis no diretório abaixo:

ls output/images/rootfs.ext2  rootfs.jffs2  u­boot.bin  uImage

Page 258: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Gerando um sistema Linux do zero com o Buildroot

Page 259: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Bibliotecas e aplicações

Page 260: Embedded Linux Slides

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.

✗ Estas bibliotecas e aplicações são normalmente disponibilizadas e distribuídas gratuitamente, e graças à sua natureza open-source, podem ser analisadas e modificadas de acordo com seu projeto.

✗ Entretanto, o uso eficiente destes componentes nem sempre é fácil.

✗ Você precisa encontrar e escolher o componente mais apropriado, compilar e integrar ao seu projeto.

Page 261: Embedded Linux Slides

Embedded Labworks

PROCURANDO COMPONENTES

✗ Procurar em sites que hospedam projetos de software livre:http://www.freshmeat.nethttp://directory.fsf.orghttp://sourceforge.nethttp://code.google.com/hostinghttps://github.com

✗ Pesquisar outros produtos com Linux embarcado, e identificar seus componentes.

✗ Perguntar à comunidade (fóruns, listas de discussão, etc).

✗ Pesquisar no Google ou em outros sites de busca.

Page 262: Embedded Linux Slides

Embedded Labworks

ESCOLHENDO COMPONENTES

✗ Ao escolher um componente open source para seu projeto, você precisa levar em consideração:✗ Requisitos técnicos: o componente deve satisfazer os requisitos técnicos

do seu projeto. Mas não esqueça também de que você mesmo pode implementar estas melhorias! E depois compartilhar!

✗ Atividade do projeto: o projeto deve ser ativo, releases frequentes, fórum movimentado. É importante ter a garantia de manutenção e suporte.

✗ Qualidade do componente: seu uso em diversos sistemas e uma comunidade ativa em geral significam uma qualidade relativamente boa.

✗ Licença: a licença pode ser um impeditivo para o uso de determinado componente no seu produto.

Page 263: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Pacotes open source

Page 264: Embedded Linux Slides

Embedded Labworks

LINGUAGENS DE SCRIPT

✗ Interpretadores das mais comuns linguagens de script estão disponíveis:

✗ Shell script

✗ Python

✗ Perl

✗ Lua

✗ Ruby

✗ TCL

✗ PHP

Page 265: Embedded Linux Slides

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.

Page 266: Embedded Linux Slides

Embedded Labworks

FERRAMENTAS DE REDE

✗ dropbear: implementação 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: implementação do protocolo SNMP.

✗ openssl: biblioteca para conexões SLL e TLS.

✗ vsftpd: servidor SFTP.

Page 267: Embedded Linux Slides

Embedded Labworks

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.

✗ thttpd: servidor HTTP simples, rápido e portável, com suporte à CGI e autenticação. Sem suporte nativo à SSL.

✗ lighttpd: servidor HTTP mais completo, ótimo para gerenciar altas cargas, rápido e seguro, com suporte à controle de acesso, CGI e SSL.

Page 268: Embedded Linux Slides

Embedded Labworks

MULTIMEDIA

✗ Gstreamer: framework multimídia, permite codificar e decodificar diversos containers e formatos multimídia. Suporta codecs de hardware através de plugins.

✗ FFmpeg: ferramenta completa para gravar, converter e tocar mídias. Implementa a libavcodec, uma das mais usadas e famosas bibliotecas de áudio e vídeo da atualidade.

✗ Mplayer: player multimídia (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.

Page 269: Embedded Linux Slides

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 aplicação proprietária, já que o SQLite é liberado sob domínio público.

Page 270: Embedded Linux Slides

Embedded Labworks

OUTRAS BIBLIOTECAS

✗ Bibliotecas de compressão/descompressão.

✗ Bibliotecas de criptografia.

✗ Bibliotecas de manipulação do hardware.

✗ Bibliotecas de rede.

✗ Bibliotecas para manipular arquivos XML.

✗ Bibliotecas gráficas (veremos em detalhes mais adiante).

✗ Etc!

Page 271: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Licenças

Page 272: Embedded Linux Slides

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.

✗ Veja o link abaixo para uma definição completa de software livre:http://www.gnu.org/philosophy/free-sw.html

Page 273: Embedded Linux Slides

Embedded Labworks

LICENÇAS (cont.)

✗ Licenças de software livre possuem basicamente duas categorias:✗ Licenças copyleft.

✗ Licenças non-copyleft.

✗ Quando você modifica e distribui um software sob licença copyleft, você precisa liberá-lo sob a mesma licença original.✗ Mesma liberdade à novos usuários.

✗ Incentivo para você contribuir de volta à comunidade.

✗ Licenças non-copyleft não tem estes requisitos, e versões modificadas podem ser mantidas proprietárias, sendo necessário apenas manter a atribuição de autoria do projeto ao autor original.

Page 274: Embedded Linux Slides

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 aplicações.

✗ É uma licença copyleft:✗ Trabalhos derivados precisam ser liberados sob a mesma licença.

✗ Programas linkados com uma biblioteca GPL também precisam ser liberados sob a GPL.

Page 275: Embedded Linux Slides

Embedded Labworks

GPL (cont.)

✗ Boa parte dos programas é coberta pela GPLv2.

✗ Alguns programas estão migrando para a GPLv3.✗ Principal diferença: o usuário deve ser capaz de rodar versões

modificadas do programa no dispositivo.

Page 276: Embedded Linux Slides

Embedded Labworks

LGPL

✗ GNU Lesser General Public Licence.

✗ Cobre ~10% dos projetos de software livre.

✗ É uma licença copyleft:✗ Trabalhos derivados precisam ser liberados sob a mesma licença.

✗ Mas programas linkados com uma biblioteca LGPL não precisam ser liberados pela LGPL e podem ser mantidos proprietários.

✗ Entretanto, o usuário precisa ter a possibilidade de atualizar a biblioteca independentemente do programa, portanto, a linkagem precisa ser dinâmica.

✗ Licença usada nas maioria das bibliotecas.

Page 277: Embedded Linux Slides

Embedded Labworks

LICENÇAS NON-COPYLEFT

✗ Versões modificadas de um software sob licença non-copyleft podem ser mantidas proprietárias, desde que você atribua a autoria da versão original.

✗ Existe uma grande família de licenças non-copyleft relativamente similares em suas características, dentre elas:

✗ Apache Licence

✗ BSD Licence

✗ MIT Licence

✗ X11 Licence

✗ Artistic Licence

Page 278: Embedded Linux Slides

Embedded Labworks

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.

✗ Você modificou uma biblioteca qualquer sob a licença LGPL:✗ Você precisa liberar as versões modificadas sob a mesma licença.

Page 279: Embedded Linux Slides

Embedded Labworks

LICENÇAS (EXEMPLOS)

✗ Você criou uma aplicação que utiliza uma biblioteca LGPL:✗ Você pode manter sua aplicação proprietária, mas precisa linkar

dinamicamente com a biblioteca.

✗ Você fez modificações em um software non-copyleft:✗ Você pode manter suas modificações proprietárias, mas precisa

manter o crédito aos autores.

Page 280: Embedded Linux Slides

Embedded Labworks

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.

Page 281: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Identificando e analisando licenças open source

Page 282: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Cross-compilando bibliotecas e aplicações

Page 283: Embedded Linux Slides

Embedded Labworks

COMO CROSS-COMPILAR?

✗ Basicamente, temos duas soluções:✗ Adaptar o pacote ao seu build system.

✗ Compilar manualmente.

✗ O processo de adaptação do pacote ao build system é dependente do build system utilizado. Por exemplo, para compilar um pacote dentro do Buildroot, os procedimentos estão disponíveis no manual do Buildroot:http://buildroot.uclibc.org/downloads/manual/manual.html

✗ Para compilar manualmente, você precisa:✗ Toolchain.

✗ Conhecer o mecanismo de compilação do pacote.

Page 284: Embedded Linux Slides

Embedded Labworks

MECANISMOS DE COMPILAÇÃO

✗ Todo software open-source possui um sistema de build ou mecanismo de compilação. Dentre eles, podemos destacar:

✗ Makefile simples: é necessário 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.

Page 285: Embedded Linux Slides

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 contém os comandos a serem executados durante o processo de compilação.

✗ Para compilar um programa ou biblioteca baseado em makefiles, basta digitar o comando abaixo (considerando-se que você tenha um arquivo Makefile no diretório corrente):

make

Page 286: Embedded Linux Slides

Embedded Labworks

MAKEFILE (EXEMPLO)

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

Page 287: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Desenvolvendo uma aplicação baseada em Makefile

Page 288: Embedded Linux Slides

Embedded Labworks

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.

✗ Ele tem basicamente os seguintes objetivos:✗ Ser um sistema de build universal e multiplataforma.

✗ Analisar e verificar se a plataforma possui os requisitos necessários para compilar o pacote (biblioteca ou aplicação).

✗ Configurar a aplicação, habilitando ou desabilitando funcionalidades antes da compilação.

Page 289: Embedded Linux Slides

Embedded Labworks

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.

✗ Para compilar um software baseado em autotools, normalmente usamos os comandos abaixo:./configuremakemake install

Page 290: Embedded Linux Slides

Embedded Labworks

CROSS-COMPILANDO COM AUTOTOOLS

✗ Para cross-compilar um software baseado em autotools, você precisará prestar atenção em alguns detalhes adicionais.

✗ No script de configuração, você precisa indicar o host (onde irá executar o software) com a opção --host.

✗ Dependendo do pacote, você precisará indicar o nome das ferramentas de compilação do toolchain, setando as variáveis de ambiente AR, AS, LD, CC, GCC, CPP, CXX.

✗ Você precisa indicar onde irá instalar o software usando a variável DESTDIR, que deve estar apontando para o diretório onde se encontra o rootfs do seu sistema.

Page 291: Embedded Linux Slides

Embedded Labworks

AUTOTOOLS (EXEMPLO)

# configurando o toolchainexport PATH=/usr/local/arm­linux/bin:$PATHexport CC=arm­linux­gcc

# configurando a aplicação./configure ­­host=arm­linux

# compilandomake

# instalandomake DESTDIR=/home/<user>/work/rootfs install

Page 292: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Cross-compilando um software baseado em autotools

Page 293: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Integrando componentes

Page 294: Embedded Linux Slides

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.

✗ Precisamos saber documentar as alterações realizadas em pacotes open-source, porque quando atualizarmos este pacote para uma nova versão, será necessário aplicar as alterações realizadas no pacote original.

✗ Precisamos de um mecanismo para distribuir estas alterações, e também para contribuir de volta com a comunidade.

✗ Como a comunidade de software livre é muito grande, precisamos de uma linguagem comum.

Page 295: Embedded Linux Slides

Embedded Labworks

PATCHES

✗ Como então documentar as alterações realizadas em projetos open-source? Através de patches!

✗ Um patch descreve basicamente as diferenças entre um ou mais arquivos de determinado diretório ou projeto.

✗ Um patch pode ser gerado automaticamente por uma ferramenta de controle de versão (svn, git, mercurial), ou pode ser gerado manualmente através da ferramenta diff:

diff ­rau prj­orig prj­alt > prj.patch

Page 296: Embedded Linux Slides

Embedded Labworks

EXEMPLO DE PATCH

diff ­rau netcat/src/netcat.c netcat2/src/netcat.c­­­ netcat/src/netcat.c  2011­10­01 12:03:55.000000000 +++ netcat2/src/netcat.c 2012­03­12 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;

Page 297: Embedded Linux Slides

Embedded Labworks

APLICANDO PATCHES

✗ Com o arquivo de patch temos documentado as alterações realizadas no projeto original.

✗ Para aplicar o patch, basta entrar no diretório do projeto original e executar a ferramenta patch:

cd prj­orig/patch ­p1 < ../prj.patch

Page 298: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Criando e aplicando patches

Page 299: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Bibliotecas gráficas

Page 300: Embedded Linux Slides

Embedded Labworks

CAMADA DE VÍDEO NO LINUX

Controladora VGA

ControladoraLCD

Framebuffer driver

Framebuffer driver

Framebuffer driver comum/dev/fbX

AplicaçãoBiblioteca

(SDL, DirectFB)Servidor Gráfico

(X server)Toolkit

Gráfico (Qt)

Toolkit Gráfico(Qt, Gtk) Aplicação

Acessodireto

à memória/dev/mem

Hardware

Kernel

User

Aplicação Aplicação

Page 301: Embedded Linux Slides

Embedded Labworks

CAMADA INPUT NO LINUX

Hardware

Kernel

User

Teclado ou mouse PS2

Teclado ou Mouse USB

ControladoraTouchscreen

Acelerômetro Joystick

Input event driver (/dev/input/eventX)

Input core

AplicaçãoToolkit gráfico

Bibliotecagráfica

Servidor gráfico

Serio USB HID SPI I2C GPIO

Input driver Input driver Input driver Input driver Input driver

Page 302: Embedded Linux Slides

Embedded Labworks

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

✗ Suporta aceleração de hardware 3D via OpenGL e acesso ao framebuffer para gráficos 2D.

✗ Usada basicamente para desenvolvimento de aplicações que desejam acessar diretamente o hardware. Exemplos: jogos, mídia players, etc.

Page 303: Embedded Linux Slides

Embedded Labworks

JOGO CIVILIZATION USANDO SDL

Page 304: Embedded Linux Slides

Embedded Labworks

DIRECTFB

✗ Biblioteca de baixo nível para trabalhar com interface gráfica.http://www.directfb.org

✗ Pode ser utilizada para desenvolvimento de UI em aplicações simples, ou como uma camada de baixo nível para bibliotecas gráficas de mais alto nível.

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

✗ Capacidade de trabalhar com aceleradores gráficos em diferentes hardwares.

Page 305: Embedded Linux Slides

Embedded Labworks

MEDIACENTER USANDO DIRECTFB

Page 306: Embedded Linux Slides

Embedded Labworks

X.ORG KDRIVE

✗ Kdrive (antes Tiny-X) é a implementação do servidor X para sistemas embarcados.http://www.x.org

✗ Também trabalha diretamente sobre o framebuffer.

✗ Suporte total ao protocolo X11, e permite o uso de qualquer aplicação ou biblioteca baseada no X11.

✗ O uso é feito normalmente com um Toolkit rodando por cima (Qt, Gtk, EFL, WxEmbedded, etc).

Page 307: Embedded Linux Slides

Embedded Labworks

DESKTOP USANDO KDRIVE

Page 308: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Toolkits gráficos

Page 309: Embedded Linux Slides

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

✗ Pode usar o servidor X ou o DirectFB como backend gráfico.

✗ Não inclui um sistema de janelas.

✗ Em desktop é comum o Gnome como sistema de janelas. Em sistemas embarcados, uma possibilidade é o Matchbox.

Page 310: Embedded Linux Slides

Embedded Labworks

EXEMPLOS DE USO DO GTK

OpenMoko

Maemo

Interface proprietária

Page 311: Embedded Linux Slides

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/

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

✗ Implementação em C++.

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

Page 312: Embedded Linux Slides

Embedded Labworks

EXEMPLOS DE USO DO QT

OpenMoko Netflix Player

Express GPS

Page 313: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Desenvolvendo uma aplicação em Qt

Page 314: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Debugging

Page 315: Embedded Linux Slides

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/

✗ Interface via console, mas com frontends disponíveis (Eclipse, DDD, GDB/Insight, Kdbg, etc).

✗ Pode ser usado para diversas tarefas, incluindo controlar a execução de um programa, colocar breakpoints, mudar o estado de variáveis ou fazer um dump da memória.

Page 316: Embedded Linux Slides

Embedded Labworks

DEBUG REMOTO

✗ Problema 1: os fontes estão na máquina de desenvolvimento e o binário está rodando na máquina alvo.

✗ Problema 2: A máquina-alvo não tem recursos para instalar o gdb completo e aplicações com símbolos de debugging.

✗ A solução: gdb client na máquina de desenvolvimento e gdb server na máquina alvo.

Page 317: Embedded Linux Slides

Embedded Labworks

ARQUITETURA GDB

Host Target

ConexãoSerial ou Ethernet

ARCH­linux­gdb gdbserver

Binários e bibliotecas com símbolos de

debugging

Binários e bibliotecassem símbolos de

debugging

Page 318: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Debugging com GDB

Page 319: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Desenvolvimento de aplicações

Page 320: Embedded Linux Slides

Embedded Labworks

DESENVOLVENDO APLICAÇÕES

✗ Um sistema Linux embarcado é um sistema Linux normal, apenas com um conjunto menor e mais enxuto de componentes.

✗ Em termos de desenvolvimento de aplicações, é o mesmo processo comparado ao desenvolvimento para desktop, o que inclusive facilita os testes.

✗ Você pode reusar aplicações e bibliotecas sem nenhuma adaptação na maioria das vezes.

✗ Mas sempre leve em conta a limitação de recursos do seu equipamento (capacidade de processamento, memória e armazenamento).

Page 321: Embedded Linux Slides

Embedded Labworks

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.

✗ C++ pode ser usada para o desenvolvimento de aplicações maiores. A biblioteca C++ precisa normalmente ser adicionada ao sistema.

✗ Java também é uma possibilidade, mas leve em consideração o consumo de recursos do dispositivo.

✗ Linguagens de script são muito úteis em determinadas tarefas, e ajudam em aumentar a velocidade do desenvolvimento, mas requerem um interpretador que também consome recursos de memória e processamento.

Page 322: Embedded Linux Slides

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 opções: Anjuta, Netbeans, vim, emacs, etc.

Page 323: Embedded Linux Slides

Embedded Labworks

CONTROLE DE VERSÃO

✗ CVS: Foi bastante popular, mas hoje não é mais usado em novos projetos.

✗ Subversion: Também chamado de SVN, criado como substituto do CVS, removendo diversas limitações e com melhor performance.

✗ Git: Sistema de controle de versão distribuído, permite ter cópias locais e remotas. Desenvolvido por uma equipe comandada por Linus e hoje é o padrão para novos projetos open source.

✗ Mercurial: Trabalha da mesma forma que o Git, e é uma opção para sistemas de controle de versão distribuídos.

Page 324: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Configurando e usando o Eclipse

Page 325: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

Ferramentas de análise

Page 326: Embedded Linux Slides

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/

✗ Atualmente, o Valgrind fornece ferramentas de análise de memória e profiling de aplicações.

✗ Um dos principais usos do Valgring é na análise de alocação dinâmica de memória e detecção de memory leak nas aplicações.

Page 327: Embedded Linux Slides

Embedded Labworks

APLICAÇÃO COM BUGint txData(char *data){    unsigned char *ptr = NULL, *buf = NULL;    int size = strlen(data);     if ((ptr = buf = (unsigned char*)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);     return 0;}

Page 328: Embedded Linux Slides

Embedded Labworks

TESTANDO COM VALGRINDvalgrind ./leak==3811== Memcheck, a memory error detector==3811== Copyright (C) 2002­2009, and GNU GPL, by Julian Seward et al.==3811== Using Valgrind­3.6.0.SVN­Debian and LibVEX; rerun with ­h for copyright info==3811== Command: ./leak==3811==Erro ao enviar mensagem!==3811====3811== HEAP SUMMARY:==3811==     in use at exit: 13 bytes in 1 blocks==3811==   total heap usage: 1 allocs, 0 frees, 13 bytes allocated==3811====3811== LEAK SUMMARY:==3811==    definitely lost: 13 bytes in 1 blocks==3811==    indirectly lost: 0 bytes in 0 blocks==3811==      possibly lost: 0 bytes in 0 blocks==3811==    still reachable: 0 bytes in 0 blocks==3811==         suppressed: 0 bytes in 0 blocks==3811== Rerun with ­­leak­check=full to see details of leaked memory==3811====3811== For counts of detected and suppressed errors, rerun with: ­v==3811== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 13 from 8)

Page 329: Embedded Linux Slides

Embedded Labworks

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.

✗ Disponível em sistemas GNU/Linux, e pode ser compilada para sua plataforma alvo.

Page 330: Embedded Linux Slides

Embedded Labworks

EXEMPLO STRACEstrace cat Makefileexecve("/bin/cat", ["cat", "Makefile"], [/* 38 vars */]) = 0brk(0)                                  = 0x98b4000access("/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)      = 3fstat64(3, {st_mode=S_IFREG|0644, st_size=111585, ...}) = 0mmap2(NULL, 111585, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f69000close(3)                                = 0access("/etc/ld.so.nohwcap", F_OK)      = ­1 ENOENT (No such file or directory)open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = 3fstat64(3, {st_mode=S_IFREG|0755, st_size=1442180, ...}) = 0mprotect(0xb7f62000, 4096, PROT_NONE)   = 0mmap2(0xb7f63000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15c) = 0xb7f63000mmap2(0xb7f66000, 9840, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, ­1, 0) = 0xb7f66000close(3)                                = 0...

Page 331: Embedded Linux Slides

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/

✗ Complementa o uso do strace, que não exibe as chamadas de biblioteca.

Page 332: Embedded Linux Slides

Embedded Labworks

EXEMPLO LTRACEltrace nedit index.htmlsscanf(0x8274af1, 0x8132618, 0x8248640, 0xbfaadfe8, 0) = 1sprintf("const 0", "const %d", 0)                = 7strcmp("startScan", "const 0")                   = 1strcmp("ScanDistance", "const 0")                = ­1strcmp("const 200", "const 0")                   = 1strcmp("$list_dialog_button", "const 0")         = ­1strcmp("$shell_cmd_status", "const 0")           = ­1strcmp("$read_status", "const 0")                = ­1strcmp("$search_end", "const 0")                 = ­1strcmp("$string_dialog_button", "const 0")       = ­1strcmp("$rangeset_list", "const 0")              = ­1strcmp("$calltip_ID", "const 0")                 = ­1...

Page 333: Embedded Linux Slides

Embedded Labworks

SUMÁRIO LTRACEltrace ­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

Page 334: Embedded Linux Slides

Embedded Labworks

LABORATÓRIO

Usando ferramentas de análise

Page 335: Embedded Linux Slides

Embedded Labworks

Desenvolvendo Sistemas Linux Embarcado

E agora?

Page 336: Embedded Linux Slides

Embedded Labworks

RECURSOS ONLINE

✗ Site do kernel Linux:http://www.kernel.org

✗ Linux kernel mailing list:http://www.tux.org/lkml

✗ Acompanhar as mudanças nas novas versões do kernel:http://wiki.kernelnewbies.org/LinuxChanges

✗ Notícias e novidades sobre o desenvolvimento do kernel:http://lwn.net

Page 337: Embedded Linux Slides

Embedded Labworks

RECURSOS ONLINE (cont.)

✗ Linux Foundation (notícias, blog e vídeos):http://linuxfoundation.org

✗ Free electrons (documentos e vídeos):http://free-electrons.com

✗ Revista eletrônica sobre Linux:http://www.linuxjournal.com/

✗ Notícias sobre Linux e software livre (brasileiro):http://br-linux.org

Page 338: Embedded Linux Slides

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

Page 339: Embedded Linux Slides

Embedded Labworks

LIVRO SOFTWARE LIVRE

The Cathedral & The BazaarEric S. Raymond

Page 340: Embedded Linux Slides

Embedded Labworks

LIVROS DESENVOLVIMENTO DE SOFTWARE

The art of UNIX ProgrammingEric S. Raymond

The Linux programming interfaceMichael Kerrisk

Page 341: Embedded Linux Slides

Embedded Labworks

LIVROS LINUX EMBARCADO

Building Embedded Linux SystemsKarim Yaghmour & others

Embedded Linux PrimerChristopher Hallinan

Page 342: Embedded Linux Slides

Embedded Labworks

LIVROS LINUX KERNEL

Linux Kernel DevelopmentRobert Love

Linux Kernel in a NutshellGreg Kroah-Hartman

Page 343: Embedded Linux Slides

Embedded Labworks

LIVROS LINUX DEVICE DRIVERS

Linux Device DriversJonathan Corbet & others

Essential Linux Device DriversSreekrishnan Venkateswaran

Page 344: Embedded Linux Slides

Embedded Labworks

Por Sergio Prado. São Paulo, Novembro de 2012® Copyright Embedded Labworks 2004-2013. All rights reserved.

OBRIGADO!

E-mail [email protected] http://e-labworks.com