10.07.2015 Views

Linux embebido Workshop Linux Embebido - Simposio Argentino ...

Linux embebido Workshop Linux Embebido - Simposio Argentino ...

Linux embebido Workshop Linux Embebido - Simposio Argentino ...

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Linux</strong> <strong>embebido</strong><strong>Workshop</strong><strong>Linux</strong> <strong>Embebido</strong>Lucas ChiesaJoaquín de AndrésGermán BassiLaboratorioSistemas <strong>embebido</strong>sFIUBACreative Commons BY-SA 3.0 licenseBasado en : http://free-electrons.com/docs/embedded-linux-intro


¿Sistema <strong>embebido</strong>?Un sistema <strong>embebido</strong> o empotrado es un sistema decomputación diseñado para realizar una o algunas pocasfunciones dedicadas frecuentemente en un sistema decomputación en tiempo real. Los sistemas <strong>embebido</strong>s seutilizan para usos muy diferentes a los usos generales alos que se suelen someter a las computadoraspersonales.Wikipedia, http://es.wikipedia.org/wiki/Sistema_<strong>embebido</strong>SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>2


Muchos sistemas diferentesEs una definición muy genérica:Cubre muchos tipos diferentes de sistemasLínea borrosa con sistemas tradicionalesProductos “Consumer Electronics (CE)”:Routers hogareños, reproductores de DVD, Televisores,cámaras digitales, GPS, celulares ...Productos industriales:Controladores de máquinas, alarmas, equipos de vigilancia,autos, satélites...SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>3


Muchos productos diferentesSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>4


<strong>Linux</strong> <strong>embebido</strong>El Software Libre y Abierto ofrece una rango muy amplio deherramientas para desarrollar sistemas <strong>embebido</strong>s.Ventajas●Reutilizar componentes existentes para el sistema base.Permite concentrarse en el valor agregado del producto.●Componentes de alta calidad y muy probados. (Kernel <strong>Linux</strong> ,●●●●librerías de C ...)Control completo sobre la elección de componentes.Modificaciones posibles ilimitadas.Soporte por la comunidades: tutoriales, listas de correo...Bajo costo, sin licencias por unidad.Acceso más simple al software y a las herramientas.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>5


Ejemplos de dispositivosGPS: TomTom y GarminRouters hogareños: Linksys, NetgearPDA: Zaurus, Nokia N8x0TVs, DVDs: Sony, Philips, ...Celulares: Motorola, Android, OpenMokoY muchos productos que uno no se imagina...SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>6


Arquitectura globalHERRAMIENTASAplicación AplicaciónLibrería Librería LibreríaLibrería de CKernel <strong>Linux</strong>BootloaderHardwareSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>7


Hardware <strong>embebido</strong>El hardware para sistemas <strong>embebido</strong>s es usualmentediferente de los sistemas comunes.●●●●Normalmente usan otras arquitecturas:ARM, MIPS o PowerPC. x86 también es usado.Almacenamiento flash (NOR o NAND), usualmente concapacidad limitada. (de pocos MB a cientos de MB)Capacidad de RAM limitada (desde unos pocos MB)Muchos buses de conexión no comunes en desktops: I2C,SPI, 1­wire, CAN, etc.Placas de desarrollo por cientos de dolares●Usualmente usadas como base de nuestro diseño.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>8


EjemplosPicotux 100ARM7 55 MHz, NetsiliconNS75202 MB de flash8 MB de RAMEthernet5 GPIOsSerialBeagleBoard C4Cortex A8 750 MHz, TIOMAP 3550256 MB de RAM256 MB de NAND flashDVI, audio entrada y salida,USB, etcSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>9


Requerimientos mínimosUna CPU soportada por el GCC y el Kernel <strong>Linux</strong>●●32 bit CPUCPUs sin MMU son soportadas por uClinux, que no vamos a verahora.Unos MB de RAM, desde 4 MB.8 MB para hacer algo útil.Unos pocos MB de almacenamiento, desde 2 MB.4 MB para hacer algo útil.<strong>Linux</strong> no está diseñado para procesadores con KBs de RAM oROM:●●Se usan sin SO.Sistemas reducidos, como FreeRTOSSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>10


Componentes de softwareCross­compilation toolchain●Compilador que se ejecuta en una computadora de desarrollo ygenera binarios para el destino.Bootloader●Iniciado por el hardware, es el responsable de la inicializaciónbásica y ejecutar el Kernel.Kernel <strong>Linux</strong>●Contiene el administrador de procesos y memoria, stack de red,controladores de dispositivos, provee servicios a las aplicaciones.Librería de C●Interfaz entre el Kernel y las aplicaciones de usuario.Librerías y aplicaciones●Propias o producidas por otros.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>11


Armado de un sistema <strong>Linux</strong>Se necesitan realizar diferentes tareas para producir un sistema<strong>Linux</strong> <strong>embebido</strong>:Desarrollo del Board Support Package●●Un BSP contiene el bootloader y Kernel con los drivers necesariospara mi hardware destino.No es donde nos vamos a centrar.Integración del sistema●●Integrar todos los componentes, BSP, librerías y aplicacionesutilizadas y las aplicaciones propias para obtener un sistemafuncional.Propósito de este curso.Desarrollo de aplicaciones●Aplicaciones normales de <strong>Linux</strong>, pero usando librerías especiales.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>12


Root filesystemEn un sistema <strong>Linux</strong>, los sistemas dearchivos se “montan” dentro de unajerarquía global de directorios yarchivos.Un sistema particular, el root, semonta como el directorio /.En sistemas <strong>embebido</strong>s, estesistema de archivos contiene todoslos archivos del sistema.Por lo tanto, crearlo es una de lastareas principales de la integraciónde componentes.El Kernel normalmente se mantieneseparado.Contenidos dela FlashBootloaderKernelRootfilesystemSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>13


Entorno de desarrolloDos maneras de desarrollar un sistema <strong>Linux</strong>:●●Usar soluciones provistas y soportadas por empresas comoMontaVista, Wind River o TimeSys. Cada una tiene susherramientas propias.Usar herramientas provistas por la comunidad.No vamos a promover ninguna empresa en particular, por lo quevamos a usar herramientas de la comunidad.●Lo importante es entender los conceptos, migrar de herramientasiempre es más fácil.Desarrollar un sistema <strong>Linux</strong> requiere usar <strong>Linux</strong>.●●Las herramientas comunitarias no están disponibles para otrasplataformas.Entender <strong>Linux</strong> en el desktop nos va a facilitar el desarrollo de<strong>Linux</strong> <strong>embebido</strong>.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>14


<strong>Linux</strong> <strong>embebido</strong>Uso de unsistema <strong>Linux</strong>SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>15


Uso de un sistema <strong>Linux</strong>Sistema de archivos y dispositivosSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>16


Creando un sistema de archivosEjemplosmkfs.ext2 /dev/sda1Formatea la partición /dev/sda1 en formato ext2.mkfs.ext2 ­F disk.imgFormatea una imagen de disco en ext2mkfs.vfat ­v ­F 32 /dev/sda1 (­v: verbose)Formatea la misma partición anterior en FAT32.mkfs.vfat ­v ­F 32 disk.imgFormatea la imagen en FAT32.­F: force. Ejecuta aunque nosea un dispositivo real.Imágenes de discos en blanco se pueden crear así: (archivo de 64 MB):dd if=/dev/zero of=disk.img bs=1M count=64SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>17


Montando un dispositivoPara hacer cualquier sistema de archivos visibleen el sistema hay que montarlos.La primera vez, se crea el punto de montaje:mkdir /mnt/usbdisk (ejemplo)Ahora lo montamos:mount ­t vfat /dev/sda1 /mnt/usbdisk/dev/sda1: dispositivo físico­t: especifica el formato del sistema de archivo(ext2, ext3, vfat, reiserfs, iso9660...)DatoscrudosmountEstructuradedirectoriosSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>18


Montando un dispositivoTambién se puede montar una imagen de un sistema de archivosguardada en un archivo regular (loop devices)Muy útil para desarrollar y probar un sistema de archivos queestamos armando para otra computadora.Útil para acceder a los contenidos de una imagen de CD (iso)sin tener que grabar el disco.Ejemplo:mount ­o loop ­t vfat usbkey.img /mnt/usbdiskSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>19


Listando dispositivos montadosUsando el comando mount sin argumentos se obtiene la lista:/dev/hda6 on / type ext3 (rw,noatime)none on /proc type proc (rw,noatime)none on /sys type sysfs (rw)none on /dev/pts type devpts (rw,gid=5,mode=620)usbfs on /proc/bus/usb type usbfs (rw)/dev/hda4 on /data type ext3 (rw,noatime)none on /dev/shm type tmpfs (rw)/dev/hda1 on /win type vfat (rw,uid=501,gid=501)none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>20


Desmontando dispositivosumount /mnt/usbdiskTermina todas las transacciones pendientes en eldispositivo y lo desmonta.Para poder desmontar un dispositivo hay que cerrar todossus archivos abiertos:●●●Cerrar todos los programas que usen algún archivo deldirectorio montado.Estar seguro que ningún shell esté abierto en esa partición.Se puede usar el comando lsof (list openfiles) para ver todos los archivos abiertos en ese directorio.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>21


El lado oscuro de rootroot: Se necesitan sus privilegios sólo paraoperaciones específicas, con impacto en laseguridad. Por ejemplo: montar, crear dispositivos,cargar drivers, configurando la red,cambiar permisos, instalar paquetes...Por más que uno tenga la clave de root, la cuentanormal tiene que ser suficiente para el 99.9% de lasactividades (a menos que seas el sysadmin)En este curso es aceptable que usen root.En la vida real, pueden no tener esta cuentadisponible.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>22


Usando la cuenta rootEn caso que uno realmente quiera ser root...Si uno tiene el password de root:su ­ (switch user)En distribuciones modernas, el comando sudo te da acceso a algunosprivilegios de root usando la clave de tu usuario.Ejemplo: sudo mount /dev/hda4 /homeSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>23


Administración básica del sistemaManejo de paquetesSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>24


Paquetes de softwareLa forma de distribuir software en GNU/<strong>Linux</strong> difiere de la que seusa en Windows.Las distribuciones de <strong>Linux</strong> proveen una forma central ycoherente de instalar, actualizar y borrar aplicaciones y librerías:Paquetes.Los paquetes contienen la aplicación, las librerías e informaciónextra, como la versión y las dependencias.●.deb en Debian y Ubuntu, .rpm en Mandriva, Fedora, OpenSUSELos paquetes se guardan en repositorios, usualmente serversHTTP o FTP.Siempre hay que usar paquetes oficiales de la distribución, amenos que sea estrictamente necesario.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>25


Manejando paquetes de softwareInstrucciones para sistemas basados en Debian GNU/<strong>Linux</strong>:(Debian, Ubuntu...)Los repositorios de paquetes se especifican en:/etc/apt/sources.listPara actualizar la lista de paquetes:sudo apt­get updatePara encontrar un paquete para instalar, se pueden usar losbuscadores web: http://packages.debian.org ohttp://packages.ubuntu.com. También se puede usar:apt­cache search SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>26


Manejando paquetes de softwarePara instalar un paquete:sudo apt­get install Para desinstalar un paquete:sudo apt­get remove Para aplicar todas las actualizaciones:sudo apt­get dist­upgradePara obtener información de un paquete:sudo apt­cache show Existen interfaces gráficas:●●Synaptic para GNOMEAdept para KDEPara más información sobre administración de paquetes:http://www.debian.org/doc/manuals/apt­howto/SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>27


Apagando el sistemahaltApaga inmediatamente el sistema.rebootReinicia inmediatamente el sistema.[Ctrl][Alt][Del]También funciona el GNU/<strong>Linux</strong> para reiniciar.Sistemas <strong>embebido</strong>s: hay que usar un init y especificaruna combinación de teclas en /etc/inittab.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>28


Práctica – Usando <strong>Linux</strong>Practicar comandos básicos de<strong>Linux</strong>.Familiarizarse con la sintaxis delshell.Perderle el miedo a la terminal.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>29


Sistemas <strong>embebido</strong>sIntroducción alKernel <strong>Linux</strong>SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>30


Desarrollo de <strong>Linux</strong> <strong>Embebido</strong>Presentando el kernelCaracterísticas de <strong>Linux</strong>SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>31


Kernel <strong>Linux</strong> en el sistemaUser app BLibrería AUser app AUserspaceLibrería de CLlamadas a sistemaKernel <strong>Linux</strong>Notificación de eventos,con info agregada.Manejo dehardwareNotificación deeventosHardwareSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>32


