Embedded Linux Slides

March 23, 2018 | Author: lcvalmeida | Category: Booting, Thread (Computing), Linux, Kernel (Operating System), Library (Computing)


Comments



Description

Desenvolvendo Sistemas Linux EmbarcadoEmbedded Labworks Por Sergio Prado. São Paulo, Novembro de 2012 ® Copyright Embedded Labworks 2004-2013. All rights reserved. Embedded Labworks SOBRE ESTE DOCUMENTO ✗ Este documento é baseado no material de treinamento disponibilizado pela Free Electrons em: http://free-electrons.com/doc/training/embedded-linux Este documento é disponibilizado sob a 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 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 ✗ ✗ 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. ✗ ✗ Embedded Labworks AMBIENTE DE LABORATÓRIO /opt/labs/ dl/ docs/ guides/   hardware/   training/   videos/ ex/ tools/ Ambiente de laboratório Aplicações e pacotes open­source Que serão usados durante as atividades de laboratório Documentação Guias de consulta (shell, vi, etc) Documentação do hardware Slides e atividades de laboratório. Vídeos Exercícios de laboratório Ferramentas de uso geral Embedded Labworks ORIENTAÇÕES GERAIS ✗ Pergunte... Expresse seu ponto de vista... Troque experiências... Ajude... Participe! ✗ ✗ ✗ ✗ Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Introdução à Linux embarcado . projeto GNU e o conceito de software livre. liderados por Ken Thompson e Dennis Ritchie. ✗ ✗ . nasce o sistema operacional GNU/Linux. 1991: Linus Torvalds. Começa o desenvolvimento do gcc. 1983: Richard Stallman.Embedded Labworks OS 3 MARCOS ✗ 1970: Engenheiros da Bell Labs. projeto do kernel Linux. um sistema operacional UNIX-like. gdb. Em conjunto com o projeto GNU. glibc e outras ferramentas importantes. criam o sistema operacional UNIX. ” . 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). This has been brewing since april. won't be big and professional like gnu) for 386(486) AT clones..Embedded Labworks Em 1991.. ”I'm doing a (free) operating system (just a hobby. Embedded Labworks 20 ANOS DEPOIS . Embedded Labworks VÍDEO (OS 20 ANOS DO LINUX) . etc) integram o kernel Linux. ✗ ✗ ✗ .Embedded Labworks O KERNEL ✗ Linux é o kernel! http://www. Linux embarcado é o uso do kernel Linux e de diversos componentes open-source em sistemas embarcados.kernel. Debian.org As distribuições Linux (Ubuntu. O correto é chamar estas distribuições de sistemas operacionais GNU/Linux. Fedora. Slackware. bibliotecas e aplicações. Embedded Labworks PRINCIPAIS CARACTERÍSTICAS ✗ Portabilidade para mais de 20 arquiteturas! Escalabilidade: o mesmo kernel roda em relógios. Roda em dispositivos com pouquíssimos recursos. ✗ ✗ ✗ . em celulares e em servidores da bolsa de valores! Livre de royalties. Modularidade: capaz de rodar apenas o que é necessário para seu projeto. Multicore: suporta múltiplas CPU.) ✗ Estabilidade: capaz de rodar por muito tempo sem precisar de um único reboot.Embedded Labworks PRINCIPAIS CARACTERÍSTICAS (cont. ✗ ✗ ✗ . Recursos ”infinitos” disponíveis na internet. core business. Foco no seu produto. Suporte à hardware. etc. bibliotecas gráficas. bluetooth.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. etc. protocolos de rede. Ex: Linux foi o primeiro kernel a suportar os padrões USB 2. USB 3.0.0. time-to-market! ✗ ✗ ✗ ✗ . criptografia. Desenvolvimento rápido baseado em componentes prontos. seu custo de software é zero! Seu único custo será a aquisição de know-how.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. Permite que você possa investir mais no hardware e em treinamento para sua equipe! ✗ ✗ . Não fica preso à prioridade que fornecedores ou terceiros darão ao seu projeto. Total controle do software do seu projeto! ✗ ✗ ✗ . melhorar. otimizar. debugar.Embedded Labworks CONTROLE TOTAL ✗ Trabalhando com software livre. você tem o código-fonte de todos os componentes do seu sistema. Liberdade para modificar. Normalmente a qualidade é bem melhor que a de softwares proprietários (muitas pessoas olhando o mesmo problema!). É claro.Embedded Labworks QUALIDADE ✗ Muitos componentes open source são usados em milhares de sistemas ao redor do mundo. Procure sempre aqueles mais usados em outros projetos e com uma comunidade mais ativa. Permite uma sólida base para seu projeto. ✗ ✗ ✗ . portanto tome cuidado. nem todo software open software é de boa qualidade. As comunidades podem te fornecer suporte de alta qualidade. Geralmente melhor que o suporte em empresas comerciais. Permite você resolver os problemas mais rapidamente! ✗ ✗ ✗ . mas você precisa saber como usar corretamente o suporte da comunidade. Você tem contato inclusive com os principais desenvolvedores dos projetos.Embedded Labworks SUPORTE DA COMUNIDADE ✗ Componentes open-source são desenvolvidos por uma comunidade de desenvolvedores e usuários. basta tomar alguns cuidados com licenças de software! . ✗ Linux não é grátis. Linux é livre! Do 2o.Embedded Labworks MITOS ✗ Mito 1: ”Linux is Free”. we are refering to freedom. not price”. parágrafo da GPL: ”When we speak of free software. ✗ Mito 2: ”Não consigo proteger a propriedade intelectual do meu produto”. ✗ Consegue sim. Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Arquitetura básica . Embedded Labworks ARQUITETURA BÁSICA Biblioteca Biblioteca Biblioteca Toolchain Biblioteca Biblioteca C Linux kernel Bootloader Hardware . exportando serviços para as aplicações do usuário. Gerencia CPU. . Rootfs: sistema de arquivos principal. carregamento e execução do kernel Linux. memória e I/O. Kernel Linux: Núcleo do sistema operacional. ✗ ✗ Toolchain: conjunto de ferramentas para gerar os binários do sistema.Embedded Labworks COMPONENTES DO SISTEMA ✗ Hardware: seu produto! Bootloader: iniciado pelo hardware. ✗ ✗ ✗ ✗ Biblioteca C: interface entre o kernel e as aplicações do usuário. responsável pela inicialização básica. Bibliotecas e aplicações do usuário. Embedded Labworks HARDWARE Biblioteca Biblioteca Biblioteca Toolchain Biblioteca Biblioteca C Linux kernel Bootloader Hardware . Embedded Labworks HARDWARE . ARM.uclinux. O projeto uClinux foi criado para que o Linux pudesse ser usado em CPUs sem MMU. PPC. H8/300 da Hitachi. Coldfire. http://www. 32/64 bits: não foi feito para microcontroladores! Originalmente projetado para CPUs com MMU (Memory Management Unit). ADI Blackfin. possibilitando o uso do Linux em diversas CPUs sem MMU (m68k e arm sem MMU. ✗ ✗ ✗ ✗ . SuperH. ia64. etc).org/ Mas boa parte do uClinux já foi integrado à árvore oficial do kernel. Blackfin. etc).Embedded Labworks CPU ✗ Suporta mais de 25 arquiteturas diferentes (x86. MIPS. ✗ .Embedded Labworks MEMÓRIA RAM ✗ Um sistema bem básico pode funcionar com até 8MB de RAM. Ideal para começar: 32MB. 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!).Embedded Labworks DISPOSITIVOS DE ARMAZENAMENTO ✗ Suporta armazenamento em memória flash NAND ou NOR. SDIO. IPv4. Já protocolos ou barramentos com restrições de licença tem dificuldade para entrar na árvore oficial do kernel (Ex: Zigbee). CAN. TCP. etc. Bluetooth. ✗ ✗ ✗ . é bem provável que esteja implementado no kernel. Se o barramento ou protocolo não possuir restrições de licença. UDP. CAN. etc. 1-wire. SPI.Embedded Labworks COMUNICAÇÃO ✗ O Linux suporta muitos barramentos comuns em sistemas embarcados: I2C. IPv6. E também os principais protocolos de rede: Ethernet. USB. Wi-Fi. 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! ✗ ✗ .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. Embedded Labworks TOOLCHAIN Biblioteca Biblioteca Biblioteca Toolchain Biblioteca Biblioteca C Linux kernel Bootloader Hardware . chamamos o toolchain de cross-compiling toolchain. seja um software ou mesmo um sistema completo. ✗ .Embedded Labworks TOOLCHAIN ✗ Conjunto de ferramentas de programação usadas para gerar determinado produto. Quando a plataforma de desenvolvimento (host) é diferente da plataforma alvo (target). Embedded Labworks TOOLCHAIN (cont.) Código-fonte Toolchain nativo Cross-compiling toolchain x86 Host Binário x86 x86 Binário ARM ARM Target . ✗ ✗ .Embedded Labworks COMPONENTES DO TOOLCHAIN ✗ Compilador (gcc). etc). uclibc. Standard C Library (glibc. dietlibc. Assembler e Linker (binutils). org/WorkingGroups/ToolChain ✗ ✗ .org/wiki/Toolchains Linaro (ARM): https://wiki.Embedded Labworks TOOLCHAINS PRONTOS ✗ Code Sourcery (ARM): http://www.linux-mips.com/gnu_toolchains/arm/ MIPS: http://www.linaro.codesourcery. org/ Buildroot: http://buildroot.org/ ✗ .Embedded Labworks FERRAMENTAS OPEN SOURCE ✗ Crosstool-ng: http://crosstool-ng.uclibc. Embedded Labworks SISTEMA LINUX EMBARCADO Biblioteca Biblioteca Biblioteca Toolchain Biblioteca Biblioteca C Linux kernel Bootloader Hardware . Embedded Labworks SISTEMA LINUX EMBARCADO (NA FLASH) Bootloader Kernel Rootfs Memória flash . Embedded Labworks BOOTLOADER Biblioteca Biblioteca Biblioteca Toolchain Biblioteca Biblioteca C Linux kernel Bootloader Hardware . ✗ . O bootloader é responsável por carregar e executar o kernel do sistema operacional (no nosso caso.Embedded Labworks BOOTLOADER ✗ Todo hardware possui um mecanismo de inicialização. que é responsável por carregar e executar o bootloader. o Linux). Passar parâmetros para o kernel. Prover mecanismos para carregar e gravar o kernel e o sistema de arquivos na memória flash. como por exemplo configurar a controladora de SDRAM. ✗ ✗ ✗ ✗ . Rotinas de diagnóstico de hardware. Inicializar via rede ou pelo cartão SD.Embedded Labworks FUNCIONALIDADES DO BOOTLOADER ✗ Inicializar o hardware antes de executar o kernel. MIPS. PPC e outras arquiteturas: ✗ U-Boot Barebox Redboot ✗ ✗ .Embedded Labworks PRINCIPAIS BOOTLOADERS ✗ x86: ✗ LILO Grub ✗ ✗ ARM. Embedded Labworks KERNEL Biblioteca Biblioteca Biblioteca Toolchain Biblioteca Biblioteca C Linux kernel Bootloader Hardware . Inicializa os device drivers.Embedded Labworks INICIALIZAÇÃO BÁSICA ✗ Inicializa CPU. Configura a memória virtual (se tiver MMU). Inicia threads do kernel. memória e barramentos. Monta sistema de arquivos principal (rootfs) e chama o processo init. ✗ ✗ ✗ ✗ ✗ . Inicia o escalonador de tarefas. Interface de user space com kernel space via chamadas do sistema (system calls). Acesso ao hardware via arquivos de dispositivo.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. Gerenciamento dinâmico dos módulos do kernel. Embedded Labworks EXEMPLO DE SYSTEM CALL . Embedded Labworks ROOTFS Biblioteca Biblioteca Biblioteca Toolchain Biblioteca Biblioteca C Linux kernel Bootloader Hardware . Mecanismo de inicialização. glibc.Embedded Labworks COMPONENTES BÁSICOS ✗ Biblioteca do sistema (uClibc. etc). ✗ ✗ . Bibliotecas e aplicações. eglibc. dietlibc. Embedded Labworks APLICAÇÕES PARA EMBARCADOS ✗ Dropbear: cliente e servidor SSH (~110K). SQLite: Banco de dados (~250KB). ✗ ✗ ✗ . Thttpd: servidor web (~88K).4MB). DirectFB: biblioteca gráfica (~1. ✗ ✗ . otimizado por tamanho. Geralmente as ferramentas são mais limitadas em termos de funcionalidades comparadas às originais.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. Embedded Labworks BUSYBOX – TUDO ISSO EM ~1MB! . Embedded Labworks SISTEMA LINUX “Desenvolver um sistema Linux embarcado é como brincar de Lego!” . compilar bibliotecas e aplicações. e gerar a imagem final do rootfs.Embedded Labworks BUILD SYSTEM ✗ Um build system é capaz de: ✗ Gerar o toolchain. compilar e gerar a imagem do kernel. ✗ ✗ ✗ . Compilar e gerar a imagem do bootloader. Configurar. Configurar. ✗ ✗ ✗ ✗ . Wind River. TimeSys. LTIB. ✗ ✗ ✗ Open source: ✗ Buildroot. PTXdist. OpenEmbedded. Yocto.Embedded Labworks ALGUNS BUILD SYSTEMS ✗ Proprietários: ✗ Monta Vista. Integrador: Integra todos os componentes (bootloader. etc. desenvolve os device drivers para os dispositivos de hardware usados no produto. Nosso foco neste treinamento: integrador e desenvolvedor de aplicações! ✗ ✗ .Embedded Labworks OS 3 PAPÉIS DO DESENVOLVEDOR ✗ Desenvolvedor de aplicações: desenvolve aplicações Linux. Desenvolvedor de BSP (Board Support Package): porta o kernel e o bootloader. bibliotecas e aplicações) em um sistema Linux embarcado. kernel. Embedded Labworks VAMOS COMEÇAR? . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Ambiente de desenvolvimento . ✗ ✗ .Embedded Labworks AMBIENTE DE DESENVOLVIMENTO ✗ Um ambiente de desenvolvimento para Linux embarcado é composto normalmente por 3 componentes principais: ✗ Toolchain (ferramentas de compilação). IDE para desenvolvimento e debugging de aplicações. Buildsystem (ferramenta de geração do sistema Linux). No nosso treinamento. migrar depois para outras soluções é bem mais fácil! ✗ ✗ .Embedded Labworks SOLUÇÕES ✗ Existem soluções prontas. usaremos soluções abertas! Aprendendo a base. completamente abertas e suportadas pela comunidade. Existem também soluções open source. Elas usam um conjunto de componentes open-source e proprietários. Wind River e TimeSys. fornecidas por empresas como MontaVista. com seu próprio ambiente e ferramentas de desenvolvimento. Você pode ter problemas em tentar rodar em outro sistema operacional. Usando Linux. você aprende Linux! ✗ ✗ . e provavelmente não terá suporte da comunidade.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. Embedded Labworks QUE DISTRIBUIÇÃO USAR? . kit de desenvolvimento. Ethernet. Target: hardware. ✗ ✗ Serial Host Ethernet Target . USB. produto. etc).Embedded Labworks HOST E TARGET ✗ Host: máquina de desenvolvimento. Conectados normalmente por uma conexão serial (RS232. Embedded Labworks NOSSA PRINCIPAL FERRAMENTA! . 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. ✗ ✗ Durante o treinamento. usaremos o comando sudo. para executar operações que necessitem de privilégios de administrador. Exemplo: $ sudo mount /dev/sdb1 /mnt/usb . Outros usuários não tem todos os mesmos privilégios de administração. bz2 (livro Linux Device Drivers 3ed). ldd3.pdf (canivete suíço do shell).tar.tar. canivete-shell. vi.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.gz (livro Linux Kernel in a Nutshell). shell. lkn. ✗ ✗ ✗ ✗ ✗ ✗ .pdf (guia do iniciante Ubuntu). Guia-Ubuntu.pdf (editor de textos vi).pdf (linha de comandos do shell).pdf (guia foca Linux iniciante/intermediário). Embedded Labworks LABORATÓRIO Estudando a linha de comandos . MX53 Quick Start Board .Embedded Labworks Desenvolvendo Sistemas Linux Embarcado i. MX53 QUICK START BOARD .Embedded Labworks i. UART.MX535 de 1GHz da Freescale (Cortex-A8).Embedded Labworks CARACTERÍSTICAS ✗ CPU i. Interfaces USB host/device. 1GB de memória RAM DDR3. leds. câmera e SDIO. e entrada para microfone. Conector para cartão SD/MMC. JTAG. display LCD. botões. Ethernet. etc. microSD e interface SATA. ✗ ✗ ✗ ✗ . Saídas de áudio estéreo e vídeo VGA. Conector de expansão com saídas HDMI. Embedded Labworks DIAGRAMA DE BLOCOS . com/imxquickstart http://community.com/community/imx .MX53 datasheet) BOARD_DS_IMX53.freescale.gz (Linux BSP) ✗ ✗ ✗ ✗ Recursos na internet: http://www.tar.pdf (user's guide) BSP_LINUX_mx53.pdf (i.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 (board reference) BOARD_UG_IMX53.freescale. Embedded Labworks CONECTANDO O HARDWARE . Embedded Labworks LABORATÓRIO Conectando e testando o hardware . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Toolchain . Cada uma destas etapas é executada por uma ferramenta (pré-processador. ✗ ✗ . Você se lembra do processo de compilação de um código em C? Ele envolve normalmente as seguintes etapas: pré-processamento.Embedded Labworks O QUE SÃO TOOLCHAINS? ✗ Ao pé da letra. e todas elas fazem parte do toolchain. montagem (assembler) e linkagem. compilador. é um conjunto de ferramentas de compilação. toolchain é uma "corrente de ferramentas". Na prática. compilação. e traduzindo literalmente. assembler e linker). etc. geralmente um x86. para esta tarefa. porque precisamos de bastante espaço em disco. Este toolchain roda na sua máquina e compila código para ser executado na sua máquina. capacidade de processamento. Portanto. que roda na sua plataforma de desenvolvimento mas gera código para a sua plataforma alvo. memória. Em desenvolvimento de sistemas embarcados normalmente é complicado (às vezes até impossível) usar um toolchain nativo. o melhor é usar um cross-compiling toolchain.Embedded Labworks TIPOS DE TOOLCHAIN ✗ As ferramentas de desenvolvimento normalmente disponíveis em um desktop GNU/Linux são chamadas de toolchain nativo. ✗ ✗ ✗ . ) Código-fonte Toolchain nativo Cross-compiling toolchain x86 Host Binário x86 x86 Binário ARM ARM Target .Embedded Labworks TIPOS DE TOOLCHAIN (cont. Embedded Labworks COMPONENTES DO TOOLCHAIN Compilador (GCC) Biblioteca C padrão Binutils Headers do kernel Debugger (GDB) Toolchain 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. ✗ ✗ 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. ✗ ✗ ✗ ✗ Embedded Labworks BIBLIOTECA C ✗ O que é a biblioteca C? ✗ Interface entre as aplicações e o kernel. API para desenvolvimento de aplicações. Aplicações Biblioteca C ✗ ✗ O toolchain depende da biblioteca C, já que ele irá linká-la com sua aplicação para gerar os binários para a arquitetura-alvo. Diversas bibliotecas C estão disponíveis: glibc, eglibc, uClibc, dietlibc, etc. Kernel ✗ 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. ✗ ✗ ✗ ✗ 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. ✗ ✗ ✗ ✗ ✗ Embedded Labworks COMPARANDO GLIBC E UCLIBC Comparação realizada em uma arquitetura ARM . <asm/. para compilar a biblioteca C. depende do kernel! Por que? ✗ ✗ Chamadas de sistema..>. ✗ .. Definições de constantes. o toolchain precisa dos arquivos de cabeçalho do kernel..> e alguns outros diretórios dentro do diretório include nos fontes do kernel. Disponíveis em <linux/.. Mas a biblioteca C. Estruturas de dados. ✗ ✗ ✗ Por isso. por sua vez.Embedded Labworks KERNEL HEADERS ✗ Sabemos que o toolchain depende da biblioteca C do sistema. .h>: #define __NR_exit                 1 #define __NR_fork                 2 #define __NR_read                 3 ✗ Definições de constantes em <asm­generic/fcntl.  [..         unsigned long  st_ino.h>: #define O_RDWR          00000002 ✗ Estruturas de dados em <asm/stat. .Embedded Labworks KERNEL HEADERS (EXEMPLOS) ✗ Números das chamadas de sistema em <asm/unistd.] }.h>: struct stat {         unsigned long  st_dev. Configurar e gerar seu próprio toolchain de acordo com suas necessidades.Embedded Labworks USANDO TOOLCHAINS ✗ Existem basicamente duas soluções para instalar e usar um toolchain: 1. fornecido por uma empresa ou pela comunidade. Usar um toolchain pronto. . 2. Desvantagem: inflexível. Toolchain fornecido pela comunidade (ex: Linaro). você não consegue otimizar o toolchain de acordo com suas necessidades. ✗ ✗ ✗ Uma referência bem completa de toolchains em: http://elinux.Embedded Labworks USANDO UM TOOLCHAIN PRONTO ✗ Solução adotada em muitos projetos: ✗ Vantagem: simples e conveniente.org/Toolchains . Toolchain fornecido por empresas especializadas (ex: Mentor Graphics). ✗ ✗ Possíveis escolhas: ✗ Toolchain fornecido pelo fabricante do chip (ex: Freescale). e permite diferenciar toolchains nativos de toolchains para cross-compilação.Embedded Labworks INSTALANDO E USANDO ✗ Basta seguir o procedimento do fornecedor da solução. Normalmente. 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. estes são os passos: ✗ ✗ Baixar e descompactar a toolchain em um diretório na sua máquina. . Embedded Labworks LABORATÓRIO Instalando e testando um toolchain pronto . headers do kernel. binutils. ✗ ✗ ✗ ✗ . etc. Precisa dos headers do kernel e dos fontes de todos os componentes. muito componentes para configurar e compilar. Precisa estar familiarizado com o gcc. Muitas decisões para serem feitas manualmente: versão da biblioteca C. Algumas plataformas necessitam que sejam aplicados patches em alguns componentes antes de compilar.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. Você não precisa se preocupar com o processo de geração do toolchain. patches. dependências. E por outro lado. etc.Embedded Labworks USANDO FERRAMENTAS ✗ Existem ferramentas que automatizam o processo de geração de toolchains. ✗ ✗ . estas ferramentas oferecem a flexibilidade de configuração e seleção dos componentes do toolchain e de suas versões. Embedded Labworks ALGUMAS FERRAMENTAS ✗ Crosstool (suporta apenas glibc): http://www.html OpenEmbedded (sistema de build completo): http://www.org/ Buildroot (sistema de build completo.openembedded. apenas uClibc): http://www.de/software/ptxdist/index_en.net PTXDist (suporta uClibc ou glibc): http://www.buildroot.com/crosstool Crosstool-ng (suporta glibc.kegel.org/ ✗ ✗ ✗ ✗ . uClibc. eglibc): http://crosstool-ng.pengutronix. Embedded Labworks LABORATÓRIO Compilando seu próprio toolchain com o crosstool-ng . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Bootloader . da rede ou de outro dispositivo de armazenamento não volátil para a RAM. ✗ ✗ ✗ Além destas funcionalidades básicas. a maioria dos bootloaders possui uma linha de comandos para a execução de diferentes operações. . Carregar outro binário (normalmente um sistema operacional) da memória flash.Embedded Labworks BOOTLOADERS ✗ O bootloader é o código responsável por: ✗ Inicialização básica do hardware. Passar o controle da CPU para este binário. como verificação de memória. formatação da flash e rotinas de diagnóstico. que faz a inicialização básica do hardware. entende sistemas de arquivo. O bootloader de 2o. Estágio 1 512 bytes do disco ✗ ✗ Estágio 2 do disco ✗ do disco SO . a BIOS. estágio. estágio é mais completo. que é o responsável por carregar um bootloader de 2o. Um programa na BIOS é executado no boot do equipamento. estágio do disco para a RAM. consegue ler o sistema operacional do disco e carregar para a memória.Embedded Labworks BOOTLOADERS NO X86 ✗ em ROM BIOS Plataformas x86 normalmente vem acompanhadas de uma memória não-volátil. Estes 512 bytes também são chamados de MBR. carrega para a memória e executa os primeiros 512 bytes do dispositivo de boot. A MBR é o bootloader de 1o. pendrive.org/ GRUB.org/ ✗ ✗ .syslinux. http://www. Grand Unified Bootloader.alioth.debian. é o mais poderoso e o padrão atualmente em desktops e servidores. já foi bastante utilizado. mais utilizado em boot pela rede e por mídias removíveis (floppy disk. etc). CD/DVD.gnu. http://www. http://lilo.org/software/grub/ Syslinux.) ✗ LILO. mas caiu em desuso.Embedded Labworks BOOTLOADERS NO X86 (cont. 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.Embedded Labworks BOOT EM CPUs EMBARCADAS ✗ Memória física Quando alimentada. 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. Execução começa aqui ✗ NOR flash ✗ RAM ✗ . O projeto de hardware deve garantir que a memória flash esteja com seu barramento de endereços ligados corretamente. 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 ✗ Execução começa aqui NOR flash ✗ ✗ . Por este motivo. precisamos de RAM. Mas como não conseguimos executar código diretamente de memórias flash NAND.Embedded Labworks BOOT EM CPUs EMBARCADAS (cont.) ✗ Memória física Neste caso. o Linux usa normalmente memórias flash NAND. o uso de flash NOR é inviável por ser muito mais cara. Mas como o Linux precisa de pelo menos alguns MBs de memória. como o código é executado direto da flash (XIP). o uso de memórias flash NOR é obrigatório. O bootloader de 2o. é muito comum termos um processo de boot dividido em 3 estágios: 1. responsável por carregar o bootloader de 1o. O bootloader de 1o. etc) e carregar um bootloader de 2o. 3. estágio carrega o sistema operacional (kernel Linux) para a RAM e executa. estágio de uma unidade de armazenamento não volátil para a memória RAM interna (SRAM ou IRAM). 2. DRAM. A CPU tem um código de boot integrado em uma ROM interna.Embedded Labworks BOOT EM LINUX EMBARCADO ✗ Em Linux embarcado. GPIOs. estágio para a RAM. e principalmente em plataformas ARM. . estágio deve inicializar o hardware (CPU. Roda da RAM. carregando o código para a SRAM (56KB).Embedded Labworks LPC3250 (NXP) ROM Code Tenta o boot pela porta serial (modo de serviço). Kickstart/S1L U-Boot Linux Kernel . USB. Kickstart roda da SRAM. Carrega a imagem do kernel na RAM e passa o controle para ele. barramento externo e flash NAND. Inicializa alguns dispositivos de hardware (rede. etc). O S1L carrega o bootloader de 2o. um bootloader completo que possui diversas funções para configurar o hardware. o bootloader não existe mais). Roda da RAM. Assume o controle do sistema (a partir daqui. inicializa hardware e carrega o stage 1 loader. estágio para a RAM. SPI. USB.Embedded Labworks i. Assume o controle do sistema (a partir daqui. SD/MMC. etc). como o “power_prep” (configura PM) e o “boot_prep” (configura a memória SDRAM e carrega o U-Boot). o bootloader não existe mais).MX28 é resetado. JTAG). NAND. Inicializa alguns dispositivos de hardware (rede. Carrega a imagem do kernel na RAM e passa o controle para ele. SPI. que são pequenos executáveis para extender o bootloader. um conjunto de bootlets. Lê as chaves de seleção do modo de boot para identificar a fonte do boot (USB. Roda da RAM.MX28 (FREESCALE) ROM Code Código de boot em ROM iniciado quando o i. O ROM code trabalha com o conceito de boot stream. I2C. Bootlets U-Boot Linux Kernel . Carrega “um pedaço” do U-Boot para a RAM interna (72K). etc) e carregar o U-Boot completo para a RAM. cartão SD/MMC. U-Boot (1) U-Boot (2) Linux Kernel . Assume o controle do sistema (a partir daqui. Carrega a imagem do kernel na RAM e passa o controle para ele.Embedded Labworks i. Roda da RAM. SDRAM. etc). etc).MX53 é resetado. Este código do U-Boot irá inicializar o hardware (clock. Lê o registrador BOOT_MODE ou um conjunto de GPIOs para determinar o dispositivo de boot (NOR/NAND.MX53 (FREESCALE) ROM Code Código de boot em ROM iniciado quando o i. USB. o bootloader não existe mais). Inicializa alguns dispositivos de hardware (rede. SATA. Inicializa alguns dispositivos de hardware (rede. estágio para a RAM. e carrega o bootloader de 2o. NAND ou MMC. Carrega a imagem do kernel na RAM e passa o controle para ele. Roda da SRAM. USB. Roda da RAM. USB e MMC. Assume o controle do sistema (a partir daqui. o bootloader não existe mais). Linux Kernel . e carrega para a SRAM (64KB). UART. etc). Inicializa a controladora da SDRAM.Embedded Labworks OMAP3530/AM35x (TI) ROM Code Procura por imagens de boot na NAND. Um botão pode mudar a ordem da busca. X-Loader U-Boot Roda da RAM. Carrega a imagem do kernel na RAM e passa o controle para ele. Roda da RAM. etc). Linux Kernel . USB. Inicializa alguns dispositivos de hardware (rede. Inicializa a controladora da DRAM e carrega o bootloader de 2o. estágio para a RAM.Embedded Labworks AT91 (ATMEL) ROM Code Procura por imagens de boot em diversos dispositivos de armazenamento. o bootloader não existe mais). Assume o controle do sistema (a partir daqui. e carrega para a SRAM (4KB). AT91Bootstrap U-Boot Roda da RAM. Roda da SRAM. e cada plataforma tem o seu.Embedded Labworks BOOTLOADERS EM LINUX EMBARCADO ✗ O bootloader de 1o.barebox. melhor código. desenvolvimento ativo. Nosso foco é no bootloader de 2o. mas ainda com pouco suporte à hardware. Dentre eles.denx. os dois mais conhecidos e utilizados são: ✗ ✗ U-Boot: bastante popular em ARM.org ✗ .de/wiki/U-Boot Barebox: sucessor do U-Boot. http://www. melhor projeto. estágio. estágio é normalmente fornecido pelo fabricante do chip. http://www. mas também usado em outras arquiteturas como MIPS e PPC. Existem alguns bootloaders open source. de/wiki/U-Boot/Documentation ✗ ✗ ✗ . Desde 2008. Coldfire. ARM. Documentação disponível em: http://www. segue um intervalo fixo de release. http://www. MIPS.de/wiki/U-Boot Suporta uma grande variedade de CPUs. x86.denx. incluindo PPC. onde a cada dois ou três meses uma versão é liberada (as versões são nomeadas com o formato YYYY.Embedded Labworks U-BOOT ✗ Bootloader open-source (GPLv2) mais utilizado atualmente.denx. etc.MM). Embedded Labworks FUNCIONALIDADES DO U-BOOT ✗ Exibir informações do hardware (memória. periféricos. apagar. escrever. etc). serial). Manipular a RAM (ler. Boot via memória flash. dhcp. escrever. etc). ✗ ✗ ✗ ✗ . comparar. Manipular memórias flash (ler. tftp. Boot via rede (bootp. testar. etc). Entende partições FAT. Executa código bare-metal. Etc! ✗ ✗ ✗ ✗ ✗ . Carrega e executa imagens do kernel Linux.Embedded Labworks FUNCIONALIDADES DO U-BOOT (cont.) ✗ Boot por interfaces SD/MMC ou USB. Configuração por variáveis de ambiente e suporte à scripts. 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).denx. ✗ ✗ ✗ . o fabricante irá disponibilizar os fontes em um outro local. Portanto. os fontes podem ser baixados no site do projeto em: http://www. Neste caso. consulte a documentação da sua plataforma para saber como e onde baixar os fontes do U-Boot. provavelmente no seu site junto com o BSP (Board Support Package) da plataforma.de/wiki/U-Boot Mas nem sempre o fabricante faz isso! Neste caso. Embedded Labworks CONFIGURANDO O U-BOOT ✗ O U-Boot suporta diversas arquiteturas e plataformas. 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.MX53 Quick Start Board: make mx53_loco_config . Antes de compilar o U-Boot. Por exemplo. para configurar o U-Boot para o kit de desenvolvimento i. No final. ou configurar o U-Boot para outra placa. 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. será gerada a imagem do u-boot para ser gravada no target. Se você quiser fazer uma compilação limpa.Embedded Labworks COMPILANDO O U-BOOT ✗ Para compilar o U-Boot. basta executar o comando make passando o prefixo do cross-compiler. execute antes o comando abaixo para fazer a limpeza: make mrproper ✗ ✗ . A CPU pode fornecer um monitor de boot que se comunica via serial ou USB. dependendo do target: ✗ O bootloader de 1o. JTAG. O sistema pode ser configurado para iniciar por uma mídia removível (Ex: cartão SD). estágio pode fornecer um mecanismo de escrita na flash.Embedded Labworks GRAVANDO O U-BOOT ✗ O processo de gravação do U-Boot pode ser feito de diferentes formas. Etc! ✗ ✗ ✗ ✗ . Embedded Labworks LABORATÓRIO Compilando e gravando o U-Boot . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Kernel Linux . Embedded Labworks VISÃO GERAL Aplicação Biblioteca Aplicação Biblioteca Biblioteca C Aplicação User space Chamadas de sistema Notificação de eventos Exportação de informações Kernel Gerenciamento do hardware Notificação de eventos Hardware . que requer bibliotecas e aplicações para prover funcionalidades aos usuários. ✗ ✗ ✗ . Criado em 1991 pelo estudante finlandês Linus Torvalds.Embedded Labworks HISTÓRICO ✗ O kernel é um dos componentes do sistema operacional. Atualmente. começou a ser usado rapidamente como sistema operacional em projetos de software livre. centenas de pessoas e empresas contribuem com o projeto. Linus Torvalds foi capaz de criar uma comunidade grande e dinâmica de desenvolvedores e usuários ao redor do projeto. Embedded Labworks COLABORAÇÃO . Embedded Labworks ARQUITETURA . o Linux escalona threads. que possui um identificador (PID) e esta associado à um conjunto de recursos como arquivos abertos. Cada thread possui um contador de programa. chamadas de threads. Um processo contém uma ou mais linhas de execução. e não processos. uma região do stack e uma cópia dos registradores da CPU. ✗ ✗ ✗ ✗ . Internamente. etc.Embedded Labworks GERENCIAMENTO DE PROCESSOS ✗ Um processo é um programa em execução. Uma thread nada mais é do que um processo que compartilha recursos com outras threads! Por este motivo. o Linux não diferencia processos e threads. mapeamento de memória. Embedded Labworks GERENCIAMENTO DE PROCESSOS (cont. onde cada classe possui um algoritmo de escalonamento. O escalonador padrão do Linux é o CFS (Completely Fair Scheduler). O Linux é um sistema multitasking preemptivo. Ele possui o conceito de classes de escalonador.) ✗ Trade-off entre capacidade de processamento e tempo de resposta (latência). quando e por quanto tempo. ✗ ✗ ✗ . que decide qual processo deve ser executado. onde cada processo recebe uma "porcentagem justa" da CPU (foco em performance). 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. Mas mesmo assim. Xenomai).Embedded Labworks GERENCIAMENTO DE PROCESSOS (cont. RTAI. 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. que tem prioridade sobre o CFS. ✗ ✗ ✗ .) ✗ Possui também um escalonador para processos de tempo real. 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. ✗ ✗ 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. ✗ ✗ ✗ ✗ Embedded Labworks SISTEMA DE ARQUIVO VIRTUAL ✗ O Linux é fortemente baseado em arquivos (quase tudo no sistema é representado por um arquivo). O kernel implementa a camada VFS (Virtual Filesystem) que abstrai o acesso aos arquivos, possibilitando que rotinas de acesso ao arquivo (open, read, write, close, etc) sejam mapeadas para diferentes destinos. ✗ Embedded Labworks SISTEMA DE ARQUIVO VIRTUAL (cont.) ✗ Exemplo 1: Mapeando um arquivo 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 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. ✗ ✗ 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. ✗ ✗ ✗ 2. ✗ ✗ A partir de 2003.1.0.4). ✗ .0. Em 2011. apenas uma árvore: 2.2. 2.5). 2.Embedded Labworks VERSIONAMENTO ✗ Antes da versão 2. 2.X. Uma árvore de versões de desenvolvimento (2.0.6: ✗ Uma árvore de versões estáveis (1.6.3. 2. a versão mudou para 3. Embedded Labworks CICLO DE RELEASE ✗ Processo de desenvolvimento a cada aproximadamente 3 meses.X-rc2.kernelnewbies. Para acompanhar as mudanças no kernel: http://wiki. Bug fixing: 6 a 10 semanas (3.X. 3.org/LinuxChanges http://lwn.X-rc1). ✗ ✗ Em aproximadamente 3 meses temos a liberação do release final 3.net ✗ .X-rc3. ✗ Merge window: 2 semanas (até sair 3. etc). kernel.tar.org/pub/scm/linux/kernel/git/torvalds/linux.kernel.org Baixando os fontes por http: wget http://www.bz2 tar xjfv linux­3.bz2 ✗ ✗ Baixando os fontes pelo git: git clone git://git.0/linux­3.tar.git .org/pub/linux/kernel/v3.6.6.kernel.Embedded Labworks FONTES DO KERNEL ✗ A versão oficial do código-fonte do kernel liberada por Linus Torvalds encontra-se em: http://www. ✗ . MIPS. Portanto.Embedded Labworks FONTES DO KERNEL (cont. ✗ ✗ Normalmente nestas versões alternativas são disponibilizados os patches para serem aplicados em uma determinada versão do kernel. consulte a documentação da sua plataforma para saber como e onde baixar os fontes do Linux. network). sub-sistemas (USB. PPC).) ✗ 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). sistemas de tempo-real. PCI. Comunidades podem manter versões do kernel voltadas à arquiteturas específicas (ARM. etc. 9: ✗ Tamanho total: 518MB ~38. suporte a diferentes arquiteturas e plataformas. O core do kernel é bem pequeno! ✗ .4.600 Arquivos ~15. diversos protocolos de rede.Embedded Labworks TAMANHO DOS FONTES DO KERNEL ✗ Fontes do kernel 3.400.000 linhas de código ✗ ✗ ✗ Porque os fontes são tão grandes? Milhares de drivers de dispositivo. 6.) Linux 2.39 .Embedded Labworks TAMANHO DOS FONTES DO KERNEL (cont. ✗ . sem restrições. 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.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. 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.Embedded Labworks LICENÇA (cont. É realmente útil manter um driver proprietário? ✗ ✗ . Sob um ponto de vista legal. Ex: Nvidia.) ✗ Portanto. é ilegal distribuir um binário do kernel com módulos compilados estaticamente. cada driver é provavelmente um caso diferente. Embedded Labworks VANTAGENS DE DRIVERS GPL ✗ Você não precisa escrever um driver do zero. e não se preocupar com qualquer alteração em APIs internas do Linux. Os usuários e a comunidade tem uma visão positiva da empresa. ✗ ✗ ✗ . podendo reusar o código de outros drivers. Você pode integrar o seu driver na árvore oficial do kernel. 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. Embedded Labworks LABORATÓRIO Baixando e estudando os fontes do kernel . O conjunto de opções que você irá habilitar depende: ✗ ✗ ✗ ✗ Do seu hardware (device drivers. Das funcionalidades (protocolos de rede. O processo de configuração serve para você configurar o kernel para ser compilado para sua CPU/plataforma. diversos protocolos de rede e muitos outros itens de configuração. milhares de opções estão disponíveis para serem habilitadas ou desabilitadas. etc).Embedded Labworks CONFIGURANDO O KERNEL ✗ O kernel possui centenas de drivers de dispositivo. etc). ✗ . O kernel é bem modular. sistemas de arquivo. Exemplo: CONFIG_ARM=y ✗ Dificilmente você vai precisar editar o arquivo . 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 .config no diretório principal dos fontes do kernel. e possuem o formato key=value.Embedded Labworks CONFIGURAÇÃO ✗ As configurações são salvas em um arquivo chamado .config manualmente. Embedded Labworks make xconfig . Embedded Labworks make gconfig . Embedded Labworks make nconfig . Embedded Labworks make menuconfig . ko). conforme a necessidade. Este módulo não é incluido na imagem final do kernel.Embedded Labworks CONFIGURANDO O KERNEL (cont.) ✗ O kernel é um binário único. Dinâmica ou módulo: é gerado um módulo daquela funcionalidade (arquivo com extensão . 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. resultado do processo de linkagem de todos os arquivos-objeto das funcionalidades que você habilitou. Ele é incluido no sistema de arquivos e pode ser carregado dinamicamente (em tempo de execução). incluindo os device drivers. ✗ . Ex: (iso8859­1) Default iocharset for FAT ✗ . Ex: (17) Kernel log buffer size Strings.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. ✗ . 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.Embedded Labworks DEPENDÊNCIAS ✗ Na configuração do kernel. você pode também definí-la como variável de ambiente ou alterar o arquivo Makefile do diretório principal do kernel. 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. Por padrão. . para configurar para ARM por exemplo.Embedded Labworks CONFIGURAÇÃO POR ARQUITETURA ✗ Toda a configuração do kernel é dependente da arquitetura. você precisa especificar a arquitetura: make ARCH=arm menuconfig ✗ Ao invés de passar a variável ARCH na chamada do make. pode criar uma cópia conforme exemplo abaixo: cp .Embedded Labworks CONFIGURAÇÕES PRÉ-DEFINIDAS ✗ Arquivos de configuração pré-definidos para diversas plataformas estão disponíveis em arch/<arch>/configs/.config arch/<arch>/configs/myconfig_defconfig . 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. O uso de arquivos pré-configurados é a forma padrão de configurar um kernel para uma plataforma específica. Por exemplo. config manualmente. Deve ser usado sempre que: ✗ ✗ Você alterar o arquivo .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. ✗ .config em diferentes versões do kernel. Você reutilizar o mesmo . Embedded Labworks LABORATÓRIO Configurando o kernel . Exemplo para o U-Boot: make ARCH=arm CROSS_COMPILE=arm­linux­ uImage . Se você quiser gerar uma imagem específica para determinado bootloader. deve adicionar ao fim do comando o nome da imagem.Embedded Labworks COMPILANDO O KERNEL ✗ Depois de configurado. Exemplo: make ARCH=arm CROSS_COMPILE=arm­linux­ ✗ ✗ O comando acima irá gerar uma imagem genérica para ARM. você precisa indicar a arquitetura e o prefixo do cross-compiler. para compilar nativamente basta executar: make ✗ Não precisa de previlégios de root! Para cross-compilar. bootável e descomprimida. zImage para ARM. que não é bootavel. serão geradas as seguintes imagens: ✗ vmlinux: gerada no diretório raiz dos fontes. mas pode ser usada para debugging. ✗ .) ✗ Ao fim do processo de compilação. etc).ko dentro dos respectivos diretórios dos drivers. uImage: imagem do kernel para o U-Boot (opcional). *Image: imagem bootável e comprimida do kernel (bzImage para x86. Módulos do kernel: arquivos com extensáo .Embedded Labworks COMPILANDO O KERNEL (cont. Em arch/<arch>/boot/: ✗ ✗ ✗ ✗ Image: imagem final do kernel. é a imagem do kernel no formato ELF. 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.Embedded Labworks INSTALANDO O KERNEL ✗ Para instalar o kernel. etc). memória flash. ✗ . normalmente gravamos o kernel em um dispositivo de armazenamento (cartão SD. arquivos-objeto. etc). make distclean . remove também arquivos de backup (bom para gerar patches).Embedded Labworks FAZENDO A LIMPEZA ✗ Remove todos os arquivos gerados (imagens. make mrproper ✗ Além dos arquivos gerados e arquivos de configuração. make clean ✗ Remove todos os arquivos de gerados e arquivos de configuração (usado quando pretende-se mudar de plataforma). Chamamos esses parâmetros de linha de comandos do kernel. Hardcoded configuração CONFIG_CMDLINE. .Embedded Labworks LINHA DE COMANDOS DO KERNEL ✗ Ao ser carregado. o kernel pode receber um conjunto de parâmetros. através da opção ✗ ✗ Esta linha de comandos é uma string com diversas opções no formato key=value. na do kernel. Esta linha de comandos pode ser passada ao kernel de duas formas: ✗ ✗ Pelo bootloader. 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 ✗ . Embedded Labworks LABORATÓRIO Compilando e testando o kernel . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Rootfs . aplicações e usuários enxergam apenas uma hierarquia única e global de arquivos e diretórios. em diretórios e arquivos disponíveis em dispositivos de armazenamento (locais ou remotos). Um ou mais sistemas de arquivo são montados em locais específicos nesta hierarquia de diretórios. de forma hierárquica. que podem ser compostos por diferentes sistemas de arquivo.Embedded Labworks SISTEMAS DE ARQUIVO ✗ Sistemas de arquivo são usados para organizar dados. ✗ ✗ . Em sistemas Unix. este diretório é chamado de ponto de montagem ou mount point.) ✗ Quando um sistema de arquivo é montado em um diretório.Embedded Labworks SISTEMAS DE ARQUIVO (cont. 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! ✗ ✗ . etc). ou local na rede. jffs2. onde estão armazenados os dados. mountpoint é o diretório onde os arquivos serão acessados.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. também chamado de ponto de montagem. device é o dispositivo de armazenamento. ext3. ✗ ✗ . 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. . e o umount garante que estas alterações sejam realizadas antes da remoção do dispositivo. já que o Linux por padrão mantém em cache as alterações realizadas no dispositivo para melhorar a performance. c picture.avi ✗ Desmontando o dispositivo USB: umount /mnt/usbkey .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/usbkey docs prog.png movie. não tem como fazê-lo com o comando mount. Este sistema de arquivo é chamado de root ou rootfs. Como ele é o primeiro sistema de arquivo a ser montado.Embedded Labworks SISTEMA DE ARQUIVO ROOT ✗ Um sistema de arquivo específico é montado na raiz principal da hierarquia. identificado pelo /. ✗ ✗ ✗ . o responsável por esta tarefa é o kernel. já que o mesmo ainda não esta disponível. de acordo com a opção root na linha de comandos do kernel. Lembre-se: ainda não existe nenhum sistema de arquivo montado! Por isso. 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.Embedded Labworks SISTEMA DE ARQUIVO ROOT (cont. console=ttyS2. ...) ✗ Se você não passar a opção root na linha de comando.0)  ✗ Passando a opção root para o kernel: .115200n8 root=/dev/sda2 ... Da partição de uma memória flash NAND. ✗ ✗ ✗ ✗ ✗ ✗ É nossa a decisão de como iniciar o sistema. pré-carregado pelo bootloader. Da partição de um cartão SD. Da memória. e assim configurar corretamente a opção root do kernel. através do protocolo NFS. Pela rede. Da partição de um pendrive. .Embedded Labworks LOCALIDADES DO ROOTFS ✗ O rootfs pode ser montado de diferentes localidades: ✗ Da partição de um HD. onde X é uma letra que indica o dispositivo e Y é o número da partição. ✗ Exemplo: root=/dev/mmcblk0p2 .Embedded Labworks MONTANDO O ROOTFS ✗ Partição de um HD ou pendrive USB: ✗ root=/dev/sdXY. onde X é um número de identificação do dispositivo. e Y é o número da partição. ✗ Exemplo: root=/dev/sdb2 ✗ Partição de um cartão SD ✗ root=/dev/mmcblkXpY. Embedded Labworks MONTANDO O ROOTFS (cont. ✗ Exemplo: root=/dev/mtdblock3 .) ✗ Partição de uma memória flash NAND: ✗ root=/dev/mtdblockX. onde X é o número da partição. ✗ . o rootfs pode estar na sua máquina de desenvolvimento.Embedded Labworks MONTANDO O ROOTFS VIA REDE ✗ Uma vez que sua rede esteja funcionando. podendo incluir ferramentas e binários que não caberiam na flash do equipamento. Possibilidade de ter um rootfs bem grande. Host Servidor NFS Target Cliente NFS ✗ Muito mais fácil e rápido de atualizar o rootfs sem precisar gravar na flash e reiniciar o equipamento. e ser exportado via protocolo NFS (Network File System). ✗ Kernel Initramfs (cpio archive) Imagem do kernel (uImage.Embedded Labworks MONTANDO O ROOTFS EM MEMÓRIA ✗ Também é possível ter uma imagem de rootfs integrada à imagem do kernel. etc) . Este mecanismo é chamado de initramfs. zImage. bzImage. sendo por consequência carregada em memória junto com o kernel. pode ser a solução para sistemas com pouquíssimos recursos. O boot é mais rápido. as aplicações também iniciam mais rapidamente. Em Linux embarcado. ✗ ✗ Desvantagens: ✗ Como o initramfs é montado em RAM.Embedded Labworks INITRAMFS ✗ Vantagens: ✗ Pode ser usado como um passo intermediário para montar o verdadeiro rootfs (mecanismo comum em desktops e servidores). . e como o sistema de arquivo já esta em memória. o armazenamento é volátil (perde as informações ao reiniciar). Facilita o trabalho de usuários e desenvolvedores quando precisam trabalhar com diferentes sistemas Linux.com/fhs/ A maioria dos sistemas Linux estão de acordo com este padrão porque: ✗ ✗ As aplicações esperam este formato.pathname. ✗ .Embedded Labworks ORGANIZAÇÃO DO ROOTFS ✗ A organização do rootfs no Linux é padronizada pelo Filesystem Hierarcy Standard. http://www. Embedded Labworks DIRETÓRIOS MAIS IMPORTANTES /bin /boot Programas básicos Imagem do kernel (apenas quando o  bootloader suporta carregar o kernel do sistema de arquivos. normalmente usado em arquiteturas x86) Arquivos de dispositivo Arquivos de configuração Diretório de arquivos dos usuários Bibliotecas básicas do sistema Ponto de montagem para mídias removíveis Ponto de montagem para mídias estáticas Ponto de montagem do sistema de arquivo  virtual ”proc” /dev /etc /home /lib /media /mnt /proc . Embedded Labworks DIRETÓRIOS MAIS IMPORTANTES (cont.) /root /sbin /sys /tmp /usr    /usr/bin    /usr/lib    /usr/sbin /var Home do usuário root Aplicações de administração do sistema Ponto de montagem do sistema de arquivo virtual sysfs Arquivos temporários Aplicações e dados dos usuários Aplicações básicas do usuário Bibliotecas do usuário Aplicações de administração do usuário  Arquivos de dados (logs, banco de dados, arquivos temporários, etc) 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. ✗ 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. ✗ Embedded Labworks EXEMPLOS ✗ Exemplos de arquivos de dispositivo: ls ­la /dev/ttyS* /dev/sda1 brw­rw­­­­ 1 root disk    8,  1 2012­01­25 06:54 /dev/sda1 crw­rw­­­­ 1 root dialout 4, 64 2012­01­25 06:54 /dev/ttyS0 crw­rw­­­­ 1 root dialout 4, 65 2012­01­25 06:54 /dev/ttyS1 crw­rw­­­­ 1 root dialout 4, 66 2012­01­25 06:54 /dev/ttyS2 crw­rw­­­­ 1 root dialout 4, 67 2012­01­25 06:54 /dev/ttyS3 ✗ Escrevendo ”Hello” na porta serial: int fd; fd = open(“/dev/ttyS0”, O_RDWR); write(fd, “Hello”, 5); close(fd); Embedded Labworks CRIANDO ARQUIVOS DE DISPOSITIVO ✗ Para sistemas mais simples, os arquivos de dispositivo podem ser criados manualmente com o comando mknod (é 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 ✗ ✗ 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. ✗ ✗ Embedded Labworks SISTEMA DE ARQUIVO VIRTUAL PROC (cont.txt .) ✗ Montando o proc: mount ­t proc none /proc ✗ Mais informações na documentação do kernel: Documentation/filesystems/proc. Ex: mdev.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. ✗ ✗ . etc. udev. Pode ser usado também para parametrizar ou configurar determinado hardware. Embedded Labworks SISTEMA DE ARQUIVO VIRTUAL SYSFS (cont.txt .) ✗ Montando o sysfs: mount ­t sysfs none /sys ✗ Mais informações na documentação do kernel: Documentation/filesystems/sysfs. Para isso. /bin/init. Você pode passar também o nome do programa de inicialização através do parâmetro init da linha de comandos do kernel. /etc/init e /bin/sh. o kernel tenta executar os binários /sbin/init. Exemplo: init=/usr/bin/init ✗ ✗ .Embedded Labworks A INICIALIZAÇÃO ✗ Após montar o rootfs. também chamado de processo init. o kernel irá tentar executar uma aplicação de inicialização. Embedded Labworks A INICIALIZAÇÃO (cont.) ✗ Se nenhuma destes programas de inicialização forem encontrados. o processo init é o responsável pela inicialização do restante do sistema. o kernel entra em pânico! Kernel panic ­ not syncing: No init found. ✗ Assim que executado. . Embedded Labworks VISÃO GERAL DO BOOT Bootloader Carrega o kernel para a RAM e inicia Kernel Monta o rootfs indicado por ”root=” Inicia a aplicação ”init” /sbin/init Inicia outros serviços e aplicações Shell Outras aplicações Rootfs . Embedded Labworks MECANISMOS DE INICIALIZAÇÃO ✗ Depois que o kernel chamou a aplicação init, é responsabilidade do rootfs o restante da inicialização do sistema. 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. ✗ ✗ 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/. ✗ ✗ Embedded Labworks /etc/inittab # Startup the system null::sysinit:/bin/mount ­t proc proc /proc null::sysinit:/bin/mkdir ­p /dev/pts # now run any rc scripts ::sysinit:/etc/init.d/rcS # Put a getty on the serial port ttySAC0::respawn:/sbin/getty ­L ttySAC0 115200 vt100 # Stuff to do for the 3­finger salute ::ctrlaltdel:/sbin/reboot # Stuff to do before rebooting null::shutdown:/usr/bin/killall syslogd Embedded Labworks /etc/init.d/rcS #!/bin/sh for i in /etc/init.d/S??*; do     case "$i" in         *.sh)             . $i          ;;         *)             $i start         ;;     esac done Embedded Labworks /etc/init.d/ ls ­l init.d/ total 8 ­rwxr­xr­x 1 root root  408 2011­08­31 08:44 rcS ­rwxr­xr­x 1 root root  478 2011­09­08 15:02 S01logging ­rwxr­xr­x 1 root root 1365 2011­08­31 08:44 S20urandom ­rwxr­xr­x 1 root root  282 2011­08­31 08:44 S40network ­rwxr­xr­x 1 root root 1092 2011­09­08 16:05 S50dropbear ­rwxr­xr­x 1 root root   73 2011­09­13 14:50 S60leds Embedded Labworks 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/ ✗ ✗ brctl. umount. sysctl. free. ln. linux64. dhcprelay. hdparm. depmod. pipe_progress. tee. start_stop_daemon. watch. unlzma. udhcpc. ar. top. pgrep. hostid. patch. du. seq. pivot_root. tcpsvd. syslogd. delgroup. login. devfsd. runlevel. mkfifo. mt. tar. true. netstat. clear. find. ipcs. ftpget. inotifyd. rdate. chown. killall5. crond. dumpleases. chgrp. cpio. showkey. pkill. swapoff. ipcalc. cryptpw. ping6. last. linuxrc. lpr. adjtimex. dumpkmap. who. sort. setsebool. cmp. wc. matchpathcon. rmdir. setarch. bzip2. loadkmap. cttyhack. pidof. md5sum. reset. fold. uuencode. fdisk. setconsole. chcon. load_policy. iptunnel. selinuxenabled. findfs. deluser. ifup. dirname. sv. bbsh. restorecon. reboot. runsvdir. rpm2cpio. install. pscan. fdformat. telnetd. expr. init. nc. sync. mv. setfont. uudecode. date. dc. hostname. cksum. rm. getty. touch. freeramdisk. getsebool. setenforce. tftp. chrt. zcip . sh. traceroute. awk. udhcpd. unzip. adduser. ipcrm. hwclock. tune2fs. xargs. gzip. cat. test. fsck_minix. chattr. less. fakeidentd. hexdump. addgroup. openvt. su. realpath. time. slattach. resize. ash. hush. df. deallocvt. sed. tail. printf. uniq. wget. nice. cp. mountpoint. chmod. insmod. envuidgid. svlogd. split. ls. rtcwake. logname. which. fbset. dos2unix. logread. setuidgid. dpkg. chat. fuser. mktemp. readahead. printenv.Embedded Labworks APLICAÇÕES DISPONÍVEIS NO BUSYBOX [. mkswap. dmesg. mkdir. fsck. sleep. gunzip. [[. vi. chroot. httpd. renice. logger. crontab. rx. unix2dos. eject. klogd. run_parts. dpkg_deb. ftpput. setlogcons. ifdown. id. chpasswd. inetd. fgrep. egrep. mkfs_minix. taskset. nohup. uptime. fbsplash. e2fsck. ifconfig. iproute. setfiles. readlink. lpq. mke2fs. stty. rpm. lsmod. basename. mount. linux32. passwd. setsid. sendmail. cut. losetup. od. setkeycodes. vconfig. mdev. tftpd. switch_root. ifenslave. fetchmail. more. nslookup. bzcat. ttysize. whoami. man. envdir. dnsd. sestatus. pwd. telnet. zcat. mesg. head. rdev. env. ps. fdflush. length. bbconfig. modprobe. chvt. arp. msh. route. kill. lzmacat. parse. dd. uname. poweroff. raidautorun. yes. arping. rmmod. catv. microcom. halt. watchdog. nameif. udpsvd. cal. ether_wake. vlock. runsv. ed. uncompress. lash. tr. sum. swapon. busybox. lpd. ipaddr. lsattr. mknod. killall. sulogin. usleep. runcon. unexpand. nmeter. grep. getopt. expand. script. bunzip2. tty. stat. sha1sum. softlimit. ping. diff. loadfont. chpst. tac. kbd_mode. readprofile. comm. echo. iplink. getenforce. makedevs. strings. ip. false. iprule. hd. Embedded Labworks LABORATÓRIO Gerando um rootfs simples e testando com NFS . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Kernel modules . e provê para as aplicações (userspace) uma interface de comunicação através de chamadas de sistema (system calls). etc! ✗ . com total acesso aos recursos da máquina (CPU. protocolos de rede. device drivers.Embedded Labworks KERNEL MONOLÍTICO E MICROKERNEL ✗ Kernel monolítico: o sistema operacional inteiro roda em kernel space. incluindo sistemas de arquivos. O resto roda em userspace. memória e I/Os). Microkernel: apenas o básico do kernel roda em userspace (gerenciamento de memória e processos). Embedded Labworks MONOLÍTICO X MICROKERNEL . ✗ ✗ ✗ . 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. com uma interface de comunicação bem definida. Cada funcionalidade é abstraída em um módulo. permite um sistema de configuração onde você pode adicionar ou remover determinada funcionalidade. Por isso. Mas internamente o Linux é bem modular.Embedded Labworks O KERNEL LINUX ✗ O Linux é um kernel monolítico. Cuidado: módulos rodam em kernel space.Embedded Labworks VANTAGENS DOS MÓDULOS ✗ Ajuda a manter a imagem do kernel bem pequena. Uma vez carregados. como por exemplo device drivers. Módulos tornam fácil o desenvolvimento do kernel. sem precisar reiniciar o equipamento. O tempo de boot fica menor: menos código para ser executado na inicialização do kernel. eles tem total controle do sistema! Por isso só podem ser carregados como root. ✗ ✗ ✗ . basta executar: make modules ✗ Para cross-compilar os módulos. Exemplo: make ARCH=arm CROSS_COMPILE=arm­linux­ modules .Embedded Labworks COMPILANDO OS MÓDULOS ✗ Para compilar apenas os módulos. não esqueça de indicar a arquitetura e o prefixo do cross-compiler. 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 ✗ . basta executar o comando abaixo: make modules_install ✗ No caso de um ambiente de compilação cruzada.Embedded Labworks INSTALANDO OS MÓDULOS ✗ Para instalar os módulos nativamente. Este arquivo é gerado quando você instala os módulos. que precisam ser carregados primeiro.dep . ✗ ✗ ✗ . As dependências entre os módulos estão descritas em /lib/modules/<kernel­version>/modules. Exemplo: o módulo usb_storage depende do módulo usbcore.Embedded Labworks DEPENDÊNCIAS DOS MÓDULOS ✗ Alguns módulos dependem de outros módulos. Deve-se passar apenas o nome do módulo.Embedded Labworks CARREGANDO UM MÓDULO ✗ O comando insmod carrega apenas um módulo. insmod <module_path>.ko e sem seu caminho completo. modprobe <module_name> . sem a extensão . É necessário passar o caminho completo do módulo.ko ✗ O comando modprobe carrega um módulo e todas as suas dependências. rmmod <module_name> ✗ O comando modprobe descarrega um módulo e todas as suas dependências (que não estão sendo usadas). sem a extensão . sem a extensão .ko e sem seu caminho completo.ko e sem seu caminho completo. Possível apenas se o módulo não estiver mais em uso. Deve-se passar apenas o nome do módulo.Embedded Labworks DESCARREGANDO UM MÓDULO ✗ O comando rmmod descarrega apenas um módulo. Deve-se passar apenas o nome do módulo. modprobe ­r <module_name> . ko e sem seu caminho completo. como sua descrição. sem a extensão . Deve-se passar apenas o nome do módulo. lsmod . parâmetros. licença e dependências.Embedded Labworks LISTANDO INFORMAÇÕES DOS MÓDULOS ✗ O comando modinfo lê informações de um módulo. modinfo <module_name> ✗ O comando lsmod lista todos os módulos carregados. configurar o parâmetro em /etc/modprobe.param=value .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>.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. Mensagens de log também são exibidas na console.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. Este log de mensagens pode ser exibido através do comando dmesg (diagnostic message). informações relevantes são enviadas ao log do kernel. instalando e carregando módulos .Embedded Labworks LABORATÓRIO Compilando. Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Sistemas de Arquivo . Economia de espaço em disco.Embedded Labworks SISTEMAS DE ARQUIVO ✗ Um sistema de arquivo é uma representação dos dados dentro de um dispositivo de armazenamento. JFFS2. ✗ ✗ ✗ . Segurança. EXT3. Mas por que existem diferentes sistemas de arquivo? ✗ ✗ ✗ Performance. NTFS. Exemplos de sistemas de arquivo: FAT. EXT2. Uso em diferentes tipos de dispositivo de armazenamento. dentro do kernel. Isso porque. vamos estudar estes dois sub-sistemas . Exemplo: flash NAND. separadamente. e ”virtualmente” não possuem limites de escrita. eles são manipulados por sub-sistemas diferentes: ✗ ✗ Dispositivos de bloco podem ser lidos ou escritos normalmente sem a necessidade de apagar antes.Embedded Labworks DISPOSITIVOS DE ARMAZENAMENTO ✗ No Linux. ✗ ✗ Por este motivo. os dispositivos de armazenamento são classificados em dois tipos: dispositivos de bloco e memórias flash. Exemplo: HD. Memórias flash trabalham em blocos e para serem escritas precisam ser apagadas antes. 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 . fazendo com que o sistema precise usar ferramentas de verificação de disco no próximo boot (fsck. E tudo começou com o tradicional sistema de arquivo ext2. ✗ ✗ .ext2). mas com um grande problema: pode deixar o sistema em um estado inconsistente após um crash ou um reboot não esperado. presente no Linux desde praticamente as primeiras versões.Embedded Labworks SISTEMAS DE ARQUIVO TRADICIONAIS ✗ Existem sistemas de arquivo específicos para dispositivos de bloco. É um sistema de arquivo bem estável. Embedded Labworks SISTEMAS DE ARQUIVO TRADICIONAIS (cont. ✗ . 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.) ✗ É o mesmo caso do vfat. Todas as alterações são salvas em um journal (uma espécie de log) antes de serem aplicadas no arquivo.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. Aplicação User space Kernel space Escreve uma entrada no journal Escreve no arquivo ✗ Escreve no arquivo Limpa entrada no journal . Os últimos dados salvos. ✗ Sim Executa journal Sistema de arquivo OK . o sistema de arquivo nunca fica em um estado inconsistente (corrompido). podem ser perdidos.Embedded Labworks JOURNALING (cont.) Reboot ✗ Não Descarta entradas incompletas no journal Journal vazio? Devido ao mecanismo de journaling. no entanto. mas ainda em estado experimental. Ele é basicamente o ext2 com a funcionalidade de journaling.Embedded Labworks SISTEMAS DE ARQUIVO COM JOURNALING ✗ O ext3 foi o padrão para sistemas de arquivo com journal durante um bom tempo. e é o sistema de arquivo padrão das distribuições Linux atuais. como por exemplo trabalhar com arquivos muito pequenos ou com carga de trabalho muito alta. O ext4 é a nova geração com muitas melhorias. incluindo reiserFS. ✗ ✗ ✗ . Já esta disponível na árvore oficial do kernel. O btrfs (também chamado de ”ButterFS”) é a próxima geração e visa substituir o ext4. JFS e XFS. Existem muitos outros sistemas de arquivo com journaling. que possuem aplicações específicas. Para dispositivos de bloco que usam memória flash (cartão SD/MMC.Embedded Labworks QUAL ESCOLHER? ✗ Na prática. ✗ ✗ ✗ . você pode querer desabilitar o journaling ou usar o ext2 para limitar a quantidade de escritas geradas pelo journal. o JFS e o XFS são usados normalmente em servidores. Você só usará o vfat e o ntfs se quiser manter interoperabilidade com sistemas Windows. você usará o ext3 ou o ext4 em dispositivos de bloco. e tem pouca aplicação em Linux embarcado. Sistemas de arquivo como o reiserFS. pendrive. etc). deixando o tamanho da imagem sistema de arquivo menor. boa parte dos sistemas de arquivo comprimidos são de apenas leitura. e ocupando menos espaço no dispositivo armazenamento. como o próprio nome diz. Por este motivo. de de do de ✗ Um sistema de arquivo comprimido. armazena os dados de forma comprimida no dispositivo de armazenamento.Embedded Labworks SISTEMAS DE ARQUIVO COMPRIMIDOS ✗ Sistemas embarcados possuem normalmente poucos recursos armazenamento. Como algoritmos para escrever de forma comprimida são bem mais complicados de implementar sem afetar a performance e a confiabilidade do sistema. você pode querer usar um sistema arquivo que comprima os dados. ✗ . 6. suportando arquivos de até 16M. ✗ ✗ . desenvolvido especialmente para sistemas embarcados ou dispositivos com baixa capacidade de armazenamento.Embedded Labworks CRAMFS ✗ O CramFS (Compressed ROM Filesystem) é um exemplo de sistema de arquivo comprimido de apenas leitura. e com tamanho máximo total da imagem de até 256MB.29). http://sourceforge.net/projects/cramfs/ Os dados são comprimidos com a biblioteca zlib. Você só vai precisar do CramFS se seu kernel for muito antigo (anterior à versão 2. http://squashfs.Embedded Labworks SQUASHFS ✗ O SquashFS é uma espécie de sucessor do CramFS. visando atingir os mesmos objetivos. ✗ ✗ ✗ . melhor performance de leitura e suporte à arquivos e sistemas maiores. mas com melhor compressão.org/Squash_Fs_Comparisons Muito usado em sistemas embarcados para partições que podem ser apenas de leitura (kernel. http://elinux.net Gera um sistema de arquivo em torno de 3 vezes menor que o ext3. Usado também em distribuições que rodam direto de um pendrive ou CD/DVD (Live CD).sourceforge. etc). binários. às vezes precisamos criar arquivos temporários. fazer log. etc. ✗ ✗ ✗ . Outro ponto é que estas informações são voláteis.Embedded Labworks SISTEMAS DE ARQUIVO VOLÁTEIS ✗ Quando trabalhamos com Linux embarcado. envolve operações de I/O e pode consumir a vida útil do dispositivo no caso de memórias flash. Fazer isso em um dispositivo de armazenamento pode ser muito custoso. ou seja. não tem mais utilidade após o boot. São nestes casos que usamos sistemas de arquivo voláteis. armazenar informações de processos em execução. você consegue manter um diretório do sistema montado em RAM. Mas é a solução perfeita para armazenar dados e arquivos temporários.Embedded Labworks SISTEMAS DE ARQUIVO VOLÁTEIS (cont. vai para a memória RAM! Consequentemente. O sistema de arquivo volátil padrão no Linux atualmente é o tmpfs. Ou seja. tudo o que você escrever neste diretório.) ✗ Com um sistema de arquivo volátil. ✗ ✗ . você irá perder estas informações no boot do equipamento. logs. Como usar: mount ­t tmpfs tmp /tmp ✗ ✗ ✗ Para mais informações. cresce e diminui automaticamente conforme o uso (configurável durante a montagem). etc).Embedded Labworks TMPFS ✗ O tmpfs é um sistema de arquivo útil para armazenar dados temporários em RAM (arquivos temporários. Não gasta muita RAM.txt . veja a documentação no kernel: Documentation/filesystems/tmpfs. Salva espaço. e por ser apenas leitura. fica protegido de alterações acidentais no sistema de arquivos.Embedded Labworks MISTURANDO TUDO ✗ Você pode dividir seu dispositivo de bloco em partições: ✗ Uma partição squashfs para o rootfs (kernel. ✗ ext3 dados e configuração Tmpfs dados voláteis ✗ RAM Dispositivo de Bloco squashfs rootfs comprimido . etc). Dados temporários em RAM com o tmpfs. Uma partição ext3 para leitura e escrita de dados do usuário e de configuração. binários. Embedded Labworks LABORATÓRIO Iniciando o rootfs de um dispositivo de bloco . todos os bits assumem tipicamente o valor 1. Estes blocos são chamados de erase blocks. Porém. Com um bloco apagado. se você escrever 0 em qualquer um dos bits de qualquer posição da flash. Quando você apaga um bloco da flash. você só consegue fazê-lo voltar para 1 apagando todo o bloco correspondente da flash! ✗ ✗ ✗ .Embedded Labworks MEMÓRIAS FLASH ✗ Algumas limitações diferem as memórias flash de dispositivos de bloco tradicionais como HDs. você pode escrever em qualquer posição da flash. As memórias flash só podem ser apagadas em blocos. e podem variar de algumas dezenas para algumas centenas de KB. Embedded Labworks MEMÓRIAS FLASH (cont.000 ciclos. e que pode ser implementada por software ou diretamente em chips controladores de flash. dependendo do modelo e do fabricante da flash. Esta limitação.000. Parece muito.) ✗ Outra limitação das memórias flash é a quantidade de vezes que você pode apagar e escrever nela (program/erase cycles). 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.000 e 1. ✗ ✗ . que minimiza o problema. pode variar entre 100. 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. ✗ ✗ ✗ . Quando sai de fábrica. depois de certo tempo de uso da flash. existe uma técnica chamada de BBM (Bad Block Management).Embedded Labworks MEMÓRIAS FLASH (cont. Por este motivo. um ou mais blocos serão inutilizados.) ✗ Mesmo assim. as memórias flash já possuem gravada nelas uma tabela de bad blocks. alto custo por MB. . baixo custo por MB. maior durabilidade. Usada para armazenar dados. Flash NAND: Acesso de leitura em blocos. ✗ ✗ É 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. Usada para armazenar código. baixa densidade. velocidade alta para leitura mas lenta para apagar e escrever.Embedded Labworks TIPOS DE MEMÓRIAS FLASH ✗ Além destas características especiais. substituir ROM. menor durabilidade. existem basicamente dois tipos de memória flash: ✗ Flash NOR: Acesso aleatório para leitura de dados (byte a byte). velocidade baixa para leitura mas alta para apagar e escrever. alta densidade. Embedded Labworks MTD (MEMORY TECHNOLOGY DEVICES) Interface com o sistema de arquivos MTD User modules ubifs Char device jffs2 Read-only block device yaffs2 Block device MTD Chip drivers NOR flash DiskOnChip flash RAM chips ROM chips Block device Virtual memory NAND flash Virtual devices 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. 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. ✗ ✗ . Mas cada sistema pode usar um ou mais MTD user modules.Embedded Labworks CAMADAS DO SUB-SISTEMA MTD ✗ A camada de baixo (MTD chip drivers) conversa diretamente com o hardware. quando usamos o pacote mtd-utils. normalmente chamado de /dev/mtdX. Com este módulo. ele disponibiliza comandos ioctl() para você poder manipular a flash (ler informações. você tem acesso sequencial (byte a byte) de toda a flash. ✗ ✗ ✗ . A principal utilidade deste módulo é no gerenciamento da flash. onde X é o número da partição.Embedded Labworks MTDCHAR ✗ O driver mtdchar implementa o módulo "char device" da flash. etc). Ele cria um dispositivo de caractere para cada partição de um dispositivo MTD no sistema. Além disso. apagar/gravar na flash. ✗ ✗ ✗ ✗ ✗ Para mais informações consulte o site do projeto: http://www.ubifs cria os respectivos sistemas de arquivo na flash.linux-mtd. flashcp escreve em memórias flash NOR.jffs2 e mkfs.org/ . flash_eraseall apaga todo o dispositivo. mkfs. nandwrite escreve um memórias flash NAND.infradead.Embedded Labworks MTD-UTILS ✗ O mtd-utils é um conjunto de ferramentas para manipular dispositivos MTD: ✗ mtdinfo retorna informações detalhadas do dispositivo. normalmente nomeado /dev/mtdblockX. incluindo bad blocks e wear leveling. Portanto. você vai precisar de um sistema de arquivo específico para flash. se você quiser um sistema de arquivo que trabalhe com todas as limitações da flash. onde X é o número da partição.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. mas não gerencia bad blocks e também não trabalha com wear leveling em escritas. como se fosse um HD mesmo. Este módulo permite acesso de leitura/escrita por bloco. ✗ ✗ ✗ . org/doc/jffs2.infradead.Embedded Labworks JFFS2 ✗ É um dos sistemas de arquivo para flash mais antigos ainda em utilização. Desvantagens: não escala muito bem em memórias flash com capacidades muito grandes. http://www.html Vantagens: compressão em tempo de execução (economiza espaço).linux-mtd. confiabilidade. ✗ ✗ ✗ . Habilitando no kernel a opção CONFIG_JFFS2_SUMMARY reduz drasticamente este tempo de montagem. O kernel precisa varrer todo o sistema de arquivo no momento da montagem. wear leveling e algoritmo ECC. net/ Vantagens: tempo de boot rápido.yaffs.Embedded Labworks YAFFS2 ✗ É um dos sucessores do JFFS2. confiabilidade. http://www. com o objetivo de corrigir os problemas de performance em memórias flash muito grandes. ✗ ✗ . Desvantagens: suporta apenas memórias flash NAND e não comprime os dados. wear leveling e algoritmo ECC. dos mesmos desenvolvedores do mtd-utils.Embedded Labworks UBIFS ✗ Evolução do jffs2.linux-mtd.org/doc/ubifs. http://www. Overhead de metadata em partições pequenas. deve se tornar nos próximos anos o sistema de arquivo padrão para dispositivos MTD. Mas com a capacidade das memórias flash aumentando cada vez mais.infradead. ✗ ✗ ✗ .27. disponível a partir do kernel 2.6.html Trabalha com volumes lógicos em cima de dispositivos MTD. ou use o squashfs. Não use a opção de montagem sync (atualização escreve imediatamente no sistema de arquivo). quando possível. Monte seu rootfs como apenas leitura.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). Use a opção de montagem noatime para evitar atualizar o sistema de arquivos toda vez que você acessa um arquivo. ✗ ✗ ✗ ✗ . Embedded Labworks ESCOLHENDO O SISTEMA DE ARQUIVO Dados Voláteis? Não Somente Leitura? Não Dispositivo Bloco Tem flash? Sim Sim MTD squashfs Sim ext2 (noatime) Não tmpfs ubifs ou jffs2 ext3 ou ext4 . Embedded Labworks LABORATÓRIO Iniciando o rootfs da memória flash . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Build system . Embedded Labworks O DESAFIO: INTEGRAR TUDO ISSO Biblioteca Biblioteca Biblioteca Toolchain Biblioteca Biblioteca C Linux kernel Bootloader Hardware . bin uImage rootfs.img .) u-boot.Embedded Labworks O DESAFIO: INTEGRAR TUDO ISSO (cont. Usar uma distribuição Linux pronta. ✗ ✗ . Usar um sistema de build (build system). temos normalmente duas possíveis soluções para trabalhar no desenvolvimento de sistemas com Linux embarcado: 1.Embedded Labworks INTEGRANDO TUDO ✗ O que vimos até aqui foi um passo-a-passo de como desenvolver um sistema Linux embarcado do zero. não precisamos desenvolver um sistema Linux manualmente. Portanto. 2. demorada e suscetível à erros. ja que é uma atividade trabalhosa. Na prática. etc. Timesys Linux. Facilidade na instalação de novos pacotes. Meego. Existem também diversas soluções abertas. Angstrom. Wind River Linux. Emdebian. incluindo Android. Vantagens: ✗ ✗ ✗ Simplicidade de uso. Ubuntu embedded. Framework de desenvolvimento pronto e funcional. Tizen. ✗ ✗ . etc.Embedded Labworks DISTRIBUIÇÃO PRONTA ✗ Existem diversas distribuições comerciais prontas para Linux embarcado: MontaVista. Difícil de levantar quais pacotes open source são usados. erros em pacotes da distribuição. ocupa muito espaço no dispositivo de armazenamento. Normalmente o rootfs é grande.) ✗ Desvantagens: ✗ Falta flexibilidade (compatibilidade com plataforma de hardware. ✗ ✗ ✗ ✗ . Tempo de boot normalmente alto. etc).Embedded Labworks DISTRIBUIÇÃO PRONTA (cont. framework de desenvolvimento disponível. mecanismo de inicialização. Requer customização para deixar o sistema mais leve. Embedded Labworks BUILD SYSTEM ✗ O build system permite gerar um sistema Linux completo do zero. ✗ ✗ ✗ . E facilita o trabalho de adicionar novos pacotes se necessário. as bibliotecas e as aplicações. o bootloader. incluindo o toolchain. Ele automatiza o processo de geração dos diversos componentes do sistema. Normalmente já contém um conjunto grande de pacotes configurados para serem habilitados e utilizados pelo seu sistema. o kernel. correção de problemas e adição de novas funcionalidades. facilitando o trabalho de recompilação. ✗ .Embedded Labworks BUILD SYSTEM (cont. ✗ ✗ Desvantagens: ✗ Tempo extra para configurar a ferramenta.) ✗ Vantagens: ✗ Flexibilidade. É 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. O processo de build torna-se reproduzível. html LTIB.net PTXdist.Embedded Labworks FERRAMENTAS ✗ Buildroot. desenvolvido principalmente pela Freescale: http://www. desenvolvido pela empresa Pengutronix: http://www.de/software/ptxdist/index_en.org/ ✗ ✗ .buildroot. desenvolvido pela comunidade: http://www.pengutronix.ltib. Embedded Labworks FERRAMENTAS (cont. Timesys). evolução do OpenEmbedded: http://www.) ✗ OpenEmbedded.org/ Sistemas comerciais (MontaVista. mais flexível (e também mais complexo): http://www.openembedded.yoctoproject. WindRiver.org Yocto. ✗ ✗ . Usa o sistema de pacotes RPM. Permite gerar imagens do bootloader. ✗ ✗ ✗ . e possui em torno de 200 aplicações/bibliotecas disponíveis. kernel e rootfs.Embedded Labworks LTIB ✗ LTIB (Linux Target Image Builder) é uma ferramenta usada para desenvolver e liberar BSPs (Board Support Packages). suporta gerar imagens para ARM. http://ltib. PPC e Coldfire.org/ Projeto inicialmente patrocionado pela Freescale. o bootloader. ✗ ✗ ✗ ✗ . Desde a versão 2009. Mais de 700 aplicações e bibliotecas integradas. Gtk. Gstreamer. Webkit. o kernel e o rootfs com muitas bibliotecas e aplicações disponíveis. etc.org. Possibilita gerar o toolchain. Qt. Ótima solução para projetos pequenos e médios. de utilitários básicos à bibliotecas mais elaboradas como X.02 um novo release é liberado a cada 3 meses.Embedded Labworks BUILDROOT ✗ Desenvolvido pelos mesmos mantenedores da uClibc. Kernel. etc).Embedded Labworks CONFIGURANDO O BUILDROOT ✗ Permite configurar. dentre outras opções: ✗ Arquitetura e modelo da CPU. Tipos das imagens do rootfs (ext2. jffs2. ✗ ✗ ✗ ✗ ✗ ✗ Para configurar: make menuconfig . Bootloader. Bibliotecas e aplicações. Toolchain. Embedded Labworks CONFIGURANDO O BUILDROOT . Para compilar: make  ✗ ✗ No final do processo de compilação.ext2  rootfs.jffs2  u­boot.config.Embedded Labworks COMPILANDO O BUILDROOT ✗ Configuração também fica armazenada em um arquivo . as imagens estarão disponíveis no diretório abaixo: ls output/images/ rootfs.bin  uImage . Embedded Labworks LABORATÓRIO Gerando um sistema Linux do zero com o Buildroot . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Bibliotecas e aplicações . Entretanto. compilar e integrar ao seu projeto. Você precisa encontrar e escolher o componente mais apropriado. ✗ ✗ ✗ . 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.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. o uso eficiente destes componentes nem sempre é fácil. Perguntar à comunidade (fóruns.org http://sourceforge.Embedded Labworks PROCURANDO COMPONENTES ✗ Procurar em sites que hospedam projetos de software livre: http://www.net http://directory.net http://code. listas de discussão. etc).com Pesquisar outros produtos com Linux embarcado. Pesquisar no Google ou em outros sites de busca.google.freshmeat. e identificar seus componentes. ✗ ✗ ✗ .fsf.com/hosting https://github. você precisa levar em consideração: ✗ Requisitos técnicos: o componente deve satisfazer os requisitos técnicos do seu projeto. Qualidade do componente: seu uso em diversos sistemas e uma comunidade ativa em geral significam uma qualidade relativamente boa. fórum movimentado. É importante ter a garantia de manutenção e suporte.Embedded Labworks ESCOLHENDO COMPONENTES ✗ Ao escolher um componente open source para seu projeto. Licença: a licença pode ser um impeditivo para o uso de determinado componente no seu produto. 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. Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Pacotes open source . Embedded Labworks LINGUAGENS DE SCRIPT ✗ Interpretadores das mais comuns linguagens de script estão disponíveis: ✗ Shell script Python Perl Lua Ruby TCL PHP ✗ ✗ ✗ ✗ ✗ ✗ . nano: ótimo editor para os iniciantes. ✗ ✗ .Embedded Labworks EDITORES DE TEXTO ✗ vi: editor de texto em Linux embarcado mais usado. uemacs: um emacs de tamanho reduzido. vsftpd: servidor SFTP. netsnmp: implementação do protocolo SNMP. openssl: biblioteca para conexões SLL e TLS.Embedded Labworks FERRAMENTAS DE REDE ✗ dropbear: implementação de um cliente e servidor SSH. iptables: ferramentas userspace para gerenciar o firewall. Bom para ter acesso remoto seguro e transferir arquivos. ✗ ✗ ✗ ✗ ✗ . dnsmasq: servidor DNS e DHCP. ✗ ✗ ✗ . Boa: servidor HTTP simples e rápido. com suporte à CGI e autenticação. Sem suporte à controle de acesso e SSL. Não suporta SSL. multiplexando o processamento de conexões simultâneas. rápido e seguro. com suporte à controle de acesso. CGI e SSL. thttpd: servidor HTTP simples. Sem suporte nativo à SSL. com suporte à CGI e autenticação. rápido e portável. ocupando apenas 9K de tamanho. lighttpd: servidor HTTP mais completo. Trabalha com apenas uma thread de execução. ótimo para gerenciar altas cargas.Embedded Labworks SERVIDORES WEB ✗ Busybox http server: servidor HTTP do Busybox. libsndfile. libmad. uma das mais usadas e famosas bibliotecas de áudio e vídeo da atualidade. FFmpeg: ferramenta completa para gravar. libogg.Embedded Labworks MULTIMEDIA ✗ Gstreamer: framework multimídia. Mplayer: player multimídia (usa a libavcodec). libvorbis. converter e tocar mídias. etc. ✗ ✗ ✗ ✗ . Alsalib: biblioteca associada com o sistema de som no Linux. permite codificar e decodificar diversos containers e formatos multimídia. Outras bibliotecas e codecs como flac. libtheora. speex. Suporta codecs de hardware através de plugins. Implementa a libavcodec. ✗ ✗ . ✗ É ”a escolha” de banco de dados em Linux embarcado. já que o SQLite é liberado sob domínio público. Pode ser usado como uma biblioteca normal. Pode ser até compilada estaticamente com uma aplicação proprietária.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. Bibliotecas de manipulação do hardware.Embedded Labworks OUTRAS BIBLIOTECAS ✗ Bibliotecas de compressão/descompressão. Etc! ✗ ✗ ✗ ✗ ✗ ✗ . Bibliotecas gráficas (veremos em detalhes mais adiante). Bibliotecas de rede. Bibliotecas para manipular arquivos XML. Bibliotecas de criptografia. Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Licenças . ✗ ✗ ✗ ✗ Veja o link abaixo para uma definição completa de software livre: http://www.html . Liberdade de modificar e distribuir cópias modificadas. Liberdade de estudar.gnu. Liberdade de copiar.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.org/philosophy/free-sw. ✗ ✗ Licenças non-copyleft não tem estes requisitos. ✗ ✗ Quando você modifica e distribui um software sob licença copyleft. e versões modificadas podem ser mantidas proprietárias. ✗ Mesma liberdade à novos usuários.Embedded Labworks LICENÇAS (cont. você precisa liberá-lo sob a mesma licença original. . Incentivo para você contribuir de volta à comunidade.) ✗ Licenças de software livre possuem basicamente duas categorias: ✗ Licenças copyleft. sendo necessário apenas manter a atribuição de autoria do projeto ao autor original. Licenças non-copyleft. o Linux. o Busybox e muitas aplicações. Cobre mais da metade dos projetos de software livre. Programas linkados com uma biblioteca GPL também precisam ser liberados sob a GPL. É uma licença copyleft: ✗ ✗ ✗ Trabalhos derivados precisam ser liberados sob a mesma licença. incluindo o U-Boot. ✗ .Embedded Labworks GPL ✗ GNU General Public Licence. Embedded Labworks GPL (cont.) ✗ Boa parte dos programas é coberta pela GPLv2. ✗ ✗ Principal diferença: o usuário deve ser capaz de rodar versões modificadas do programa no dispositivo. . Alguns programas estão migrando para a GPLv3. É uma licença copyleft: ✗ ✗ ✗ Trabalhos derivados precisam ser liberados sob a mesma licença. Cobre ~10% dos projetos de software livre. portanto. . Mas programas linkados com uma biblioteca LGPL não precisam ser liberados pela LGPL e podem ser mantidos proprietários. a linkagem precisa ser dinâmica. Entretanto.Embedded Labworks LGPL ✗ GNU Lesser General Public Licence. ✗ ✗ ✗ Licença usada nas maioria das bibliotecas. o usuário precisa ter a possibilidade de atualizar a biblioteca independentemente do programa. dentre elas: ✗ ✗ Apache Licence BSD Licence MIT Licence X11 Licence Artistic Licence ✗ ✗ ✗ ✗ . Existe uma grande família de licenças non-copyleft relativamente similares em suas características.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. 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.Embedded Labworks LICENÇAS (EXEMPLOS) ✗ Você modificou o Linux. o U-Boot ou outro software GPL: ✗ Você precisa liberar o software com as modificações realizadas sob a mesma licença. . o Busybox. 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.Embedded Labworks LICENÇAS (EXEMPLOS) ✗ Você criou uma aplicação que utiliza uma biblioteca LGPL: ✗ Você pode manter sua aplicação proprietária. Normalmente este arquivo é nomeado como LICENCE. ✗ ✗ . Um descritivo da licença utilizada no cabeçalho de cada arquivo-fonte do projeto.TXT. Uma cópia completa da licença utilizada no diretório principal dos fontes do projeto. 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.Embedded Labworks APLICANDO LICENÇAS ✗ Não existe uma regra única para aplicar licenças em software open source. O conteúdo deste descritivo depende da licença utilizada. já que cada licença possui sua própria “receita de bolo”. LICENCE. COPYRIGHT ou COPYING. De qualquer forma. Embedded Labworks LABORATÓRIO Identificando e analisando licenças open source . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Cross-compilando bibliotecas e aplicações . para compilar um pacote dentro do Buildroot. Por exemplo. você precisa: ✗ ✗ Toolchain. Conhecer o mecanismo de compilação do pacote. ✗ ✗ O processo de adaptação do pacote ao build system é dependente do build system utilizado. ✗ .Embedded Labworks COMO CROSS-COMPILAR? ✗ Basicamente. temos duas soluções: ✗ Adaptar o pacote ao seu build system. os procedimentos estão disponíveis no manual do Buildroot: http://buildroot.html Para compilar manualmente.uclibc. Compilar manualmente.org/downloads/manual/manual. podemos destacar: ✗ Makefile simples: é necessário ler e entender o que alterar para cross-compilar o componente. Dentre eles.Embedded Labworks MECANISMOS DE COMPILAÇÃO ✗ Todo software open-source possui um sistema de build ou mecanismo de compilação. Cmake: Mais novo e mais simples que o autotools. Autotools: um dos mais utilizados. ✗ ✗ ✗ . usado em projetos grandes como o KDE. iremos estudar em mais detalhes. Qmake: Criado pela Trolltech para ser usado no Qt. org/software/make/ Ele interpreta arquivos Makefile.Embedded Labworks MAKE ✗ O make é uma ferramenta bastante usada para compilar programas e bibliotecas. basta digitar o comando abaixo (considerando-se que você tenha um arquivo Makefile no diretório corrente): make ✗ ✗ . Para compilar um programa ou biblioteca baseado em makefiles.gnu. http://www. que contém os comandos a serem executados durante o processo de compilação. o teste .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 *. Embedded Labworks LABORATÓRIO Desenvolvendo uma aplicação baseada em Makefile . que contém um conjunto de ferramentas para auxiliar na compilação de uma aplicação ou biblioteca. Configurar a aplicação. Analisar e verificar se a plataforma possui os requisitos necessários para compilar o pacote (biblioteca ou aplicação).Embedded Labworks AUTOTOOLS ✗ Autotools é o nome dado ao sistema de build do projeto GNU. Ele tem basicamente os seguintes objetivos: ✗ ✗ Ser um sistema de build universal e multiplataforma. habilitando ou desabilitando funcionalidades antes da compilação. ✗ ✗ . normalmente usamos os comandos abaixo: ./configure make make install . 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.) ✗ O Autotools é composto pelas seguintes ferramentas: ✗ Autoconf: ferramenta responsável por gerar os scripts de configuração.Embedded Labworks AUTOTOOLS (cont. ✗ ✗ ✗ Para compilar um software baseado em autotools. AS. que deve estar apontando para o diretório onde se encontra o rootfs do seu sistema. você precisará indicar o nome das ferramentas de compilação do toolchain. CC. Você precisa indicar onde irá instalar o software usando a variável DESTDIR. você precisa indicar o host (onde irá executar o software) com a opção --host. LD. GCC. setando as variáveis de ambiente AR.Embedded Labworks CROSS-COMPILANDO COM AUTOTOOLS ✗ Para cross-compilar um software baseado em autotools. você precisará prestar atenção em alguns detalhes adicionais. CPP. Dependendo do pacote. CXX. ✗ ✗ ✗ . No script de configuração. /configure ­­host=arm­linux # compilando make # instalando make DESTDIR=/home/<user>/work/rootfs install .Embedded Labworks AUTOTOOLS (EXEMPLO) # configurando o toolchain export PATH=/usr/local/arm­linux/bin:$PATH export CC=arm­linux­gcc # configurando a aplicação . Embedded Labworks LABORATÓRIO Cross-compilando um software baseado em autotools . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Integrando componentes . Precisamos de um mecanismo para distribuir estas alterações. ✗ ✗ ✗ . Precisamos saber documentar as alterações realizadas em pacotes open-source. às vezes é necessário realizar algumas modificações para fazê-lo funcionar.Embedded Labworks INTEGRANDO COMPONENTES ✗ Na integração de componentes open source com seu projeto. corrigir algum bug. Como a comunidade de software livre é muito grande. porque quando atualizarmos este pacote para uma nova versão. será necessário aplicar as alterações realizadas no pacote original. e também para contribuir de volta com a comunidade. precisamos de uma linguagem comum. otimizar o uso de espaço em disco. etc. ou pode ser gerado manualmente através da ferramenta diff: diff ­rau prj­orig prj­alt > prj.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.patch ✗ ✗ . mercurial). Um patch pode ser gerado automaticamente por uma ferramenta de controle de versão (svn. git. 7 @@      exit(EXIT_FAILURE).Embedded Labworks EXEMPLO DE PATCH diff ­rau netcat/src/netcat. . #if 0    /* pure debugging code */    c = 0.c 2012­03­12 12:06:01.830816531  @@ ­445.c ­­­ netcat/src/netcat.c netcat2/src/netcat.7 +445.c  2011­10­01 12:03:55.  + printf("Linha adicionada\n").    } ­ debug_dv("Arguments parsing complete! Total").000000000  +++ netcat2/src/netcat. 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 < .patch ✗ ./prj. Embedded Labworks LABORATÓRIO Criando e aplicando patches . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Bibliotecas gráficas . Gtk) Aplicação User Aplicação Biblioteca (SDL.Embedded Labworks CAMADA DE VÍDEO NO LINUX Aplicação Aplicação Toolkit Gráfico (Qt. DirectFB) Toolkit Gráfico (Qt) Servidor Gráfico (X server) Framebuffer driver comum /dev/fbX Acesso direto à memória /dev/mem Kernel Framebuffer driver Controladora VGA Framebuffer driver Controladora LCD Hardware . Embedded Labworks CAMADA INPUT NO LINUX Aplicação Biblioteca gráfica Toolkit gráfico Servidor gráfico User Input event driver (/dev/input/eventX) Input core Input driver Input driver Input driver Input driver Input driver Kernel Serio USB HID SPI I2C GPIO Teclado ou mouse PS2 Teclado ou Mouse USB Controladora Touchscreen Acelerômetro Joystick Hardware . Usada basicamente para desenvolvimento de aplicações que desejam acessar diretamente o hardware.org Suporta aceleração de hardware 3D via OpenGL e acesso ao framebuffer para gráficos 2D. ✗ ✗ . joystick. mídia players.libsdl. mouse. etc. http://www. Exemplos: jogos. etc). etc) e saída (vídeo. áudio.Embedded Labworks SDL ✗ SDL (Simple Directmedia Layer) é uma biblioteca multimídia para acesso de baixo nível em dispositivos de entrada (teclado. Embedded Labworks JOGO CIVILIZATION USANDO SDL . ou como uma camada de baixo nível para bibliotecas gráficas de mais alto nível.directfb. etc. Manipula eventos de entrada como mouse. http://www.Embedded Labworks DIRECTFB ✗ Biblioteca de baixo nível para trabalhar com interface gráfica. joystick. teclado. Capacidade de trabalhar com aceleradores gráficos em diferentes hardwares.org Pode ser utilizada para desenvolvimento de UI em aplicações simples. ✗ ✗ ✗ . Embedded Labworks MEDIACENTER USANDO DIRECTFB . Suporte total ao protocolo X11. ✗ ✗ ✗ .ORG KDRIVE ✗ Kdrive (antes Tiny-X) é a implementação do servidor X para sistemas embarcados. etc).x.Embedded Labworks X. e permite o uso de qualquer aplicação ou biblioteca baseada no X11. EFL. Gtk. http://www. WxEmbedded.org Também trabalha diretamente sobre o framebuffer. O uso é feito normalmente com um Toolkit rodando por cima (Qt. Embedded Labworks DESKTOP USANDO KDRIVE . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Toolkits gráficos . ✗ ✗ ✗ . uma possibilidade é o Matchbox.org Pode usar o servidor X ou o DirectFB como backend gráfico. disponibilizando uma API baseada em widgets para o desenvolvimento de aplicações gráficas. Em desktop é comum o Gnome como sistema de janelas. Em sistemas embarcados.gtk.Embedded Labworks GTK ✗ Famoso toolkit usado no Gnome. Não inclui um sistema de janelas. http://www. Embedded Labworks EXEMPLOS DE USO DO GTK OpenMoko Maemo Interface proprietária . ✗ ✗ ✗ . thread. e fornece um framework completo de desenvolvimento para trabalhar com estrutura de dados. etc. networking.org/ Já inclui um sistema de janelas. Implementação em C++. também disponibilizando uma API baseada em widgets para o desenvolvimento de aplicações gráficas. Trabalha direto no framebuffer ou em cima do X11 ou DirectFB.Embedded Labworks Qt ✗ Famoso toolkit usado no KDE. http://qt-project. banco de dados. Embedded Labworks EXEMPLOS DE USO DO QT Express GPS OpenMoko Netflix Player . Embedded Labworks LABORATÓRIO Desenvolvendo uma aplicação em Qt . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Debugging . incluindo controlar a execução de um programa.gnu. DDD. http://www. Pode ser usado para diversas tarefas.Embedded Labworks GDB ✗ O GDB (GNU Debugger) é o debugger padrão do projeto GNU. ✗ ✗ . mudar o estado de variáveis ou fazer um dump da memória. Kdbg.org/software/gdb/ Interface via console. disponível para diversas arquiteturas. mas com frontends disponíveis (Eclipse. etc). GDB/Insight. colocar breakpoints. 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. ✗ ✗ .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. Embedded Labworks ARQUITETURA GDB Host ARCH­linux­gdb Conexão Serial ou Ethernet Binários e bibliotecas com símbolos de debugging Binários e bibliotecas sem símbolos de debugging Target gdbserver . Embedded Labworks LABORATÓRIO Debugging com GDB . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Desenvolvimento de aplicações . Mas sempre leve em conta a limitação de recursos do seu equipamento (capacidade de processamento. memória e armazenamento). apenas com um conjunto menor e mais enxuto de componentes. Você pode reusar aplicações e bibliotecas sem nenhuma adaptação na maioria das vezes. ✗ ✗ ✗ . Em termos de desenvolvimento de aplicações. o que inclusive facilita os testes.Embedded Labworks DESENVOLVENDO APLICAÇÕES ✗ Um sistema Linux embarcado é um sistema Linux normal. é o mesmo processo comparado ao desenvolvimento para desktop. C++ pode ser usada para o desenvolvimento de aplicações maiores. A biblioteca C padrão esta sempre presente em sistemas Linux. Linguagens de script são muito úteis em determinadas tarefas. Java também é uma possibilidade. mas requerem um interpretador que também consome recursos de memória e processamento. e ajudam em aumentar a velocidade do desenvolvimento.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++ precisa normalmente ser adicionada ao sistema. mas leve em consideração o consumo de recursos do dispositivo. ✗ ✗ ✗ . Ex: MontaVista DevRocket. ideal para desenvolver outras IDEs. etc. Kdevelop: uma IDE completa. Freescale Codewarrior. Diversas empresas de sistemas embarcados tem usado a plataforma Eclipse para desenvolver IDEs para seus produtos. Windriver Workbench. vim. etc. ✗ ✗ . C++ e Java. TimeSys TimeStorm. TI Code Composer. Roda nativamente. Suporta diversas linguagens incluindo C. Outras opções: Anjuta. Netbeans. Roda em cima de uma JVM.Embedded Labworks AMBIENTES DE DESENVOLVIMENTO ✗ Eclipse: Uma IDE completa baseada em plugins. emacs. mas hoje não é mais usado em novos projetos. Git: Sistema de controle de versão distribuído. ✗ ✗ ✗ . permite ter cópias locais e remotas. removendo diversas limitações e com melhor performance. e é uma opção para sistemas de controle de versão distribuídos. 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. Subversion: Também chamado de SVN.Embedded Labworks CONTROLE DE VERSÃO ✗ CVS: Foi bastante popular. criado como substituto do CVS. Embedded Labworks LABORATÓRIO Configurando e usando o Eclipse . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado Ferramentas de análise . http://valgrind.Embedded Labworks VALGRIND ✗ O Valgring é um framework de instrumentação para se criar ferramentas de análise dinâmica de aplicações. 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.org/ Atualmente. ✗ ✗ .  data.       if (txSerial(buf. *buf = NULL.     ptr += size.       *ptr++ = STX.     strncpy(ptr.       return 0. } .     *ptr++ = ETX. size + 3) == ­1)         return(­2).     int size = strlen(data).       if ((ptr = buf = (unsigned char*)malloc(size + 3)) == NULL)         return(­1).Embedded Labworks APLICAÇÃO COM BUG int txData(char *data) {     unsigned char *ptr = NULL.       free(buf). size).  and GNU GPL. a memory error detector ==3811== Copyright (C) 2002­2009.SVN­Debian and LibVEX. ==3811== Using Valgrind­3./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./leak ==3811== Memcheck.6. rerun with ­h for  copyright info ==3811== Command: . by Julian Seward et al.0. rerun with: ­v ==3811== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 13 from 8) . 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. 0 frees.Embedded Labworks TESTANDO COM VALGRIND valgrind . Disponível em sistemas GNU/Linux.net/projects/strace/ Bastante útil para debugar uma aplicação que fecha sem exibir nenhuma mensagem de erro. http://sourceforge.Embedded Labworks STRACE ✗ O strace (system calls tracer) permite capturar todas as chamadas de sistema realizadas pela sua aplicação. e pode ser compilada para sua plataforma alvo. ou então para fazer engenharia reversa em uma aplicação a qual você tenha somente o binário. ✗ ✗ .  st_size=111585.so.. . 12288. . 3. 3. 0x15c) = 0xb7f63000 mmap2(0xb7f66000.  MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE. O_RDONLY)      = 3 fstat64(3. PROT_READ|PROT_WRITE. PROT_NONE)   = 0 mmap2(0xb7f63000. st_size=1442180.cache". F_OK)      = ­1 ENOENT (No such file or directory) mmap2(NULL..preload". R_OK)      = ­1 ENOENT (No such file or directory) open("/etc/ld. 8192.}) = 0 mprotect(0xb7f62000. O_RDONLY) = 3 fstat64(3. ­1.nohwcap". ["cat". 0) = 0xb7f66000 close(3)                                = 0 . 9840.so. 0) =  access("/etc/ld. {st_mode=S_IFREG|0755. [/* 38 vars */]) = 0 brk(0)                                  = 0x98b4000 access("/etc/ld.so.  MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS. PROT_READ. 0) = 0xb7f69000 close(3)                                = 0 access("/etc/ld.. 111585.Embedded Labworks EXEMPLO STRACE strace cat Makefile execve("/bin/cat".. ­1.so.6".so. . 4096. MAP_PRIVATE. PROT_READ|PROT_WRITE. F_OK)      = ­1 ENOENT (No such file or directory) open("/lib/tls/i686/cmov/libc.}) = 0 mmap2(NULL.. PROT_READ|PROT_WRITE.. {st_mode=S_IFREG|0644.nohwcap". "Makefile"]. MAP_PRIVATE|MAP_ANONYMOUS. http://freshmeat. ✗ .Embedded Labworks LTRACE ✗ O ltrace (library calls tracer) permite capturar todas as chamadas de bibliotecas realizadas e sinais recebidos pela sua aplicação.net/projects/ltrace/ Complementa o uso do strace. que não exibe as chamadas de biblioteca.  "const 0")                   = 1 strcmp("$list_dialog_button". 0x8248640. 0)                = 7 strcmp("startScan". .Embedded Labworks EXEMPLO LTRACE ltrace nedit index. "const 0")                   = 1 strcmp("ScanDistance". "const 0")           = ­1 strcmp("$read_status". "const 0")         = ­1 strcmp("$shell_cmd_status". "const 0")              = ­1 strcmp("$calltip_ID". "const 0")                = ­1 strcmp("$search_end".html sscanf(0x8274af1... "const 0")                = ­1 strcmp("const 200". 0) = 1 sprintf("const 0". "const 0")                 = ­1 . 0xbfaadfe8. 0x8132618. "const 0")                 = ­1 strcmp("$string_dialog_button". "const %d". "const 0")       = ­1 strcmp("$rangeset_list". 000158         158         1 open   4..000306         153         2 read   7.92    0.000129          64         2 fileno   3.31    0.conf  % time     seconds  usecs/call     calls      function ­­­­­­ ­­­­­­­­­­­ ­­­­­­­­­­­ ­­­­­­­­­ ­­­­­­­­­­­­­­­­­­­­  22.56    0.000128          64         2 __fpending .39    0.000246          61         4 __freading   6.000275         137         2 __fxstat   6.000141         141         1 posix_fadvise   3.000281         281         1 write   7.84    0.51    0.65    0. ­­­­­­ ­­­­­­­­­­­ ­­­­­­­­­­­ ­­­­­­­­­ ­­­­­­­­­­­­­­­­­­­­ 100.00    0.10    0.06    0.Embedded Labworks SUMÁRIO LTRACE ltrace ­c cat /etc/resolv.000146         146         1 close   3.000227         113         2 fclose   4.003597                    29 total .000795         795         1 setlocale   8..59    0.81    0. Embedded Labworks LABORATÓRIO Usando ferramentas de análise . Embedded Labworks Desenvolvendo Sistemas Linux Embarcado E agora? . Embedded Labworks RECURSOS ONLINE ✗ Site do kernel Linux: http://www.kernel.tux.net ✗ ✗ ✗ .org Linux kernel mailing list: http://www.kernelnewbies.org/lkml Acompanhar as mudanças nas novas versões do kernel: http://wiki.org/LinuxChanges Notícias e novidades sobre o desenvolvimento do kernel: http://lwn. org Free electrons (documentos e vídeos): http://free-electrons.linuxjournal.com/ Notícias sobre Linux e software livre (brasileiro): http://br-linux.Embedded Labworks RECURSOS ONLINE (cont. blog e vídeos): http://linuxfoundation.org ✗ ✗ ✗ .com Revista eletrônica sobre Linux: http://www.) ✗ Linux Foundation (notícias. google.com.com/group/sis_embarcados Blog do Sergio Prado: http://sergioprado.Embedded Labworks RECURSOS ONLINE (cont.org ✗ ✗ .) ✗ Portal Embarcados: http://embarcados.br Grupo sis_embarcados: https://groups. Raymond .Embedded Labworks LIVRO SOFTWARE LIVRE The Cathedral & The Bazaar Eric S. Embedded Labworks LIVROS DESENVOLVIMENTO DE SOFTWARE The Linux programming interface Michael Kerrisk The art of UNIX Programming Eric S. Raymond . Embedded Labworks LIVROS LINUX EMBARCADO Embedded Linux Primer Christopher Hallinan Building Embedded Linux Systems Karim Yaghmour & others . Embedded Labworks LIVROS LINUX KERNEL Linux Kernel in a Nutshell Greg Kroah-Hartman Linux Kernel Development Robert Love . Embedded Labworks LIVROS LINUX DEVICE DRIVERS Essential Linux Device Drivers Sreekrishnan Venkateswaran Linux Device Drivers Jonathan Corbet & others . prado@e-labworks. Novembro de 2012 ® Copyright Embedded Labworks 2004-2013.com Embedded Labworks Por Sergio Prado.com http://e-labworks. São Paulo. All rights reserved. .OBRIGADO! E-mail Website sergio. Documents Similar To Embedded Linux SlidesSkip carouselcarousel previouscarousel nextMemória RAMTutorial BuildrootLinux Para Iniciantes2 Java Switch ForGrub ManualmenteComandos LinuxAula 05 - Parte I - Informática - Patrícia Lima Quintão.pdfTransparencia1-LinuxFundamentosLDD_02Linux FacilModulosRela to Riot Ps 2017Manual Medidor Eletrônico de Energia ElétricaRUNLEVEL 101.3Organizar Drivers BootProva3 Analista Tecnologia Informacao Gabarito 1-Sefaz-ce-20070129SISTEMAS DISTRIBUÍDOS.pdfRode o Windows Direto Do Seu Pen DriveLinux AvançadoManual Para Utilizar o Avira RescueMemoria_Aula_03_LABlistaexercicios1Como Recuperar o Boot Do Windows 7Inflpicprogram-130305100715-phpapp02Connect WINDOWSAula LP 06 ConstrutoresGuia de Comandos Linux de a-Z1pcomdliConfigurações do UbuntuMore From lcvalmeidaSkip carouselcarousel previouscarousel nextLDD_02.pdfLinux From Scratch Com Buildroot SemLinuxEmb2011Linux Booting StepsCM SAMA5D35 OverviewIntroduction+to+PcDuinoRover+ +a+WiFi+Video+Surveillance+Remote+Robot++Powered+by+PcDuinoDue PinoutI2C TutorialKath ReinLABS Intro Embedded LinuxSystemd Repensando a Inicializacao SemLinuxEmb2011Build RootKernelARQUITETURA DE MICROCONTROLADORES.pptSeminario Opcoes de ForexGSM_UMTSArduino Mega SchematicMatlabProg_Cap99227795-Redes-GSMFO1-Campos Electricosl Embedded Distro PDFNetwork and Rf Planning11-IndutânciaProg_Cap55Surpass Hit 7035FIFA-FTFB_V_1.0Footer MenuBack To TopAboutAbout ScribdPressOur blogJoin our team!Contact UsJoin todayInvite FriendsGiftsLegalTermsPrivacyCopyrightSupportHelp / FAQAccessibilityPurchase helpAdChoicesPublishersSocial MediaCopyright © 2018 Scribd Inc. .Browse Books.Site Directory.Site Language: English中文EspañolالعربيةPortuguês日本語DeutschFrançaisTurkceРусский языкTiếng việtJęzyk polskiBahasa indonesiaSign up to vote on this titleUsefulNot usefulYou're Reading a Free PreviewDownloadClose DialogAre you sure?This action might not be possible to undo. Are you sure you want to continue?CANCELOK
Copyright © 2024 DOKUMEN.SITE Inc.