Build Root
-
Upload
juliocv1502 -
Category
Documents
-
view
138 -
download
0
Transcript of Build Root
Seminrio Linux Embarcado 2011
Linux from Scratch com BuildrootSergio Prado Agosto/2011
Quem sou eu?
Mais de 14 anos de experincia em desenvolvimento de software para sistemas embarcados, em diversas arquiteturas de CPU (ARM, PPC, MIPS, x86, 68K), atuando em projetos com Linux embarcado e sistemas de tempo real. Scio da Embedded Labworks, onde atuo com consultoria e desenvolvimento de sistemas embarcados. Blog pessoal sobre Linux e Sistemas Embarcados em www.sergioprado.org.
Introduo
No blog: Sergio, eu estava comeando a estudar Linux embarcado, mas apareceu uma dvida, onde fica o main()?
Introduo
Linux e a revoluo do software livre
Liberdade Inovao
Comunidade
Colaborao
Flexibilidade
Introduo
Milhares de aplicaes de cdigo aberto disponveis!
Sugesto de Leitura: The Cathedral & The Bazaar Eric S. Raymond
Introduo
Criou-se uma situao onde temos centenas de milhares de pequenas solues procurando por um grande problema...
Introduo
E ento, para resolver os nossos grandes problemas, comeamos a usar Linux em dispositivos embarcados...
O desafio: integrar tudo isso
O desafio: integrar tudo isso
u-boot.bin
uImage
rootfs.jffs2
O desafio: integrar tudo isso
Soluo 1: Usar uma distribuio pronta
Debian, por exemplo, esta disponvel para diversas arquiteturas como x86, ARM, MIPS e PPC. Mas, e se no suportar sua plataforma? Mas, e se voc precisar customizar? Falta flexibilidade!
O desafio: integrar tudo isso
Soluo 2: Fazer tudo na unha
Fai fundo! E boa sorte! http://www.linuxfromscratch.org/
S no esquece de colocar uns 3 meses a mais no planejamento do seu projeto...
O desafio: integrar tudo isso
Soluo 3: Usar um sistema de build (buildsystem) Em 50 minutos, voc consegue gerar um sistema Linux completo!
O Sistema de Build
Atividades principais (pode depender da ferramenta)
Compilar e gerar o toolchain. Compilar e gerar a imagem do bootloader. Compilar e gerar a imagem do kernel. Compilar bibliotecas e aplicaes, resolver dependncias e gerar o sistema de arquivos (rootfs).
Conhecendo o Buildroot
http://www.buildroot.net
Desenvolvido pelos mantenedores da uClibc, e ficou durante um bom tempo sem nenhum mantenedor. Desde 2009, a partir da verso 2009.02, liberado a cada 3 meses.
Conhecendo o BuildrootImplementa um sistema automtico de build atravs de um conjunto de Makefiles:
Gera o toolchain. Gera a imagem do bootloader. Gera a imagem do kernel. Compila bibliotecas e aplicaes. Gera o rootfs.
Nosso projetoEmulando Atari com Linux embarcado
O kit mini2440FriendlyARM mini2440
ARM920T 400MHz 64MB RAM At 1G de Flash NAND USB, Ethernet, LCD Serial, E2PROM, etc
Nosso projetoDividiremos em 3 etapas:
1a. etapa: Sistema bsico com Linux embarcado. 2a. etapa: Adicionar o emulador Stella e suas dependncias. 3a. etapa: Ajustes no sistema de arquivos.
Iniciando com o BuildrootRequisitos
Toolchain (ARM, uClibc). Bootloader para a mini2440. Kernel para a mini2440. Rootfs com o emulador Stella.No boot, iniciar automaticamente o emulador. Emulador configurado de fbrica (joystick, ler ROMs do carto SD, etc).
1a. fase: Buildroot bsico
Baixar e descompactar o Buildroot em um diretrio de desenvolvimento:$wgethttp://buildroot.uclibc.org/downloads/buildroot2011.02.tar.bz2 $tarjxfvbuildroot2011.02.tar.bz2 $cdbuildroot2011.02/
1a. fase: Buildroot bsicoEstrutura bsica de diretrios
1a. fase: Buildroot bsicoComo configurar e compilar? $makemenuconfig $make
Parecido com o kernel do Linux. Pode-se usar tambm make xconfig ou make gconfig para configurar. Configurao salva em um arquivo .config no diretrio principal.
1a. fase: Buildroot bsico
1a. fase: Configurando a CPUO que iremos configurar aqui?
Informaremos ao buildroot que iremos compilar para uma CPU de arquitetura ARM920T.
1a. fase: Configurando a CPU
1a. fase: Configurando a CPU
1a. fase: ToolchainO que iremos configurar aqui?
Escolher a verso da biblioteca do sistema (o buildroot s suporta a uClibc). Escolher a verso do GCC. Escolher a verso e o local dos headers do kernel.
1a. fase: Toolchain1 2
3
1a. fase: Toolchain
1a. fase: Toolchain
1a. fase: Toolchain
1a. fase: BootloaderO que iremos configurar aqui?
Baixar e preparar o U-boot. Selecionar no Buildroot o bootloader U-Boot. Configurar informaes de compilao do U-boot.
1a. fase: BootloaderBaixar e preparar o U-Boot$gitclonegit://repo.or.cz/ubootopenmoko/mini2440.git $tarcjfvuboot.tar.bz2mini2440 $cpuboot.tar.bz2/dl
1a. fase: Bootloader
1a. fase: Bootloader2 1
3
1a. fase: KernelO que iremos configurar aqui?
Habilitar a gerao do kernel. Configurar a verso do kernel. Configurar o nome do arquivo de config do kernel. Configurar o formato da imagem a ser gerada. Baixar os fontes do kernel da mini2440.
1a. fase: Kernel1 2
3
1a. fase: Kernel
Baixar o kernel da mini2440 (linux-2.6.tar.bz2) e copiar para a pasta dl/ do buildroot.Baixar diretamente o tarball: http://www.sergioprado.org/wp-content/plugins/download-monitor/download.php?id=4 Baixar o repositrio git e gerar o tarball: https://github.com/sergioprado/Mini2440-Kernel
1a. fase: RootfsO que iremos configurar aqui?
Por enquanto, vamos manter habilitados os pacotes padro. Habilitar gerao do formato ext2 (facilita testes via NFS). Habilitar gerao do formato jffs2 e configurar informaes da memria flash.
1a. fase: Rootfs
1a. fase: Rootfs
1
2
1a. fase: Compilando
Salvar, sair e compilar: $make
E vai tomar um cafezinho!
1a. fase: 40 minutos depois$lsloutput/ total32 drwxrxrx33spradosprado40962011050923:42build drwxrxrx4spradosprado40962011050923:41host drwxrxrx2spradosprado40962011050923:42images lrwxrwxrwx1spradosprado1242011073011:04staging drwxrxrx2spradosprado40962011050923:18stamps drwxrxrx17spradosprado40962011050923:19target drwxrxrx10spradosprado40962011050923:11toolchain
1a. fase: ~45 minutos depois
$lsloutput/images/ total37340 rwrr1spradosprado157726722011080410:45rootfs.ext2 rwrr1spradosprado72066322011080410:47rootfs.jffs2 rwrr1spradosprado129331202011080410:47rootfs.tar rwxrxrx1spradosprado2489322011080410:33uboot.bin rwrr1spradosprado20682762011080410:44uImage
1a. fase: Gravando imagensOs procedimentos para gravar as imagens geradas dependem do seu hardware. Para o kit FriendlyARM mini2440, seguir este artigo: http://www.sergioprado.org/2010/08/30/mini2440linux-com-u-boot-e-emdebian/
2a. fase: Adicionando o StellaO que iremos fazer aqui?
Configurar o Buildroot com os pr-requisitos do Stella:
Linux 2.6 (OK!). Toolchain com GNU C++ (precisamos habilitar). SDL V1.2.10 ou maior (precisamos habilitar).
Adicionar o pacote do Stella no Buildroot.
2a. fase: Habilitando suporte C++
1
2a. fase: Habilitando suporte SDL1
2a. fase: Adicionando pacote Stella
Objetivo: uma opo para habilitar o Stela dever estar disponvel em:PackageSelectionforthetarget> Games> [*]stella
2a. fase: Adicionando pacote Stella
A configurao dos pacotes suportados pelo Buildroot ficam no diretrio packages, portanto criaremos um novo diretrio para o Stela em:$mkdirppackages/games/stella
2a. fase: Adicionando pacote Stella
Dentro deste diretrio precisamos ter pelo menos estes arquivos:
Config.in: Informaes do pacote stella.mk: Instrues para compilao
Alm destes, podemos criar arquivos que podero ser usados na compilao, como Makefiles e arquivos de patch.
2a. fase: Adicionando pacote Stella
#packages/games/stella/Config.in configBR2_PACKAGE_STELLA bool"stella" dependsonBR2_PACKAGE_SDL&&BR2_PACKAGE_LIBPNG help AmultiplataformAtari2600VCSemulator. http://stella.sourceforge.net/
2a. fase: Adicionando pacote Stella############################################################# # #packages/games/stella/stella.mk # ############################################################# STELLA_VERSION:=3.2.2 STELLA_SOURCE:=stella$(STELLA_VERSION)src.tar.gz STELLA_SITE:=http://downloads.sourceforge.net/project/stella/stella/ (STELLA_VERSION)/ STELLA_INSTALL_STAGING=YES STELLA_DEPENDENCIES=sdlsdl_imagesdl_soundzliblibpng STELLA_PKG_DIR:=../../../package/games/stella defineSTELLA_CONFIGURE_CMDS (cd$(@D);./configuredisablegldisabledebuggerdisablewindowed CXX="$(TARGET_CXX)"CXXFLAGS="$(TARGET_CXXFLAGS)") cp$(@D)/$(STELLA_PKG_DIR)/config.mak$(@D) patchp1d$(@D)0){ button=(sample.pressure>0)?1:0; button