HistoriaEl Kernel <strong>Linux</strong> es un componente del sistema, requiere libreríasy aplicaciones para proveer funcionalidad a los usuarios finales.Creado por un estudiante finlandes, Linus Torvalds, como unhobby en 1991.●Rápidamente fue adoptado como el Kernel para formar un sistemaoperativo libre.Linus Torvalds fue capaz de crear una comunidad de usuarios yprogramadores grande y dinámica alrededor de <strong>Linux</strong>.Actualmente cientos de personas contribuyen a cada release delKernel, tanto individuos particulares como pertenecientes agrandes empresas.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>33


Licencia de <strong>Linux</strong>Todas las fuentes del Kernel son software libre, liberado bajo lalicencia GNU General Public License version 2 (GPL v2).Para el Kernel, esto implica que:●●Cuando uno recibe o compra un dispositivo con <strong>Linux</strong>dentro, debe recibir las fuentes de <strong>Linux</strong>, con todos losderechos de estudiar modificar y redistribuir.Cuando uno produce equipos basados en <strong>Linux</strong>, unodebe dar las fuentes al destinatario, sin restricciones.Más adelante vamos a ver en detalle las licencias libres.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>34


Características principalesPortabilidad y soporte dehardware. Corre en lamayoría de las arquitecturas.Escalabilidad.Funciona en supercomputadoras como enpequeños dispositivos.(4 MB de RAM es suficiente).Cumple con estándares deinteroperatividadMuy completo y robustosoporte de red.SeguridadNo puede ocultar las fallas. Elcódigo es revisado por muchosexpertos.Estable y confiable.Modular. Puede incluir sólo loque nuestro sistema necesita.Fácil de programar. Se puedeaprender de código existente.Muchos recursos en InternetSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>35


Arquitecturas soportadasPara el Kernel 2.6.31Revisar el directorio arch/ en las fuentes.Requerimiento mínimo: 32 bits, con o sin MMU, y soporte de gcc.Arquitecturas de 32 bitsarm, avr32, blackfin, cris, frv, h8300, m32r, m68k,m68knommu, microblaze, mips, mn10300, parisc, s390,sparc, um, xtensaArquitecturas de 64 bits:alpha, ia64, sparc64Arquitecturas de 32 o 64 bits:powerpc, x86, shMás detalles en: arch//Kconfig,arch//README, o Documentation//SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>36


Llamadas a sistemaLa principal interfaz entre el Kernel y userspace es un conjuntode llamadas a sistema.Existen ~300 llamadas a sistemas que proveen los serviciosprincipales del Kernel●Operaciones en archivos y dispositivos, operaciones de red,comunicación entre procesos, administración de procesos, manejode memoria, timers, threads, sincronización, etc.Interfaz estable en el tiempo: sólo se pueden agregar nuevasllamadas.La interfaz a las llamadas al sistema es abstraída por la libreríade C. Los programas de userspace usualmente no hacenllamadas al sistema, usan las funciones correspondiente de lalibrería.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>37


Sistemas de archivos virtuales<strong>Linux</strong> ofrece información del sistema y el Kernel auserspace mediante sistemas de archivos virtuales(virtuales: no existen en un ningún almacenamiento real).No se necesita saber programar para acceder a estainformación!Montar /proc:sudo mount ­t proc none /procMontar /sys:sudo mount ­t sysfs none /sysTipo de fsDispositivoo imagen de fsEn el caso de un fs virtualcualquier texto es válidoLugar de montajeSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>38


Detalles de /procAlgunos ejemplos:/proc/cpuinfo: información del procesador/proc/meminfo: estado de la memoria/proc/version: información de compilación y versión delkernel/proc/cmdline: línea de comando del Kernel/proc//environ: entorno de ejecución/proc//cmdline: linea de comando del proceso... y mucho más! Véalo con sus propios ojos!Muchos detalles acerca de /proc disponibles en:Documentation/filesystems/proc.txt(casi 2000 líneas) en las fuentes del Kernel.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>39


Desarrollo de <strong>Linux</strong> <strong>Embebido</strong>Kernel <strong>Linux</strong>Esquema de versiones y modelo de desarrolloSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>40


Hasta 2.6Una nueva rama estable cada 2 o 3 años●Identificada por un número par en el medio●Ejemplos: 1.0, 2.0, 2.2, 2.4Una rama de desarrollo para integrar nueva funcionalidad ycambios mayores●Identificada por un número impar en el medio●Ejemplos: 2.1, 2.3, 2.5●Después de un tiempo, la rama de desarrollo pasaba a ser labase de una rama estable.Versiones menores de vez en cuando: 2.2.23, 2.5.12, etc.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>41


Hasta 2.6Versión estable2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.4.82.5.0 2.5.1 2.5.2 2.5.3 2.5.4 2.6.0 2.6.1DesarrolloEstableNota: En realidad existen muchasmás versiones menores en cadarama.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>42


Cambios desde <strong>Linux</strong> 2.6Desde 2.6.0, los programadores pudieron agregar muchasnuevas funciones de a una a paso constante sin tener quehacer grandes cambios en los subsistemas existentes.Abrir una nueva rama de desarrollo <strong>Linux</strong> 2.7 (o 2.9) va aser necesario cuando <strong>Linux</strong> 2.6 no pueda acomodar másfunciones importantes sin cambios muy grandes.Gracias a esto, muchas nuevas funciones llegan a losusuarios a un paso mucho más rápido.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>43


Cambios desde <strong>Linux</strong> 2.6Desde 2.6.14, los programadores del Kernel se pusieron de acuerdo enel siguiente modelo de desarrollo:Después de un release de una versión 2.6.x, se abre una ventanade 2 semanas para merge durante la cual los principales cambios sonaplicados.Se cierra la ventana de merge con el release de la versión2.6.(x+1)­rc1Se abre el período para arreglar bugs, de 6 a 10 semanas.En intervalos regulares durante el período de arreglo de bugs seliberan las versiones de prueba 2.6.(x+1)­rcY.Cuando se lo considera suficientemente estable,el Kernel 2.6.(x+1) es liberado, y el proceso vuelve a comenzar.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>44


Ventanas de merge y arreglos2 semanas 6 a 10 semanasVentana de mergeArreglar bugs2.6.21 2.6.22­rc12.6.22­rc32.6.22­rc52.6.22­rc22.6.22­rc4 2.6.222.6.21.1 2.6.21.2 2.6.21.3 2.6.21.4 2.6.21.5Actualizaciones conarreglos de bugs2.6.22.1SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>45


Más estabilidad con kernel 2.6Problema: los arreglos de bugs y seguridad se hacen sóloen la versión más nueva (a lo sumo dos anteriores). Lasdistribuciones, por supuesto, las aplican en los kernels queestán usando.Algunas personas necesitan tener un Kernel nuevo perocon soporte por un plazo prolongado.Se puede tener soporte de largo plazo de los proveedoresde <strong>Linux</strong> <strong>embebido</strong>.Se puede reutilizar las fuentes del Kernel de las versionesde Ubuntu LTS, o Debian (5 o 3 años de updates gratis).Algunas versiones se mantienen por un tiempo prolongadopor kernel.org (<strong>Linux</strong> 2.6.27 por ejemplo).SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>46


¿Qué tiene de nuevo cada versión?commit 3c92c2ba33cd7d666c5f83cc32aa590e794e91b0Author: Andi Kleen Date: Tue Oct 11 01:28:33 2005 +0200[PATCH] i386: Don't discard upper 32bits of HWCR on K8??!Need to use long long, not long when RMWing a MSR. I thinkit's harmless right now, but still should be better fixedif AMD adds any bits in the upper 32bit of HWCR.Bug was introduced with the TLB flush filter fix for i386Signed-off-by: Andi Kleen Signed-off-by: Linus Torvalds ...¡¡El changelog oficial de cada versión es simplemente unalarga lista de parches individuales!!Muy difícil de saber cuáles son los cambios claves y teneruna vista global de los cambios.Afortunadamente, un resumen de los cambiosfundamentales (con suficiente detalle) se encuentra en:http://wiki.kernelnewbies.org/<strong>Linux</strong>ChangesSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>47


Desarrollo de sistemas <strong>Linux</strong>Cross­compilingtoolchainsSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>48


DefiniciónLas herramientas de desarrollo que uno tiene normalmente en undesktop se llaman toolchain nativo.Este toolchain corre en el desktop y genera código para el desktop.Usualmente x86.Para sistemas <strong>embebido</strong>s usualmente no se puede o no es deseable.●●●El target tiene recursos limitados (poca RAM y almacenamiento)El target es mucho más lento que el desktop.Uno puede no querer tener instalados las herramientas dedesarrollo en el target.Por lo tanto, generalmente se usan cross­compiling toolchains. Corren enel desktop y general código para el target.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>49


DefiniciónCódigo fuenteToolchain nativoCross-compilingtoolchainMáquina quecompilax86Binario x86x86Binario ARMARMMáquinaque ejecutaSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>50


ComponentesBinutilsKernel headersLibrerías de C/C++Compilador GCCGDB debugger(opcional)SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>51


BinutilsBinutils es un conjunto de herramientas para manipular binariosde una determinada arquitectura:●●●●●as, el ensamblador, genera código binario a partir de códigoassemblerld, el linkerar, ranlib, genera archivos .a, usados para librerías.objdump, readelf, size, nm, strings, para inspeccionarbinarios. Herramientas de análisis muy útiles!strip, remueve partes de los binarios que no se usan.http://www.gnu.org/software/binutils/Licencia GPLSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>52


Kernel headersLa librería de C y los programas tienenque interactuar con el Kernel●●●Llamadas a sistema disponibles.Definiciones de constantes.Estructura de datos, etc.Por lo tanto, para compilar la librería deC se necesitan los Kernel headers, ymuchas aplicaciones también.KernelKernel headersLibrería de CAplicacionesDisponibles dentro de las fuentes del KernelSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>53


Kernel headersLa ABI kernel­to­userspace es compatible hacia atrás:●●●Binarios generados con un toolchain usando headers anterioresque el Kernel que se está usando, van a funcionar pero no van apoder usar las prestaciones nuevas.Binarios compilados contra headers más nuevos que el Kernel enuso pueden romperse si se usan características no presentes en elKernel viejo.No es necesario usar los headers más nuevos, salvo que senecesiten las últimas características.Los headers se extraen de las fuentes del Kernel con elcomando make headers_install.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>54


Compilador GCCFamoso compilador libre GCCPuede compilar C, C++, Ada, Fortran, Java,Objective­C, Objective­C++, y generar código paramuchas arquitecturas, incluyendo ARM, AVR,AVR32, Blackfin, CRIS, FRV, M32, MIPS, MN10300,PowerPC, SH, v850, i386, x86_64, IA64, Xtensa, etc.http://gcc.gnu.org/Disponible bajo licencia GPL.Las librerías que utiliza son LGPL.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>55


Librería de CLa librería de C es un componente esencialde una instalación de <strong>Linux</strong>.●●Interfaz entre las aplicaciones y el Kernel.Provee una API de C muy conocida parafacilitar el desarrollo de aplicaciones.Existen muchas librerías de C:glibc, uClibc, eglibc, dietlibc, newlib, etc.La elección de una librería se debe hacer enel momento de generar el toolchain, ya que elGCC se compila contra la librería.KernelLibrería de CAplicacionesSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>56


glibchttp://www.gnu.org/software/libc/Licencia: LGPLLibrería de C del proyecto GNU.Diseñada para desempeño, respetar estándares yportabilidad.Encontrada en casi todos los sistemas GNU / <strong>Linux</strong>.Por supuesto, mantenida activamente.Bastante grande para sistemas <strong>embebido</strong>s: ~ 2.5 MBen arm (version 2.9 ­ libc: 1.5 MB, libm: 750 KB)SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>57


uClibchttp://www.uclibc.org/ de CodePoet ConsultingLicencia: LGPLLibrería de C pequeña, para sistemas <strong>embebido</strong>s:●●●●●Muchas opciones de configuración: muchas funciones sepueden activar y desactivar usando la interfaz menuconfig.Funciona en <strong>Linux</strong>/uClinux, en la mayoría de las plataformasembebidas.No tiene una ABI estable, depende de la configuración de lalibrería.Se ocupa del tamaño antes que del desempeño.Se compila rápido.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>58


uClibcLa mayoría de las aplicaciones compilan contra uClibc, y todas lasque se usan en <strong>embebido</strong>s.Tamaño (arm): 4 veces más chica que glibc!uClibc 0.9.30.1: ~ 600 KB (libuClibc: 460 KB, libm: 96KB)glibc 2.9: ~ 2.5 MB (para recordar)Usada en una gran cantidad de dispositivos <strong>embebido</strong>s, incluidosmuchos de “consumer electronics”.Activamente soportada, gran base de usuarios.Ahora soportada por MontaVista, TimeSys y Wind River.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>59


