Laboratório 2 Sistemas embarcados Período 2010.2 1 Saulo O. D. Luiz Roteiro • Inicialização • Sistema de arquivos raiz 2 Saulo O. D. Luiz Inicialização • Os programas responsáveis pela inicialização do núcleo são os bootloaders. • Dentre eles pode-se destacar: – GRUB(x86), LILO(x86), RedBoot(x86, ARM, PowerPC, MIPS e m68k) e U-Boot(x86, ARM e PowerPC). • U-Boot – É o melhor bootloader para ARM(suporte a um maior número de plataformas baseadas no ARM). – Projeto U-boot: http://sourceforge.net/projects/uboot 3 Saulo O. D. Luiz Compilando o U-Boot Instalar dependências build-essential, autoconf, autotools Tem que ser compilado usando o toolchain da Texas para OMAP Baixar no site de recursos E descompactar como root Baixar o fonte export PATH=$PATH:/usr/local/arm/3.3.2/bin make Arquivos gerados: 4 Apagar a linha 124 do Makefile Os exemplos não compilam Inicia compilação: make omap1610inn_config Alterar o Makefile wget -b http://linux.omap.com/pub/bootloader/h2/source/u-boot.tar.gz tar zxvf u-boot.tar.gz cd u-boot Configura o U-Boot para omap: tar xjvf gcc-3.3.2.tar.bz2 -C / u-boot, uboot.bin mkimage (programa usado para gerar uma imagem do núcleo entendível pelo o uboot) Saulo O. D. Luiz Sistema de arquivos raiz • Estrutura de como os arquivos são organizados • Os principais comandos GNU são providos pelo busybox • O busybox é um arquivo executável • Os comandos são links simbólicos para o busybox • O busybox os identifica pelo link chamado • Provê desde o processo init, até servidores mais sofisticados (http) 5 Saulo O. D. Luiz Vantagens • Construir seu próprio sistema de arquivos raiz traz algumas vantagens: – Melhor entendimento – Maior controle – Configurações mais simples 6 Saulo O. D. Luiz Sistema de arquivos raiz • Os dispositivos (/dev) podem ser criados a partir do mdev (mini udev) provido pelo busybox • Só são necessários dois devices – /dev/null – /dev/console • Em versões mais antigas do núcleo (2.6.12) os dispositivos eram montados como um sistema de arquivos – devfs • Em distribuições mais completas, pode-se usar um initrd para carregar módulos que variam de acordo com as configurações das máquinas – Maior compatibilidade – Maior tamanho de distribuição 7 Saulo O. D. Luiz Criando um sistema de arquivos raiz • Baixar da página o script que instala as dependências pra compilar o busybox • sh dependencias_busybox.sh • Baixando o Busybox: – wget http://busybox.net/downloads/busybox-1.2.1.tar.gz – tar zxvf busybox-1.2.1.tar.gz – cd busybox-1.2.1 • Configura o Busybox: – Habilita todas as opções do Busybox • make defconfig 8 Saulo O. D. Luiz • Altera algumas opções: • make menuconfig • (Caso apareça o erro /usr/bin/ld: cannot find -lncurses checar as dependências ncurses-base, ncurses-bin, ncurseshexedit, ncurses-term, libncurses5, libncurses5-dbg, libncurses5-dev, libncursesw5, libncursesw5-dbg, libncursesw5-dev) 9 Saulo O. D. Luiz Busybox settings – Build options • Marcar: Build BusyBox as a static binary (no shared libs) • Desmarcar: Build with Large File Support (for accessing files > 2 GB) Shells – Choose your default shell: ash cd .. mv busybox-1.2.1 /scratchbox/users/userLogin/home/userLogin/ /scratchbox/login cd busybox-1.2.1 Compila • make install 10 Saulo O. D. Luiz Povoando o sistema de arquivos raiz • Pasta raiz – sudo mkdir -p /embedded/targets/tux • Copiando a estrutura dos arquivos do Busybox para dentro da imagem montada: – (Fora do scratchbox) – sudo rsync -a /scratchbox/users/<userLogin>/home/<userLo gin>/busybox-1.2.1/_install/ /embedded/targets/tux/ 11 Saulo O. D. Luiz Criando os principais devices • Criar a pasta de dispositivos: – sudo mkdir /embedded/targets/tux/dev – cd /embedded/targets/tux/dev • Criando o device “console”: – sudo mknod console c 5 1 • Criando o device “null”: – sudo mknod null c 1 3 12 Saulo O. D. Luiz /etc/inittab do rootfs Criar arquivo /etc/inittab: – sudo mkdir -p /embedded/targets/tux/etc • sudo vi /embedded/targets/tux/etc/inittab • Arquivo inittab: # This is run first script ::sysinit:/etc/init.d/rcS # Start an "askfirst" shell on the console ::askfirst:-/bin/sh # Stuff to do when restarting the init process ::restart:/sbin/init # Stuff to do before rebooting ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r 13 Saulo O. D. Luiz Script /etc/init.d/rcS Criar o script /etc/init.d/rcS: sudo mkdir -p /embedded/targets/tux/etc/init.d • sudo vi /embedded/targets/tux/etc/init.d/rcS • sudo chmod 777 /embedded/targets/tux/etc/init.d/rcS #!/bin/sh /bin/busybox mkdir -p /proc /bin/busybox mkdir -p /sys /bin/busybox mount -t proc none /proc /bin/busybox mount -t sysfs none /sys /bin/busybox mkdir -p /dev/pts /bin/busybox mount -t devpts devpts /dev/pts # /bin/busybox echo /sbin/mdev > /proc/sys/kernel/hotplug /bin/busybox mdev -s /bin/busybox ifconfig lo 127.0.0.1 up exec /etc/profile rcS 14 Saulo O. D. Luiz Criar o script /etc/profile: • sudo vi /embedded/targets/tux/etc/profile • sudo chmod 777 /embedded/targets/tux/etc/profile #!/bin/sh TSLIB_TSDEVICE=/dev/event1 TSLIB_CONFFILE=/etc/ts.conf PATH=$PATH:/usr/X11R6/bin:/sbin LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib DISPLAY=:0 export TSLIB_TSDEVICE TSLIB_CONFFILE PATH LD_LIBRARY_PATH DISPLAY profile 15 Saulo O. D. Luiz