Querida encojí a los programasPrograma Usando librerías compartidas Compilado estáticoPlain “hello world”(stripped)Busybox(stripped)glibc uClibc glibc uClibc5.6 K(glibc 2.9)245 K(older glibc)5.4 K(uClibc 0.9.30.1)231 K(older uClibc)472 K(glibc 2.9)843 K(older glibc)18 K(uClibc 0.9.30.1)311 K(older uClibc)Comparación de tamaños de ejecutables en ARMSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>60


eglibc« Embedded glibc », LGPLVariante de la GNU C Library (GLIBC) diseñada para funcionar ensistemas <strong>embebido</strong>s.Compatible (fuente y binarios) con GLIBCSus objetivos incluyen tamaño reducido, componentesconfigurables, mejor soporte para cross­compilación.Se puede compilar sin soporte par IPv6, localizaciones y muchasotras funciones.Soportada por un consorcio, con Freescale, MIPS, MontaVista yWind River como miembros.Debian usa eglibc en todas las distribuciones.http://www.eglibc.orgSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>61


Otras librerías de C pequeñasExisten otras librerías de C más pequeñas, pero ningunacon el objetivo de compilar una gran cantidad deaplicaciones existentes.Requieren el código escrito especialmente para ellas.Opciones:●●●Dietlibc, http://www.fefe.de/dietlibc/. Aproximadamente 70 KB.Newlib, http://sourceware.org/newlib/Klibc, http://www.kernel.org/pub/linux/libs/klibc/, diseñadapara ser usada durante el booteo.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>62


Compilando el toolchainHay que diferenciar tres máquinas cuando se habla de lacreación del toolchain:●●●La máquina de compilación, donde el toolchain se compila.La máquina host, donde el toolchain se ejecuta.La máquina destino, donde se van a ejecutar los binariosgenerados por el toolchain.Existen cuatro posibles maneras de crear el toolchainSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>63


Compilando el toolchainbuild host targetbuild host targetNativotoolchain normal en un desktopCrossGenera un toolchain que corre en eldesktop y crea código para ejecutarloen el targetLa solución más común en <strong>embebido</strong>sbuild host targetbuild host targetCross-nativoGenera un toolchain que corre en eltarget y genera código para el targetCanadianUn toolchain que se compila en eldesktop, se ejecuta en un server ygenera código para el targetSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>64


Compilando el toolchainHay que tomar muchas decisiones al momento de hacer untoolchain.●●Elegir la librería de CElegir la versión de los componentes que vamos a usarY la configuración de todas estas cosas.●¿Qué ABI debemos usar? Toolchains para ARM, puedengenerar binarios usando la OABI (Old ABI) o la EABI(Embedded ABI), que son incompatibles.●¿Debe el toolchain soportar punto flotante por software?, ¿oel hardware provee soporte para estas operaciones?●¿Debe el toolchain soportar localización, IPv6, u otrascaracterísticas especiales?SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>65


Compilando el toolchainReporte de compilación: http://kegel.com/crosstool/crosstool­0.43/buildlogsSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>66


Pasos básicosExtraer e instalar los Kernel headers.Extraer, configurar, compilar e instalar binutils.Extraer, configurar y compilar la primera versión del GCCque genera binarios para el target. Lo vamos usar paracompilar la librería de C de cross­compilación.Extraer, configurar y compilar la librería de C con elcompilador generado en el paso anterior.Re configurar y compilar el gcc, contra la nueva librería deC. Así obtenemos el gcc que vamos a usar.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>67


Toolchains caserosCompilar un cross toolchain a mano es una tarea dolorosa ydifícil. Podemos tardar varios días en lograrlo!Muchos detalles que saber y entender. Muchos componentes quecompilar.Muchas decisiones para tomar.(configuración de la librería de C para tu plataforma)Necesitamos fuentes de muchos programas diversos.Estar familiarizado con los problemas actuales del gcc y losparches para tu arquitectura.Es útil tener práctica compilando programas complejos.http://www.aleph1.co.uk/armlinux/docs/toolchain/toolchHOWTO.pdf¡Te dice cuán entretenido puede ser!SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>68


Usar toolchains precompiladosLa elección más popular, por ser lo más simple y fácil.Primero, hay que determinar qué toolchain se necesita. CPU,endianism, librería de C, componentes, ABI, punto flotante,etc..Existen muchos toolchains precompilados:●●●CodeSourcery, http://www.codesourcery.com, es unareferencia en el área. No te proveen <strong>Linux</strong>+uClibc.Linaro mantiene toolchains optimizados para ARM:https://wiki.linaro.org/WorkingGroups/ToolChain(Linaro contrató a CodeSourcery y agregó cosas)Más información en http://elinux.org/ToolchainsSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>69


Usando toolchains precompiladosSeguir las instrucciones provistas por el fabricante.Usualmente es cuestión de descomprimir el archivo ydejarlo en el lugar correspondiente:●●¡Los toolchains no suelen ser reubicables!Los tenés que tener en el lugar donde fueron diseñados.A partir de gcc 4.x esto no es necesario, pero suele serlo más común y sencillo.Finalmente, agregar el toolchain a nuestro PATH:export PATH=/path/to/toolchain/bin/:$PATHSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>70


Herramientas para compilarOtra solución es usar utilidades que automatizan el proceso decreación de un toolchain.Las mismas ventajas que los precompilados, no hay quemeterse con la tediosa compilación manual.Ofrecen mayor flexibilidad que los toolchains ya compilados.Puedo seleccionar todas las opciones que quiero.Usualmente incluyen los parches recomendables para losdistintos componentes en las distintas arquitecturas.Son scripts de shell o Makefiles que automatizan el proceso dedescargar, extraer, configurar y compilar los distintoscomponentes.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>71


Herramientas para compilarCrosstool●●●Herramienta original, escrita por Dan KegelConjunto de scripts y parches, glibc­onlyNo se mantiene más●http://www.kegel.com/crosstoolCrosstool­ng●●●●Re­escritura de Crosstool, con una sistema de configuración del estilode menuconfig.Más prestaciones: soporta uClibc, glibc, eglibc, hard y soft float,muchas arquitecturas.Activamente mantenido.http://ymorin.is­a­geek.org/dokuwiki/projects/crosstoolSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>72


Herramientas para compilarMuchas herramientas para hacer rootfs también permiten compilarel toolchain.Buildroot●Basado en Makefile, sólo uClibc, mantenido por la comunidad.http://buildroot.uclibc.orgPTXdist●●Basado en Makefile, uClibc o glibc, mantenido principalmentepor Pengutronixhttp://www.pengutronix.de/software/ptxdist/index_en.htmlOpenEmbedded●●El sistema de compilación más completo y complejodisponible.http://www.openembedded.org/SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>73


Práctica – Usando CrosstoolNGMomento de compilar su toolchain!Configurar Crosstool­NGEjecutarlo para que compile supropio toolchainMientras compila... ¿dudas?SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>74


<strong>Linux</strong> <strong>embebido</strong><strong>Workshop</strong><strong>Linux</strong> <strong>Embebido</strong>Lucas ChiesaJoaquín de AndrésGermán BassiLaboratorioSistemas <strong>embebido</strong>sFIUBACreative Commons BY-SA 3.0 licenseBasado en : http://free-electrons.com/docs/embedded-linux-intro


Desarrollo de sistemas <strong>Linux</strong>BootloadersSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>76


BootloadersEl bootloader es un programa responsable de:●●●●Inicialización básica del hardware.Cargar una aplicación binaria, usualmente el Kernel del SO, desdeun almacenamiento flash, desde la red, o desde cualquier otro tipode almacenamiento no volátil.Descompresión eventual de la aplicación binaria.Ejecución de la aplicación.Además de las funciones básicas, la mayoría de los bootloadersproveen un shell que implementan diferentes operaciones.●Inspección de memoria, diagnóstico de hardware, testeo, etc..SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>77


Bootloaders on x86Los procesadores x86 son usados típicamente en placas quecontienen memoria no volátil donde se encuentra un programa,la BIOS.El programa es ejecutado desde la CPU después de un reset yes responsable de la inicialización básica del hardware y cargaruna pequeña porción de código de almacenamiento no volátil.●Este código es usualmente los primeros 512 bytes de un discorígido.Este código usualmente es la primera etapa del bootloader (1ºstage bootloader), que va a cargar el bootloader “real”.Luego, el bootloader puede ofrecer todas sus características.Típicamente entienden sistemas de archivos, para cargar elKernel directo del FS.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>78


Bootloaders on x86GRUB, Grand Unified Bootloader, es el más poderoso.http://www.gnu.org/software/grub/●Puede leer muchos sistemas de archivos y cargar el Kernel ysu configuración. Provee un shell muy poderoso con muchoscomandos. Soporte de red, etc.LILO, el bootloader original de <strong>Linux</strong>http://freshmeat.net/projects/lilo/Syslinux, para bootear de red o de medioshttp://syslinux.zytor.comSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>79


Bootloaders en <strong>embebido</strong>sEn arquitecturas embebidas, el booteo de bajo nivel depende de cada CPU ycada placa.●●Algunas placas tienen una NOR flash de la cual la CPU comienza laejecución después del reset. En ese caso, el bootloader se debe grabardirectamente en la dirección apropiada de esa NOR.Algunas CPUs tiene código de booteo integrado en una ROM interna queautomáticamente carga una porción de NAND flash en SRAM. En ese casoun bootloader mínimo de primera etapa se debe cargar en ese lugar deNAND. Luego, éste va a cargar el bootloader definitivo en DRAM yejecutarlo. (BootROM on AT91SAM CPUs, Steppingstone on S3C24xxCPUs, etc.).El bootloader en <strong>embebido</strong>s inicia justo después de un reset de la CPU. Debeinicializar todos los dispositivos, incluyendo el controlador de memoria parapoder acceder a la DRAM.Como el proceso de booteo es altamente dependiendo del fabricante esnecesario tener la documentación propia del equipo.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>80


Bootloaders en <strong>embebido</strong>sNos vamos a centrar en el bootloader principal, por ser el másgenérico y por ofrecer la mayor cantidad de prestaciones.Hay varios bootloaders libres genéricos.Estos son los más populares:●U­Boot, el “universal bootloader” por DenxEl más usado en ARM, también usado en PPC, MIPS, x86, m68k, NIOS,etc. El estándar de­facto actual, y es el que vamos a utilizar.http://www.denx.de/wiki/U­Boot●Barebox, un nuevo bootloader escrito como sucesor a U­Boot. Mejordiseño, mejor código y en desarrollo activo pero todavía no tiene tantosoporte de hardware como U­Boot.http://www.barebox.orgHay muchos otros bootloaders, libres y propietarios, usualmenteespecíficos para alguna arquitectura.●RedBoot, Yaboot, PMON, etc.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>81


Desarrollo de sistemas <strong>Linux</strong>Accediendo a una consola serieSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>82


MinicomDefinición: programa de comunicación serie.Disponible en todas las distribuciones GNU / <strong>Linux</strong>.Capacidades:●●●●Consola serie a un sistema Unix remotoTransferencia de archivosControlar módems y dial­upConfiguración del puerto serieSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>83


MinicomAbrirlo ejecutandominicom ­s paraconfigurar minicomUn poco austero alprincipio, pero despuésresulta amistoso.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>84


Otras terminales seriesGTKTerm: http://www.jls­info.com/julien/linux/Gráfico. Menos poderoso que Minicom, pero con una interfazmás simple y más atractiva. Disponible en distros recientes.CuteCom: http://cutecom.sourceforge.net/Otra terminal gráfica amistosa. Disponible en distros recientes.picocom: http://freshmeat.net/projects/picocom/Emulador muy pequeño (20K), se puede usar <strong>embebido</strong>GNU Screen: también se puede usar como terminal serie:screen Ejemplo:screen /dev/ttyS0 115200SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>85


Práctica – BootloadersMomento de conectarse a U­Boot!Usar una terminal serie.Conocer los comandos de U­BootSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>86


Uso <strong>embebido</strong> del Kernel <strong>Linux</strong>Uso <strong>embebido</strong>del Kernel <strong>Linux</strong>SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>87


ContenidosCompilando y booteandoFuentes del KernelConfiguración del KernelCompilando el KernelInicio del sistemaArchivos de dispositivosCross compilando el KernelSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>88


Uso <strong>embebido</strong> del Kernel <strong>Linux</strong>Compilando y Booteando el KernelFuentes del Kernel <strong>Linux</strong>SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>89


Fuentes del KernelLa versión oficial del Kernel, liberada por Linus Torvals, estádisponible en http://www.kernel.org●●Esta versión sigue el modelo de desarrollo descripto anteriormente.Sin embargo, puede no contener los últimos cambios de un áreaespecífica. Algunos cambios pudieron darse después de la ventanade merge o estar todavía en desarrollo.Muchas sub­comunidades del Kernel mantienen sus propiasversiones, usualmente con funciones más nuevas y menosestables.●●Comunidades de arquitecturas (ARM, MIPS, PowerPC, etc.),comunidades de drivers (I2C, SPI, USB, PCI, red, etc.), otrascomunidades (real­time, etc.)Usualmente no liberan versiones oficiales sino que mantienen lasramas de desarrollo.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>90


Tamaño del Kernel <strong>Linux</strong>Fuentes del <strong>Linux</strong> 2.6.31:Tamaño crudo: 350 MB (30,900 archivos, ~ 12,000,000 líneas)gzip: 75 MBbzip2: 59 MB (mejor)lzma: 49 MB (el mejor)Un <strong>Linux</strong> mínimo 2.6.29 compilado con la opción CONFIG_EMBEDDED,para bootear en un QEMU PC (disco IDE, ext2 filesystem, binariosELF): 532 KB (comprimido), 1325 KB (descomprimido)¿Por qué son tan grandes las fuentes?Proveen miles de drivers, muchos protocolos de red, muchasarquitecturas, muchos sistemas de archivos, etc...El núcleo de <strong>Linux</strong> (scheduler, manejador de memoria...) es bastantechico.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>91


Tamaño del Kernel <strong>Linux</strong>Tamaño del fuente de <strong>Linux</strong> por directorios (KB)archblockcryptoDocumentationdriversfsincludeinitipckernellibmmnetscriptssecuritysoundusr0 50000 100000 150000<strong>Linux</strong> 2.6.17Medido con:du ­s ­­apparent­sizeSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>92


Bajando las fuentesArchivos completos●●●Contiene las fuentes completas del kernel.Bastante para bajar y para descomprimir. Es necesario hacerlo porlo menos una vez.Ejemplo: http://kernel.org/pub/linux/kernel/v2.6/linux­2.6.14.7.tar.bz2Parches incrementales entre versiones●●●Asume que tenés una versión base y que aplicaste todos losparches en el orden correcto.Rápido para bajar y aplicarEjemplohttp://kernel.org/pub/linux/kernel/v2.6/patch­2.6.14.bz2 (2.6.13 to 2.6.14)http://kernel.org/pub/linux/kernel/v2.6/patch­2.6.14.7.bz2 (2.6.14 to 2.6.14.7)Todas las versiones anteriores están disponibles en:http://kernel.org/pub/linux/kernel/SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>93


Aplicando un parche a <strong>Linux</strong>Siempre aplicar a la versión x.y.Se pueden bajar comprimidos engzip, bzip2.Siempre producidos para n=1Ejemplo:cd linux­2.6.13bzcat ../patch­2.6.14.bz2 | patch ­p1bzcat ../patch­2.6.14.7.bz2 | patch ­p1cd ..; mv linux­2.6.13 linux­2.6.14.7Podés hacer patch 30%más rápido usando ­sp1en lugar de ­p1(silent)Mantener el archivo comprimido: Sirve para verificar la firma.Uno puede ver y editar el archivo sin descomprimirlo usando vim:vim patch­2.6.14.bz2 ((des)compresión on the fly)SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>94


Práctica – Fuentes del KernelBajar las fuentesDescomprimirlas, familiarizarse.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>95


Uso <strong>embebido</strong> del Kernel <strong>Linux</strong>Compilando y booteandoConfiguración del KernelSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>96


Configuración del KernelYa vimos que el Kernel contiene miles de drivers y otras cosas.Provee miles de opciones para compilar selectivamentediferentes partes del código.La configuración del Kernel es el proceso de selección de lasopciones que queremos que tenga nuestro KernelEste conjunto de opciones depende de●●Nuestro hardwareDe las prestaciones que necesitamos del KernelSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>97


Configuración del KernelLa configuración se guarda en el archivo .config en la raíz de lasfuentes●Archivo de texto plano, estilo key=valueComo las opciones tienen dependencias es raro editar el archivo amano. Se usan interfaces gráficas:●●make [xconfig|gconfig|menuconfig|oldconfig]Estos son targets del Makefile del Kernel. Correr make help nos dauna lista de targets disponibles.Para cambiar el Kernel en una distro GNU/<strong>Linux</strong>:la configuración usada normalmente está en /boot/, junto con laimagen del Kernel: /boot/config­2.6.17­11­genericSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>98


make xconfigmake xconfigLa interfaz gráfica más común.Antes de usar leer:help ­> introduction: datos útiles!File browser: facilita cargar archivos de configuraciónInterfaz de búsqueda de parámetrosPaquetes de Debian / Ubuntu requeridos:libqt3­mt­dev, g++SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>99


make xconfig screenshotSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>100


make xconfig: búsquedaBusca una palabracable en lasdescripcionesTe deja activar o nolas opcionesencontradas.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>101


Opciones de configuraciónCompilado como módulo (archivo separado)CONFIG_ISO9660_FS=mOpciones del driverCONFIG_JOLIET=yCONFIG_ZISOFS=yCompilado estático en el KernelCONFIG_UDF_FS=ySASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>102


.config correspondiente## CD­ROM/DVD Filesystems#CONFIG_ISO9660_FS=mCONFIG_JOLIET=yCONFIG_ZISOFS=yCONFIG_UDF_FS=yCONFIG_UDF_NLS=yNombre de la sección(ayuda a encontrar settings)Todos los parámetros comienzancon CONFIG_## DOS/FAT/NT Filesystems## CONFIG_MSDOS_FS is not set# CONFIG_VFAT_FS is not setCONFIG_NTFS_FS=m# CONFIG_NTFS_DEBUG is not setCONFIG_NTFS_RW=ySASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>103


Dependencias de las opcionesHay dependencias entre las opciones del KernelPor ejemplo, activar un driver de red necesita tener el stack dered compilado.Dos tipos de dependencias:●Dependencias “depends on”. En este caso, la opción A quedepende de B no es visible hasta que B no esté activada.●Dependencias “select”. En este caso, si trato de activar la opción A,entonces B es seleccionada automáticamente.●make xconfig permite ver todas las opciones, incluidas las que nose pueden seleccionar por faltar dependencias. En ese caso, lasmuestra en color gris.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>104


make gconfigmake gconfigNuevo frontend basadoen GTK. Funcionalidadsimilar a la de makexconfig.No se puede buscar.Paquetes requeridos:libglade2­devSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>105


make menuconfigmake menuconfigÚtil cuando no tengointerfaz gráfica. Muycómoda también!Misma interfaz que seusa en otrasherramientas: BusyBox,buildroot...Paquetes requeridos:libncurses­devSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>106


make oldconfigmake oldconfig¡Frecuentemente necesario!Usado para actualizar un archivo .config de unaversión anterior del KernelEmite advertencias cuando se usaron configuracionesque no existen más en el nuevo KernelPregunta por el valor de nuevas opcionesSi se edita a mano el .config es muy recomendableejecutar make oldconfig después!SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>107


make allnoconfigmake allnoconfigSólo activa las funciones fuertemente recomendadasTodo lo demás, no lo compila.Muy útil para partir de lo mínimo y agregar lo quenecesitamos.¡Más fácil agregar lo poco que necesitamos que sacar todolo que sobra!SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>108


Deshaciendo cambios en la conf.Un problema frecuente:Después de varios cambios de configuraciones el Kerneldeja de funcionar.Si uno no se acuerda todos los cambios que fuehaciendo, se puede recuperar la configuración anterior:> cp .config.old .configTodas las interfaces de configuración(xconfig, menuconfig, allnoconfig...)mantienen una copia de seguridad en .config.old.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>109


Configuraciones por arquitecturaEl conjunto de configuraciones depende de la arquitectura●●Algunas configuraciones son muy específicas.La mayoría de las opciones (opciones globales del Kernel,subsistema de red, filesystems) son visibles en todas las archs.Por omisión, el sistema de compilación asume una compilaciónnativa.La arquitectura no se especifica entre las opciones decompilación, sino en un nivel superior.Vamos a ver cómo seleccionar la arquitectura que queremos.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>110


Uso <strong>embebido</strong> del Kernel <strong>Linux</strong>Compilando e instalando el KernelPara el sistema hostSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>111


Compilación del kernelmake●●●En el directorio principal del códigoRecordar de usar make ­j n si tenes más de un core n=cores+1No tenés que ser root!Genera●●●vmlinux, imagen cruda, sin comprimir en formato ELF, útil paradebugging pero no puede ser booteado.arch//boot/*Image, la imagen final, usualmentecomprimida y puede ser booteada.– bzImage para x86, zImage para ARM, vmImage.gz para Blackfin,etc.Los módulos de kernel están distribuidos por todas las fuentes yson archivos que terminan en .ko.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>112


Instalación del Kernelmake install●Instala el Kernel en el sistema host. Se debe correr como root.Instala●●●●/boot/vmlinuz­La imagen del Kernel comprimida. La misma que enarch//boot/boot/System.map­Guarda la dirección de los símbolos del Kernel/boot/config­Configuración del Kernel para esa versiónUsualmente ejecuta la utilidad de configuración del bootloaderpara incorporar el nuevo KernelSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>113


Instalación de los módulosmake modules_install●Instala los módulos en el sistema host. Se debe ejecutar como root.Instala los módulos en /lib/modules//●●●●kernel/Guarda todos archivos los .ko (Kernel Object), manteniendola estructura de las fuentes.modules.aliasArchivo usado por las herramientas que cargan módulos. Porejemplo:alias sound­service­?­0 snd_mixer_ossmodules.depDependencias de los módulosmodules.symbolsMuestra a qué módulo corresponde cada símbolo.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>114


Limpiando la fuentesLimpiar los archivos generados por compilación(para forzar a compilar todo nuevamente):make cleanBorra todos los archivos generados. Usado cuandocambiamos de arquitecturaCuidado: también borra el archivos .config!make mrproperTambién borrar los archivos de backup y archivosgenerados por patch. Útil cuando se está haciendoun parche.make distcleanSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>115


Uso <strong>embebido</strong> del Kernel <strong>Linux</strong>Compilando y booteando <strong>Linux</strong>Archivos de dispositivosSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>116


Dispositivos de caracteresSe acceden como un flujo secuencial de caracteresindividualesSe identifican por el tipo c(ls ­l):crw­rw­­­­ 1 root uucp 4, 64 Feb 23 2004 /dev/ttyS0crw­­w­­­­ 1 jdoe tty 136, 1 Feb 23 2004 /dev/pts/1crw­­­­­­­ 1 root root 13, 32 Feb 23 2004 /dev/input/mouse0crw­rw­rw­ 1 root root 1, 3 Feb 23 2004 /dev/nullEjemplos: teclados, mouse, puerto paralelo, IrDA,Bluetooth port, consolas, terminales, etc...SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>117


Dispositivos de bloquesSe acceden por bloques de datos de algún tamaño fijo.Pueden ser leídos en cualquier orden.Se identifican por el tipo de archivo b (ls ­l):brw­rw­­­­ 1 root disk 3, 1 Feb 23 2004 hda1brw­rw­­­­ 1 jdoe floppy 2, 0 Feb 23 2004 fd0brw­rw­­­­ 1 root disk 7, 0 Feb 23 2004 loop0brw­rw­­­­ 1 root disk 1, 1 Feb 23 2004 ram1brw­­­­­­­ 1 root root 8, 1 Feb 23 2004 sda1Ejemplos: discos rígidos y floppy, discos ram, dispositivosloop...SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>118


Números minor y majorComo se ve en los ejemplos anteriores los archivos tienen dosnúmeros asociados:El primero: el número majorEl segundo: el número minorLos números major y minor son números usados por elKernel para vincular un driver con un dispositivo. Losnombres de los archivos no le importan al Kernel!Para saber a qué driver corresponde cada número, verDocumentation/devices.txt.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>119


Creación de los archivosNo se crean cuando se carga el driverDeben ser creados de antemano:sudo mknod /dev/ [c|b] Ejemplos:sudo mknod /dev/ttyS0 c 4 64sudo mknod /dev/hda1 b 3 1SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>120


Práctica – Configurar y compilarConfigurar su KernelCompilarloBootearlo en una máquina virtualSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>121


Uso <strong>embebido</strong> del Kernel <strong>Linux</strong>Compilando y booteando <strong>Linux</strong>Inicio general del sistemaSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>122


Secuencia de booteo tradicionalBootloader­ Ejecutado por el hardware desde una posición fija de ROM / Flash­ Inicializa el soporte de los dispositivos donde se encuentra el kernel.(almacenamiento, red, medios removibles)­ Carga el Kernel en RAM­ Ejecuta la imagen del Kernel (con unos parámetros determinados)Kernel­ Se auto descomprime­ Inicializa el núcleo del Kernel y drivers compilados estáticos (necesarios para accederal root filesystem)­ Monta el root filesystem (especificado por el parámetro root)­ Ejecuta el primer programa de userspace (especificado por el parámetro init)Primer programa de userspace­ Configura userspace y continúa levantando serviciosSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>123


Parámetros del KernelEl Kernel acepta parámetros al momento de bootearSon parte de la configuración del bootloaderSon copiados a RAM por el bootloader a la posición de RAMdonde los espera el Kernel.Útiles para modificar el comportamiento del Kernel al momentode booteo, sin recompilarlo.Útiles para hacer inicialización avanzada de drivers y el Kernelsin la necesidad de tener complejos scripts de userspace.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>124


Ejemplo de los parámetrosHP iPAQ h2200 PDA ejemplo:root=/dev/ram0 \rw \init=/linuxrc \console=ttyS0,115200n8 \console=tty0 \ramdisk_size=8192 \cachepolicy=writethroughCientos de parámetros descriptos en:Documentation/kernel­parameters.txtRoot fs (primer ramdisk)Modo de montaje del root fsPrimer programa userspaceConsola (serie)Otra consola (framebuffer)Otros parámetros...SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>125


DesventajasSe asume que todos los drivers necesarios para montar el root fs(almacenamiento y fs) están compilados estáticos en el kernel.Se puede asumir en la mayoría de los sistemas <strong>embebido</strong>s queesto va a pasar, donde el hardware es conocido y el kernel estáafinado al sistema.Es usualmente errónea en los sistemas desktop y servers dondeuna imagen tiene que levantar en una cantidad de dispositivosmuy grande.●●●Se necesita más flexibilidadLos módulos te dan esta flexibilidad, pero no están disponibleshasta montar el root filesystem.Necesidad de soportar sistemas complejos (RAID, NFS, etc.)SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>126


SoluciónUna solución es incluir un pequeño rootfs temporal con los módulosnecesarios dentro del Kernel mismo. Este sistema de archivos sellama initramfs.El initramfs es un sistema de archivos comprimido cpio con unrootfs muy básico.●Un cpio es como un zip pero con un formato mucho más simple.Los scripts del initramfs van a detectar el hardware, cargar losmódulos necesarios y montar el rootfs real.Finalmente, el los scripts del initramfs van a correr la aplicación initdel rootfs real y continuar el booteo usual.Esta técnica reemplaza completamente los init ramdisks (initrds),que se usaban con <strong>Linux</strong> 2.4, pero no son más necesarios.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>127


Secuencia de booteo con initramfsBootloader­ Ejecutado por el hardware desde una posición fija de ROM / Flash­ Inicializa el soporte de los dispositivos donde se encuentra el kernel. (almacenamiento, red, mediosremovibles)­ Carga el Kernel en RAM­ Ejecuta la imagen del kernel (con unos parámetros determinadosKernel­ Se descomprime­ Inicializa el núcleo y los drivers compilados estáticos.­ Descomprime el archivo cpio del initramfs. (si existe, dentro del kernel, sino el bootloader lo copia a unaparte específica de memoria) y lo extrae en el cache del kernel.­ Si encontró un initramfs, ejecuta el primer programa dentro del initramfs. /initSin cambiosUserspace: script /init (es lo mismo que un userspace normal)­ Corre comandos para configurar el dispositivo(configuración de red, montar /proc y /sys...)­ Monta el rootfs. Cambiar a ese filesystem (switch_root)­ Corre /sbin/initUserspace: /sbin/init­ Configura lo que no esté configurado por el initramfs.­ Levanta los servicios (demonios, servers) y programas de usuarioSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>128


Ventajas initramfsEs una solución simple, meter un rootfs directo en el kernel ocopiado por el bootloader.Es simplemente un archivo cpio comprimido que se extrae alcache de archivos. No necesita un bloque ni un driver defilesystem.Es más montar filesystem complejos desde scripts de userspaceque desde código de kernel. Mueve la complejidad a espacio deusuario.Posibilita agregar archivos no GPL (firmware, driverspropietarios) en el filesystem. Esto no es linking, por lo que noes una violación de la GPL.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>129


Como poblar un initramfsUsando CONFIG_INITRAMFS_SOURCEen la configuración del Kernel (General Setup)Se le puede dar un cpio existenteO darle un directorio para ser archivado.ver Documentation/filesystems/ramfs­rootfs­initramfs.txty Documentation/early­userspace/README en las fuentes del Kernel.También, es http://www.linuxdevices.com/articles/AT4017834659.html hay unalinda descripción de initramfs (por Rob Landley).SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>130


ResumenPara sistemas <strong>embebido</strong>s, dos soluciones interesantes:●●Sin initramfs: Todos los drivers están incluidos en el kernel yse carga el rootfs final directamente.Todo en el initramfs!SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>131


Uso <strong>embebido</strong> del Kernel <strong>Linux</strong>Compilando y booteando <strong>Linux</strong>Cross­compilando el KernelSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>132


Cross­compilando el KernelCuando se compila el kernel en una máquina para correr en otraMucho más rápido que compilar en el target.Más sencillo usar las herramientas de desarrollo en el desktop.Para diferenciarlos de los compiladores nativos, los crosscompiladoresse les cambia los nombres. Ejemplos:mips­linux­gccm68k­linux­uclibc­gccarm­linux­gnueabi­gccSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>133


Especificar el cross­compiladorLa arquitectura de la CPU y qué compilador usar se especifican conlas variables ARCH and CROSS_COMPILE del Makefile.El Makefile define CC = $(CROSS_COMPILE)gccLos comentarios del Makefile dan más detalles.Lo más fácil sería modificar el Makefile.Ejemplo, plataforma ARM, cross­compiler: arm­linux­gccARCH ?= armCROSS_COMPILE ?= arm­linux­Otras soluciones●●●Agregar ARCH y CROSS_COMPILE a la línea de comando del makeDefinirlas como variables de entorno.No olvidarse de configurar estos valores para todos los pasos.Sino el kernel se confunde!SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>134


Configurando el Kernelmake xconfigIgual que la compilación nativaLas opciones van a ser diferentesNo olvidar de poner el tipo de dispositivo correcto!SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>135


Archivos de configuraciónassabet_defconfig integrator_defconfig mainstone_defconfigbadge4_defconfig iq31244_defconfig mx1ads_defconfigbast_defconfig iq80321_defconfig neponset_defconfigcerfcube_defconfig iq80331_defconfig netwinder_defconfigclps7500_defconfig iq80332_defconfig omap_h2_1610_defconfigebsa110_defconfig ixdp2400_defconfig omnimeter_defconfigedb7211_defconfig ixdp2401_defconfig pleb_defconfigenp2611_defconfig ixdp2800_defconfig pxa255­idp_defconfigep80219_defconfig ixdp2801_defconfig rpc_defconfigepxa10db_defconfig ixp4xx_defconfig s3c2410_defconfigfootbridge_defconfig jornada720_defconfig shannon_defconfigfortunet_defconfig lart_defconfig shark_defconfigh3600_defconfig lpd7a400_defconfig simpad_defconfigh7201_defconfig lpd7a404_defconfig smdk2410_defconfigh7202_defconfig lubbock_defconfig versatile_defconfighackkit_defconfig lusl7200_defconfigSe encuentran en arch/arm/configsSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>136


Usando los archivos de ejemploSe proveen ejemplos de configuración para muchas archs yplacas. Buscar si está la nuestra en arch//configs/.Ejemplo: Si tenemos que usar acme_defconfig, corremos:make acme_defconfigUsar arch//configs/ es una muy buena manera dedistribuir la configuración a un grupo de usuarios odesarrolladores.Como con todos los comandos de makeHay que especificar la archcorriendo make _defconfigSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>137


Compilando el KernelCorrermakeCopiararch//boot/zImageal almacenamiento del dispositivo.Uno puede modificar arch//boot/install.shpara que make install lo haga automáticamente.make INSTALL_MOD_PATH=/ modules_instally copiar /lib/modules/ a /lib/modules/ en elalmacenamiento del dispositivo.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>138


Práctica – Cross­compilandoConfigurar el entorno de desarrolloConfigurar el MakefileCross­compilar el kernel para unaplataforma armEn esta plataforma, usar elbootloader para bootear el kernel.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>139


Uso <strong>embebido</strong> del Kernel <strong>Linux</strong>Usando módulos del kernelSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>140


MódulosMódulos: Agregan una funcionalidad dada al kernel (drivers,soporte a algún filesystem, y muchas otras cosas).Se pueden cargar y descargar en cualquier momento, sólocuando se necesiten.Sirven para desarrollar drivers sin reiniciar: cargar, probar,descargar, compilar, cargar...Útil para poder hacer la imagen del Kernel chica. Importantepara las distribuciones de PC.Sirve para reducir el tiempo de booteo. No perdés tiempoiniciando drivers que no usas, o que vas a necesitar después.Cuidado: una vez cargado, tienen permiso completo en todo elespacio del kernel. Sin protecciones especiales.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>141


Dependencia de los módulosAlgunos módulos de kernel depende de otros, que necesitan sercargados primero.Ejemplo: el módulo usb­storage depende de los módulosscsi_mod, libusual y usbcore.Las dependencias se describen en /lib/modules//modules.depEste archivo se genera al ejecutar make modules_install.Se puede actualizar modules.dep a mano, corriendo (comoroot):depmod ­a []SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>142


Kernel logCuando un nuevo módulo se carga, información relacionadaaparece en el log del Kernel.El kernel guarda sus mensajes en un buffer circular. (para noocupar toda la memoria con mensajes)Los mensajes están disponibles usando el comando dmesg.(“diagnostic message”)Los mensajes también se muestran en la consola del sistema(se pueden filtrar los mensajes por nivel en/proc/sys/kernel/printk )Se pueden agregar cosas a su log desde userspace:echo “Debug info” > /dev/kmsgSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>143


Utilidades de módulosmodinfo modinfo .koPide información de un módulo: parámetros, licencia,descripción y dependencias.Muy útil antes de cargar un módulo.sudo insmod .koTrata de cargar un módulo. Hay que darle el pathcompleto al archivo.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>144


Problemas al cargar un móduloCuando una carga falla, insmod no suele dar los detallesnecesarios.En general se encuentran en el kernel log.Ejemplo:> sudo insmod ./intr_monitor.koinsmod: error inserting './intr_monitor.ko': ­1Device or resource busy> dmesg[17549774.552000] Failed to register handler forirq channel 2SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>145


Utilidades de módulossudo modprobe Es el uso más común de modprobe: trata de cargar elmódulo (incluyendo sus dependencias). Muchas otrasopciones disponibles. Modprobe automáticamente buscaen /lib/modules// para el módulo de esenombre.lsmodMuestra una lista con los módulos cargados. Compararlocon /proc/modules!SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>146


Utilidades de módulossudo rmmod Trata de descargar un módulo.Sólo se puede si el módulo no está en uso.(por ejemplo, no hay más procesos abriendo su archivode dispositivo)sudo modprobe ­r Trata de descargar el módulo y todas susdependencias que no estén siendo usadas.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>147


Dando parámetros a los módulosPara conocer los parámetros disponibles:modinfo snd­intel8x0mUsando insmod:sudo insmod ./snd­intel8x0m.ko index=­2Usando modprobe:Configurar los parámetros en /etc/modprobe.conf o en otros archivos en/etc/modprobe.d/:options snd­intel8x0m index=­2Mediante la linea de comandos del kernel, cuando el módulo está compiladoestático en el kernel:snd­intel8x0m.index=­2driverparámetrovalorSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>148


Lecturas útiles<strong>Linux</strong> Kernel in a Nutshell, Dec 2006Por Greg Kroah­Hartman, O'Reillyhttp://www.kroah.com/lkn/Una buena referencia en configuración, compilacióny administración de las fuentes del kernel.Disponible gratis on­line!Buena compañía a los libros impresos,podemos buscar!Se puede bajar en pdf de:http://free­electrons.com/community/kernel/lkn/SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>149


<strong>Linux</strong> <strong>embebido</strong><strong>Workshop</strong><strong>Linux</strong> <strong>Embebido</strong>Lucas ChiesaJoaquín de AndrésGermán BassiLaboratorioSistemas <strong>embebido</strong>sFIUBACreative Commons BY-SA 3.0 licenseBasado en : http://free-electrons.com/docs/embedded-linux-intro


Sistemas <strong>embebido</strong>sDesarrollo desistemas <strong>Linux</strong><strong>Embebido</strong>sSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>151


ContenidosUsando componentes libresHerramientas para usar en nuestro dispositivo●●●●RedesUtilidades de sistemaIntérpretes de lenguajesBases de datosCompilando el sistemaEmuladoresSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>152


<strong>Linux</strong> <strong>embebido</strong>Seleccionando componentes libres para nuestrosistema <strong>embebido</strong> <strong>Linux</strong>SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>153


Librerías y aplicaciones de 3rosUna de las ventajas de usar <strong>Linux</strong> <strong>embebido</strong> es la gran cantidadde librerías y aplicaciones que uno puede utilizar para suproducto.●Están disponibles y se pueden distribuir gratuitamente, y gracias asu naturaleza abierta, se pueden analizar y modificar para ajustar anuestras necesidades.Sin embargo, reusar estos componentes en forma eficiente no essiempre una tarea fácil. Uno debe:●●●●Encontrar los componentesSeleccionar el más apropiadoCross­compilarloIntegrarlo a nuestro sistema y nuestras otras aplicacionesSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>154


Encontrar componentesFreshmeat, una página de referencia para muchos proyectoslibreshttp://www.freshmeat.netFree Software Directoryhttp://directory.fsf.orgMirar otros sistemas <strong>Linux</strong> <strong>embebido</strong>s y ver qué usanMirar los paquetes distribuidos por los sistemas de compilaciónde sistemas <strong>embebido</strong>s.●Se suelen distribuir por ser apropiados para <strong>embebido</strong>s.Preguntar a la comunidad o a GoogleVamos a ver algunas de las aplicaciones comunesSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>155


Seleccionando componentesNo todo el software libre está en un estado listo para usarse. Hayque prestar atención a:●●●●Vitalidad del desarrollador y la comunidad de usuarios. Esta vitalidades la que asegura el mantenimiento a largo plazo y un buen soporte.Se puede medir mirando a la lista de correo y a la actividad en elsistema de control de versiones.Calidad de un componente. Típicamente, si el software se usa en<strong>embebido</strong>s y tiene una comunidad de usuario importante, significaque es de una calidad razonable.Licencia. La licencia de un componente tiene que coincidir connuestras restricciones de licenciamiento. Por ejemplo, librerías GPLno se pueden usar en aplicaciones propietarias.Requerimientos técnicos. Por supuesto, el componente tiene quecoincidir con los requerimientos técnicos que tenemos. ¡No olvidarque le podemos agregar cosas que le falte!SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>156


LicenciasTodo el software libre te da las siguientes libertades:●●●●Libertad de usarLibertad de estudiarLibertad para copiarLibertad para modificar y distribuir modificacionesVer http://www.gnu.org/philosophy/free­sw.html para unadefinición de software libre.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>157


LicenciasSe separan de dos categorías●●Las copyleftLas no copyleftEl concepto de « copyleft » es pedir la reciprocidad en laslibertades dadas a un usuario.El resultado es que cuando uno recibe software con copyleft ydistribuye una versión modificada del mismo, tiene que hacerlosobre la misma licencia.●●Mismas libertades para los nuevos usuarios.Trata de fomentar que se contribuyan las mejoras realizadas enlugar de mantenerlas secretasLas no­copyleft no tienen ese requerimientos. Podés nocompartir tus cambios, pero se necesita atribución.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>158


GPLGNU General Public LicenseCubre el ~55% de los proyectos.●Incluye el Kernel, Busybox y muchas otras aplicacionesEs una licencia copyleft●●Requiere el trabajo derivado en la misma licenciaProgramas que linkean con librerías GPL, tienen que ser GPL.Algunos programa usan la versión 2 (<strong>Linux</strong> kernel, Busybox yotros)Cada vez más, se adopta la versión 3, escrita en 2007●Impacta en sistemas <strong>embebido</strong>s. La v3 exige que el usuario puedaejecutar la versión modificada en el dispositivo.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>159


GPL: redistribuciónNo hay obligaciones si no se distribuye el código●Podes mantener los cambios secretos hasta el día de venderlo.Luego se pueden distribuir copias binarias siempre y cuando:●●●Se provea el binario con el código en algún medio físico.Se provea el binario con instrucciones para obtener el código, quetienen que servir por tres años.Detallado en la sección 6 de la licencia GPLEn todos los casos la atribución y la licencia se debe preservar.●Ver secciones 4 y 5SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>160


LGPLGNU Lesser General Public LicenseCubre el ~10% de los proyectos libres.Es una licencia copyleft●●●Versiones modificadas se deben distribuir con la misma licencia.Pero los programas que linkean contra LGPL no necesitanmantener la licencia, pueden ser propietarios.Sin embargo, el usuario tiene que tener la posibilidad de actualizarla librería. Se debe usar linkeo dinámico.Usado en lugar de GPL es muchas librerías, incluidas laslibrerías de C●Algunas excepciones: MySQL, o Qt


Licencias: ejemplosSe hacen modificaciones al Kernel (agregar drivers o adaptar auna placa), a Busybox, U­Boot u otro componente GPL●Debés dar las versiones modificadas bajo la misma licencia, y estarlisto para distribuir el código a los distintos clientes.Se hacen modificaciones a la librerías de C o a otra bibliotecaLPGL●Se debe distribuir la versión modificada bajo la misma licencia.Se crea una aplicación con una biblioteca LGPL●Podes mantener la aplicación propietaria, pero tenés que linkeardinámicamente.Haces modificaciones a código no copyleft●Podes mantener las modificaciones propietarias, pero tenés quedar crédito a los autores.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>162


Licencias sin copyleftHay muchas licencias sin copyleft, pero son todas muy similaresen sus requerimientos.Algunos ejemplos●Apache (~ 4%)●BSD (~ 6%)●MIT (~ 4%)●Artistic license (~9 %)SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>163


Licencia BSDCopyright (c) , All rights reserved.Redistribution and use in source and binary forms, with orwithout modification, are permitted provided that the followingconditions are met:* Redistributions of source code must retain the abovecopyright notice, this list of conditions and the followingdisclaimer.* Redistributions in binary form must reproduce the abovecopyright notice, this list of conditions and the followingdisclaimer in the documentation and/or other materials providedwith the distribution.* Neither the name of the nor the names ofits contributors may be used to endorse or promote productsderived from this software without specific prior writtenpermission.[...]SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>164


¿Es esto software libre?La mayoría de los proyectos usan una de ~10 licencias bienconocidas. Es bastante fácil para la mayoría de los proyectosentender su licencia.Si no es una conocida, leer la licencia.Buscar la opinión de la FSFhttp://www.fsf.org/licensing/licenses/O la de OSIhttp://www.opensource.org/licensesDebian puede ser una buena referencia tambiénSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>165


¡Respetar las licencias libres!El software libre no es de dominio público. Los distribuidores tienenobligaciones, según las licencias.●●●Antes de usar un componente, verificar que la licencia cumpla connuestras limitaciones.Estar seguro de mantener una lista de todo el software libre que seusa. La versión original y todos las modificaciones y adaptacionesbien separadas.Cumplir con los requerimientos de la licencia, antes de distribuirnuestro productoLas licencias de software libre fueron aplicadas en juicios.●●GPL­violations.org, http://www.gpl­violations.orgSoftware Freedom Law Center, http://www.softwarefreedom.org/SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>166


Desarrollo de sistemas <strong>Linux</strong>Algunas aplicaciones destacadasSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>167


Dropbear: cliente y server sshhttp://matt.ucc.asn.au/dropbear/dropbear.htmlServer ssh de muy poco footprint, para sistemas <strong>embebido</strong>s.Sirve tanto como cliente y como server!Tamaño: 110 KB, compilado estático con uClibc en i386.(OpenSSH cliente y server: approx 1200 KB,compilando dinámico con glibc en i386)Útil para:●●Te da acceso a una terminal en el dispositivo.Te permite copiar archivos al target (scp o rsync ­e ssh).SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>168


Beneficios de una interfaz webMuchos dispositivos de red, sólo tienen esa interfazEjemplos: modems / routers, cámaras IP, impresoras...¡No hay que hacer programas especiales para usar en lascomputadoras conectadas al dispositivo! ¡No hay problemasoportando todos los sistemas operativos!Sólo se necesita escribir una página HTML estática o dinámica(posiblemente con mucho JavaScript, ejecutado en el cliente).Es una manera simple de poder cambiar la configuración deldispositivo.Reduce el costo de hardware. No necesitamos agregar LCDs,menos botones. Sólo necesitamos un poco más dealmacenamiento.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>169


thttpdTiny/Turbo/Throttling HTTPserverhttp://acme.com/software/thttpd/SimpleImplementa HTTP/1.1 mínimo(o quizá un poquito más)Simple para configurar y usar.PequeñoTamaño pequeño: 88K,Apache: 264KMuy poco uso de memoria, nohace forks y tiene cuidado conel uso de memoria.PortableCompila bien en la mayoríade los sistemas Unix.RápidoCasi tan rápido como losservers más importantes.SeguroDiseñado para proteger alsistema que lo ejecuta deataques.Otros servers: BusyBox,Lighttpd, BOASASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>170


IntérpretesHay interpretes para los lenguajes de scripts más comunes,útiles para:●●●Desarrollo de aplicacionesDesarrollo de servicios web.ScriptingLenguajes soportados●●●●●●LuaPythonPerlRubyTCLPHPSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>171


Bases livianas ­ SQLitehttp://www.sqlite.orgSQLite es una pequeña librería de C que implementa un motor de SQLautocontenido, embebible, liviano, y sin configuración.Es el motor de bases de datos preferido para los sistemas <strong>embebido</strong>s.●●Se puede utilizar como una librería normal.Se puede embeber directamente en una aplicación, incluso en unapropietaria ya que SQLite es liberada al dominio público.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>172


Desarrollo de sistemas <strong>Linux</strong>Ejemplos de dispositivos realesSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>173


Aplicaciones industrialesEn muchas aplicaciones industriales, el sistema es responsablede observar y controlar un dispositivo.Dicho sistema es usualmente relativamente simple en términosde componentes:●●●●●KernelBusyBoxLibrería de CAplicaciones que usan directamente la librería de C, posiblementeutilizando las capacidades real­time del Kernel <strong>Linux</strong>.Posiblemente un servidor Web para el control remoto del equipo.También puede ser otro servidor implementando un protocolopropio.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>174


Portarretratos digital: requerimientosEjemplo tomado de una conferencia por Matt Porter, EmbeddedAlley en ELC 2008Hardware: ARM SoC con DSP, audio, 800x600 LCD, MMC/SD,NAND, botones, parlantesEl portarretratos tiene que poder:●●●●●●Dibujar en el LCDDetectar la conexión de una SD, notificar a las aplicaciones de estopara que pueden crear un catálogo de imágenes en la memoria.Interfaz 3D moderna con lindas transiciones.Navegación por medio de botones.Reproducción de audio (MP3, playlists, ID3 tag)Escalar y rotar JPEGSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>175


Portarretratos digital: componentesSistema base●●●●●●Componentes presentes en prácticamente todos los sistemas <strong>Linux</strong><strong>embebido</strong>s.El bootloader U­BootEl Kernel <strong>Linux</strong>– Drivers para SD/MMC, framebuffer, sonido, dispositivos de entradaBusyboxSistema para compilar el sistema, utilizaron OpenEmbeddedComponentes: U­Boot, Kernel, BusyBoxSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>176


Portarretratos digital: componentesManejo de eventos e inserción de una memoria SD.●●●●udev recibe el evento del Kernel, crea los nodos de los dispositivosy envía los eventos a HAL.HAL mantiene una base de datos de dispositivos disponibles yprovee una interfaz D­Bus.D­Bus para conectar HAL con la aplicación. La aplicación sesuscribe a los eventos de HAL por medio de D­Bus y de esta formase entera cuando hay nuevos eventos de hardware.Componentes: udev, hal, dbusSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>177


Portarretratos digital: componentesAbrir imágenes JPEG●●libjpeg para decodificar las imágenes.jpegtran para escalar y rotar las imágenes.●FIM (Fbi Improved) para ditheringSoporte MP3●●●●libmad para reproducirlibid3 para leer los tags mp3libm3u para soportar playlistsSe usan componentes provistos por el fabricante para utilizar elDSP para reproducir MP3.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>178


Portarretratos digital: componentesInterfaz 3D●Vincent, una implementación libre de OpenGL ES●Clutter, API de alto nivel para desarrollar aplicaciones 3D.La aplicación en si:●●●●●●Maneja eventos de la SDUsa las librerías de JPEG para decodificar y dibujar las imágenes.Recibe los eventos de entrada de los botones y dibujar una interfazOpenGL programada utilizando Clutter.Maneja las configuraciones de usuario.Reproduce los archivos MP3 con las librerías relacionadas.Pasa las fotos en forma de diapositivas.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>179


Desarrollo de sistemas <strong>Linux</strong>Compilando el sistemaSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>180


Compilando el sistemaObjetivos●●Integrar todos los componentes de software, tanto los deterceros como los propios, obteniendo un rootfs funcional.Involucra descargar, extraer, configurar, compilar e instalartodos los componentes. Se puede necesitar resolverproblemas y adaptar las configuraciones.Muchas soluciones●●●ManualmenteHerramientas de compilación de sistema.Distribuciones o filesystems pre armados.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>181


Compilando el sistema: manualmenteImplica realizar todos los pasos mencionados, a mano.Todas las bibliotecas y dependencias se deben configurar,compilar e instalar en el orden correcto.Algunas veces, el sistema de compilación usado por librerías oaplicaciones no facilita la cross­compilación, por lo que puedeser necesario adaptarlo.No hay infraestructura para reproducir una compilación desdecero. Puede ser problemático si necesitamos cambiar uncomponente o si otra persona retoma el proyecto, etc..SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>182


Compilando el sistema: manualmenteNo es recomendado para proyectos que van a entrar enproducción.Sin embargo, usando las herramientas automáticas, de vez encuando nos vamos a encontrar con problemas particulares.Tener un entendimiento básico de cómo se compila un sistemamanualmente resulta de mucha utilidad para arreglar losproblemas encontrados con las herramientas automáticas.●Vamos a analizar una herramienta automática y usarla en unapráctica.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>183


Cimientos del sistemaUn rootfs básico necesita por lo menos:●●●●Una jerarquía tradicional de directorios, con /bin, /etc,/lib, /root, /usr/bin, /usr/lib, /usr/share,/usr/sbin, /var, /sbinUn conjunto de utilidades básicas, que proveen por lo menos elprograma init, un shell y otros comandos tradicionales de Unix.Usualmente es provisto por BusyBox.La librería de C y otras librerías relacionadas (thread, math, etc.),instaladas en /libUnos pocos archivos de configuración, como /etc/inittab, yscripts de inicialización en /etc/init.dSobre estos cimientos comunes a casi todos los sistemas,podemos agregar componentes nuestros o de terceros.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>184


Herramientas: principiosExisten diferentes herramientas para automatizar el procesode compilar el sistema target, incluyendo el sistema, Kernely algunas veces el toolchain.Ellas, automáticamente descargan, configuran, compilan einstalan todos los componentes en el orden correcto.Muchas veces, aplican parches para arreglar problemas porcross­compilar.Ya contienen una gran cantidad de paquetes que deberíancubrir todos los requerimientos principales, y son fácilmenteextensibles.La compilación se transforma en algo reproducible, lo quepermite cambiar componentes, actualizarlos, arreglar bugs,más fácilmente.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>185


Herramientas disponiblesMuchas opcionesBuildroot, desarrollado por la comunidadhttp://www.buildroot.netPTXdist, desarrollado por Pengutronixhttp://www.pengutronix.de/software/ptxdist/index_en.htmlOpenWRT, originalmente un fork de Buildroot para routers WiFi,ahora un proyecto más genérico.http://www.openwrt.orgLTIB, desarrollado principalmente por Fresscale. Buen soporte paraplacas Freescale (algo de NXP). Comunidad pequeña.http://www.bitshrine.org/OpenEmbedded, más flexible pero más complejohttp://www.openembedded.orgHerramientas específicas de un fabricante (de silicio o soporte en<strong>Linux</strong>)SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>186


BuildrootPermite compilar el toolchain, un root fs con muchas aplicacionesy librerías, un bootloader y una imagen del Kernel.Soporta compilar toolchains sólo con uClibc, pero puede usaruno externo con glibc.Más de 500 aplicaciones y librerías integradas. Desde las cosasmás básicas hasta stacks complejos como: X.org, Gstreamer, Qt,Gtk, Webkit, etc.Buen soporte para sistemas pequeños y medianos, confunciones fijas.●●No soporta generación de paquetes (.deb or .ipk)Necesita una recompilación completa por casi cualquier cambiode configuración.Comunidad activa, un release cada 3 meses.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>187


BuildrootLa configuración se realizamediante una interfaz *configsimilar a la del Kernelmake menuconfigPermite definir●●●●●Arquitectura y CPUConfiguración del toolchainConjunto de aplicaciones ylibrerías para agregarImágenes de FS para generarConf. del Kernel y del BootloaderCompila todo ejecutando:makeSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>188


OpenEmbeddedEl sistema más versátil y poderoso para armar un sistema <strong>Linux</strong><strong>Embebido</strong>.●●Una colección de recetas “recipes” (archivos .bb)Una herramienta que procesa esas recetas: bitbakeIntegra más de 2000 aplicaciones y librerías, es altamenteconfigurable, puede generar paquetes (.ipk), no recompila todoal cambiar una configuración.La configuración se hace editando unos cuantos archivos deconfiguración.Bueno para sistemas más grandes o para gente que buscaconfigurabilidad y extensibilidad.Desventajas: no hay releases estables, difícil de aprender, muylento en la primera compilación.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>189


DistribucionesDebian GNU/<strong>Linux</strong>, http://www.debian.orgDisponible para ARM, MIPS y PowerPCProvee un sistema listo para usar con todo el software que puedasnecesitar.Mucha flexibilidad gracias al sistema de paquetes. Sólo sirve si haymucho almacenamiento (> 300 MB) y RAM (> 64 MB).El software se compila en forma nativa por omisión.Podes armar tus propias imágenes en x86 usando el comandodebootstrap.Emdebian es un proyecto para hacer Debian mejor para <strong>embebido</strong>s.Utiliza los paquetes de Debian, reduciendo las dependencias, conmenos configuración, saca la documentación, soporta uClibc...Verhttp://emdebian.org.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>190


DistribucionesUbuntu GNU/<strong>Linux</strong>OtrosBasado en Debian, con algunas “mejoras”Un nuevo release cada 6 meses,soporte por 18 meces o hasta 3 años.Suportado en ARM, >= Cortex A8. Provee binarios Thumb2.Pero no soporta Neon todavía.Buena solución para dispositivos multimedia.Fedora también soporta ARM, pero no es muy mantenido.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>191


Distribuciones embebidasExisten distribuciones específicas para <strong>embebido</strong>sMeego: http://meego.com/Apunta a celulares, reproductores de multimedia,netbooks, Tvs, IVI.Soportado por Intel y Nokia (más o menos).Android: http://www.android.com/Distribución de Google para teléfonos y tablet PCs.Salvo el Kernel, un userspace muy diferente deotras distros. Muy exitosa, muchas aplicacionesdisponibles (muchas propietarias).Ångström: http://www.angstrom­distribution.org/Apunta a PDAs y MIDs (Siemens Simpad...)Binarios para arm little endian.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>192


Práctica – BuildrootCompilar un sistemausando Buildroot.Observar que tan fácil es!SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>193


Sistemas de archivos de bloquesSistemas dearchivos debloquesSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>194


Block vs. FlashLos dispositivos de almacenamiento se clasifican en doscategorías: block devices y flashes●Son manejados por subsistemas diferentes y usan sistemas dearchivos diferentes.Block devices se pueden leer y escribir de a bloques, sin borrar yno se gastan por usarlos muchas veces.●●Discos rígidos, floppy, RAM.Pendrives USB, Compact Flash, SD, son basados en flash, perotienen integrados un controlador que emula un dispositivo debloque.Flash, necesitan ser borradas, normalmente en bloques másgrandes que el tamaño de “bloque”. Llamado eraseblock●NOR y NAND flashSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>195


Block filesystems tradicionalesFilesystems tradicionalesPueden quedar en un estado no coherente después deun problema del sistema o corte de luz. Requiere unchequeo completo al reiniciarext2: filesystem tradicional de <strong>Linux</strong>(se repara con fsck.ext2)vfat: Windows filesystem tradicional(se repara con fsck.vfat en GNU/<strong>Linux</strong> o Scandisken Windows)SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>196


Filesystems con journalsDiseñados parapermanecer enestados correctos,incluso después decortes de luz.Todas las escriturasson primero escritasal journal antes de serpasadas a losarchivos.User­spaceKernel space(filesystem)AplicaciónEscribe unaentrada al journalEscribe el archivoBorra el journalEscribe a un archivoSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>197


Recuperación después de un corteReiniciarDescartarentradasincompletasNoJournalvacío?SiGracias al journal elsistema de archivosnunca se deja en unestado corrupto.Igualmente se puedenperder los últimoscambios antes delapagón.EjecutarjournalFilesystem OKSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>198


filesystems de bloques con journalsfilesystems de bloques con journals:ext3: ext2 con una extensión para usar journalext4: la nueva generación, con muchas mejoras. Ya se puedeusar y es el fs por omisión en distros modernas.El Kernel <strong>Linux</strong> soporta muchos otros sistemas de archivos:reiserFS, JFS, XFS, etc. Cada uno con sus característicaspropias, pero en general orientados a aplicaciones particulares.btrfs (“Butter FS”)La próxima generación de los ext. En el Kernel, pero todavíaexperimental.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>199


SquashfsSquashfs: http://squashfs.sourceforge.netReemplaza a un fs anterior: Cramfs! Es para hacer fs read­only.Tamaño máximo del fs: 2 64 bytes.Logra alta compresión y alto desempeño.Soporta tamaños de bloque de hasta 64 K (en lugar de 4K), tienemayor compresión y hasta detecta archivos duplicados!Incluido en el Kernel desde 2.6.29. Se usan parches para lasanteriores.Benchmarks: (3 veces más chicos que ext3, y 2­4 veces más rápido)http://elinux.org/Squash_Fs_ComparisonsSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>200


tmpfsÚtil para mantener datos en RAM: archivos de log, información temporal...No usar ramdisks! Tienen muchos problemas: tamaño fijo, el espaciolibre no se puede usar como RAM, archivos duplicados en RAM (en eldispositivo y en el cache de archivos)!Configuración de tmpfs: File systems ­> Pseudo filesystemsVive en el cache de archivos. No pierde RAM: se agranda y se achicapara acomodar a los archivos, no duplica y puede mandar páginas aswap si es necesario.Cómo usarlo: seleccionar diferentes nombres para los “dispositivos” parareconocerlo. Ejemplos:mount ­t tmpfs varrun /var/runmount ­t tmpfs udev /devVer Documentation/filesystems/tmpfs.txt.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>201


Usando read only y read writeEs una buena idea separar el uso de los fs de bloquesUna partición comprimida read only (Squashfs)Típicamente para el root fs (binarios, kernel...).Compresión ahorra espacio. Read­only previene errores ycorrupción de datos.Una partición read­write con un fs con journal (como ext3)Usado para guardar datos de configuración.Garantiza la integridad del fs después de apagones.Guardar en RAM archivos temporales, como logs (tmpfs)SquashfsRead­onlyrootfilesystemcomprimidoext3read­writeconfiguracióny datos deusuariotmpfsread­writedatos volátilesBlock StorageRAMSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>202


Filesystems FlashFilesystemsFlashSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>203


El subsistema MTDMTD: Memory Technology Devices (flash, ROM, RAM)Interfaz de filesystems de <strong>Linux</strong>Módulos de “usuario”MTDUBIjffs2 Char device Block deviceyaffs2Read­only block deviceFlash Translation Layerspara emular dispositivos debloquesalgoritmos patentados!FTL NFTL INFTLDrivers de chips MTDNAND flashDiskOnChip flashROM chipsNOR flashRAM chipsHardwareSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>204


Dispositivos MTDSon visibles en /proc/mtdEl driver mtdchar crea un dispositivo de caracteres para cadadispositivo MTD en el sistema.●●●Usualmente llamado /dev/mtdX, major 90. minors pares paraacceso rw y minors impares para acceso ro.Provee ioctl() para borrar y manejar la flashUsado por mtd­utilsEl driver mtdblock crea un dispositivo de bloque por cada MTD delsistema.●●Usualmente llamado /dev/mtdblockX, major 31. El minor es elnúmero del MTD correspondiente.Permite leer y escribir en bloques. No soporta sectores malos niwear leveling.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>205


Haciendo particiones en MTDUsualmente se hacen particiones en los MTD●Permite usar diferentes áreas de la flash con diferentes propósitos:FSRO, FSRW, backup, bootloader, kernel, etc.No tienen su propia tabla de particiones. Las particiones sedeben describir externamente.●●Hard­coded en el código del KernelEspecificado en la línea de comandos del KernelCada partición crea un dispositivo MTD diferente.●●Diferencias con el esquema de nombres de los dispositivos debloques. (hda3, sda2)/dev/mtd1 puede ser la segunda partición del primer MTD o laprimera del segundo.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>206


Haciendo particiones en MTDLas particiones MTD son definidas en el Kernel, en la definición delas placas: arch/arm/mach­at91/board­usb­a9263.cEjemplo:static struct mtd_partition __initdata ek_nand_partition[] = {{.name = "<strong>Linux</strong> Kernel",.offset = 0,.size = SZ_16M,},{};},{}.name = "Root FS",.offset = MTDPART_OFS_NXTBLK,.size = 120 * SZ_1M,.name = "FS",.offset = MTDPART_OFS_NXTBLK,.size = 120 * SZ_1M,SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>207


Modificando particiones MTDPor suerte las particiones MTD se pueden definir por la línea decomandos.Primero hay que encontrar el nombre de los dispositivos MTD.Mirando el log del Kernel:NAND device: Manufacturer ID: 0xec, Chip ID:0xda (Samsung NAND 256MiB 3,3V 8­bit)Scanning device for bad blocksBad eraseblock 2000 at 0x0fa00000Creating 3 MTD partitions on "atmel_nand":0x00000000­0x01000000 : "<strong>Linux</strong> Kernel"0x01000000­0x08800000 : "Root FS"0x08800000­0x10000000 : "FS"SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>208


Modificando particiones MTDSe puede usar el parámetro de Kernel mtdpartsEjemplo:mtdparts=atmel_nand:2m(kernel)ro,1m(rootfs)ro,­(data)Recién definimos 3 particiones en el dispositivo atmel_nand:●●●kernel (2M)rootfs (1M)dataLos tamaños de las particiones tienen que ser múltiplos del tamañode los eraseblock.Se pueden usar tamaños en base 16. Recuerden:0x20000 = 128k, 0x100000 = 1m, 0x1000000 = 16mro crea la partición como de sólo lectura­ significa todo el espacio restante.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>209


mtd­utilsUn conjunto de utilidades para manejar MTDs●●●●●●mtdinfo da información detallada de un MTDflash_eraseall borra completamente un MTDflashcp para escribir a NOR flashnandwrite para escribir a NAND flashUtilidades UBIHerramientas para crear imágenes de fs de flash: mkfs.jffs2,mkfs.ubifsUsualmente se encuentran en el paquete mtd­utils de ladistribución.Ver http://www.linux­mtd.infradead.org/SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>210


jffs2http://www.linux­mtd.infradead.org/doc/jffs2.htmlEl estándar actual para MTDsAPI de archivosLindas funciones: compresión on the fly (reduce lugar yoperaciones de I/O), tolerante a cortes de luz, wearlevelingy ECC.Desventajas: no escala bienJFFS2filesystem●●El tiempo de montaje depende de tamaño del fs:el Kernel tiene que escanear todo el fs al momentode montar, para saber qué bloque pertenece acada archivo.Se necesita usar la opción del KernelCONFIG_JFFS2_SUMMARY para reducir esteproblema. Guardar esta info en flash. (de 16s a0.8s para una partición de 128 MB).MTD driverFlash chipSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>211


jffs2 – Cómo usarloEn el targetSe necesita mtd­utils del proyecto MTD, o su variante paraBusyboxBorrar y formatear una partición jffs2:flash_eraseall ­j /dev/mtd2Montar la partición:mount ­t jffs2 /dev/mtdblock2 /mnt/flashAgregar el contenido escribiendo los archivos.(copiarlo por red o de otro almacenamiento)Otra posibilidad: usar una imagen jffs2:flash_eraseall /dev/mtd2nandwrite ­p /dev/mtd2 rootfs.jffs2SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>212


Cómo crear la imagen jffs2mkfs.jffs2: comando disponible en el paquete mtd­utils.Cuidado: a diferencia de algunos comandos mkfs, no crea elfilesystem sino una imagen.Primero, encontrar el tamaño eraseblock, U­Boot nand info:Device 0: NAND 256MiB 3,3V 8­bit, sector size 128 KiBLuego crear la imagen en el desktop:mkfs.jffs2 ­­pad ­­no­cleanmarkers­­eraseblock=128 ­d rootfs/ ­o rootfs.jffs2La opción ­­pad completa la imagen hasta el final del últimoereaseblock.No hay problema si la partición jffs2 es más chica que lapartición. El jffs2 va a usar toda la partición de todas formas.La opción ­­no­cleanmarkers es sólo para NAND flash.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>213


Montando jffs2 en el hostÚtil para editar imágenes jffs2 en el equipo de desarrollo. Es unatarea un poco compleja, esto es un ejemplo:Primero necesitamos el tamaño del ereaseblock que usamos paracrear la imagen jffs2. Asumimos que es 128KiB (131072 bytes).Creamos un dispositivo de bloque con la imagenlosetup /dev/loop0 root.jffs2Emulamos un MTD desde un block usando el módulo de Kernelblock2mtdmodprobe block2mtd block2mtd=/dev/loop0,131072Finalmente, montamos el fs (crear /mnt/jffs2 si es necesario)mount ­t jffs2 /dev/mtdblock0 /mnt/jffs2SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>214


Inicializando jffs2 desde U­BootPodemos no querer tener mtd­utils en el target!Creamos la imagen jffs2 en el desktopEn la línea de comandos de U­Boot:●●●Bajamos la imagen jffs2 a RAM usando tftp.O la copiamos desde almacenamiento externo (FAT en USB, por ejemplo)La escribimos dentro de la partición MTD(las instrucciones exactas depende del tipo de memoria, NOR o NAND,las mismas que se usaron para escribir el Kernel). Estar seguros deescribir sólo el tamaño de la imagen y no más!Si se usa jffs2 como root agregar root=/dev/mtdblock yrootfstype=jffs2 a los argumentos del kernel.Limitación: necesitás separar la imagen jffs2 en varios archivos si es másgrande que el bloque de RAM.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>215


UBIUnsorted Block Imageshttp://www.linux­mtd.infradead.org/doc/ubi.htmlUn sistema de administración de volúmenes sobreMTD.Permite crear diferentes volúmenes lógicos y repartirlosentre todos los dispositivos físicos.Se encarga de administrar los eraseblocks y wearleveling. Facilita implementar los filesystems.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>216


UBIUBILogicalErase BlocksVolumen 1 Volumen 2LEB LEB LEB LEB LEB LEB LEBMTDPhysicalErase BlocksPEB PEB PEB PEB PEB PEB PEB PEB PEBLibreLibreSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>217


UBIFShttp://www.linux­mtd.infradead.org/doc/ubifs.htmlLa siguiente generación de jffs2, de los mismosprogramadores de linux­mtd.En <strong>Linux</strong> desde 2.6.27Trabaja sobre volúmenes UBI.Tiene mucho overhead de metadata paraparticiones chicas. (4M, 8M)API de archivosUBIFSUBIDriver MTDFlash chipSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>218


Layout UBIUBIFS montadoen /(de ubi0:rootfs)Vol.UBI:crudoUBIFSmontadoen/myapp(deubi0:data)JFFS2montado en/appsettings(de/dev/mtd1)UBIFS montado en/var/log(de ubi1:log)Volumen UBI: rootfsVol UBI: dataUBI Volume: logDispo. UBI ubi0Partición MTD 0Flash deviceParticiónMTD 1Dispo. UBI ubi1Partición MTD 2SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>219


UBI – Características principalesEscala: El tiempo de montaje, uso de memoria y velocidad deacceso casi no depende del tamaño de la memoria.Monta velozmente: No necesita escanear todo el dispositivo almomento de montar.Write­back: Mejora notoriamente el desempeño del sistema.Tolerante a cortes: Al ser un fs con journal no se corrompe por“apagadas” repentinas.Agrega mucho overhead en memoria. Lo hace casi imposible deusar con pocos megas de flash.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>220


SquashFShttp://squashfs.sourceforge.net/Filesystem para dispositivos de bloque. No soporta la API MTD.Sin embargo, como es read only, funciona bien con mtdblock,siempre y cuando el chip no tenga sectores defectuosos.Se puede usar para partes readonly del filesystem. Pero no tepodes confiar en él. Siempre pueden aparecer los sectoresdefectuosos.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>221


ConclusionesConvertir las particiones jffs2 a ubifs!A menos que tengas menos de 10MB dememoria, donde UBI pierde mucho lugar.Se puede usar SquashFS para meter todavía másdatos en la memoria flash. Recomendable usarlosobre UBI, para que todos los sectores participendel wear leveling y bad blocks.SquashFSMTD blockMTD APIUBIMTD driverFlash chipSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>222


Almacenamiento flash­blockLa flash no se puede acceder, sólo mediante la interfaz debloque.Por lo tanto, no hay manera de acceder a la interfaz de bajo nivelde la memoria y usar los FS de <strong>Linux</strong> para hacer wear leveling.No hay detalles de la capa (Flash Translation Layer) que usan.Éstos se guardan como secretos del fabricante y puedenesconder comportamientos pobres, o mala calidad.Por lo tanto, es muy recomendable limitar la cantidad deescrituras en estos dispositivos.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>223


Reduciendo las escriturasPor supuesto, no usar flash para swap (igualmente es raro tenerswap en <strong>embebido</strong>s)Montar read only o usar read only FSs (SquashFS) siempre que seaposibleMantener archivos volátiles en RAM (tmpfs)Usar la opción de montaje noatime, para evitar actualizar elfilesystem cada vez que se lea un archivo. Si se necesita saber eltiempo de acceso, usar la opción relatime (por omisión desde<strong>Linux</strong> 2.6.30).No usar la opción de montaje sync (escribir inmediatamente). Usarla llamada a sistema fsync() para forzar sincronización porarchivos.Podes no usar FSs con journal. Causan más escrituras, pero sonmás robustos (trade­off).SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>224


Lecturas recomendadasIntroducción a JFFS2 y LogFS:http://lwn.net/Articles/234441/Linda presentación sobre UBI:http://free­electrons.com/redirect/celf­ubi.htmlDocumentación de linux­mtd:http://www.linux­mtd.infradead.org/SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>225


Resumiendo...Datosvolátiles?NoRead­only?NoTipo dedispo.BlockTiene flash?SíSíMTDSíNoUsar squashfsUsar ext2con noatimeUsar tmpfsUsar UBIFSo JFFS2Usar ext3 o ext4Ver la documentación (con detalles) de todos los FSs del Kernel enDocumentation/filesystems/.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>226


Práctica – Sistemas flashCrear particiones en losdispositivos flash.Formatear la partición principalen SquashFS sobre mtdblock.Usar jffs2 para los datos.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>227


Desarrollo de sistemas <strong>Linux</strong>GNU / <strong>Linux</strong> desktopEmuladoresSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>228


qemuhttp://fabrice.bellard.free.fr/qemu/Emulador de procesador.Emulador de sistema completoEmula el procesador y varios periféricosSupporta: x86, x86_64, ppc, arm, sparc, mips, m68kPara saber que archs. están soportadas:qemu­system­arm ­M ?Emulación de i386, x86_64: cercana a la velocidad nativagracias al módulo de Kernel kqemu (ahora GPL v2!).SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>229


Otros emuladoresARM●●●SkyEye: http://skyeye.sourceforge.netEmula varias plataformas ARM (AT91, Xscale...) y puedebootear varios sistemas operativos. (<strong>Linux</strong>, uClinux, otros...)Softgun: http://softgun.sourceforge.netSistema ARM virtual con muchos periféricos on­board.Corre <strong>Linux</strong>.SWARM ­ Software ARM ­ emulador arm7http://www.cl.cam.ac.uk/~mwd24/phd/swarm.htmlPuede correr uClinuxColdFire emulatorhttp://www.slicer.ca/coldfire/Puede correr uClinuxSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>230


Desarrollo de <strong>Linux</strong> <strong>Embebido</strong>sReferenciasSASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>231


Lecturas útilesEmbedded <strong>Linux</strong> System Design and DevelopmentP. Raghavan, A. Lad, S. Neelakandan, Auerbach, Dec. 2005.http://free­electrons.com/redirect/elsdd­book.htmlBuilding Embedded <strong>Linux</strong> Systems, O'ReillyBy Karim Yaghmour, Jon Masters, Gilad Ben­Yossef andPhilippe Gerum, and others (including Michael Opdenacker),August 2008http://oreilly.com/catalog/9780596529680/Embedded <strong>Linux</strong> Primer, Prentice HallBy Christopher Hallinan, September 2006SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>232


Sitios útiles<strong>Linux</strong>Devices.com: http://linuxdevices.comNotas semanales con noticias y anuncios de dispositivosque usan <strong>Linux</strong>.Artículos, notas técnicas y catálogo de productos.Una página excelente para seguir los desarrollos de laindustria.SASE 2012 ­ <strong>Workshop</strong> <strong>Linux</strong> <strong>Embebido</strong>233

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!