Compilación del Kernel

1,478 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,478
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
24
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Compilación del Kernel

  1. 1. Desarrollo de entornos Linux Embebidos Formación in Company Linux kernel and driver development training Juan Sánchez - jsancheznav@gmail.com
  2. 2. <ul><li>Datos </li></ul><ul><ul><li>Portatil password sage3000+ </li></ul></ul><ul><ul><li>Máquina virtual 192.168.59.128, root/12345678 </li></ul></ul>Juan Sánchez - jsancheznav@gmail.com
  3. 3. Semana 2 de 4 / Sesión 3 de 8 Agenda Juan Sánchez - [email_address] Módulos del kernel de linux Bloqueo: proceso, progr, parado e interrupción Introducción al kernel de linux (1h) Detalles del arranque del núcleo Dispositivos de caracter. Kernel driver frameworks Conf, compilación y arranque del núcleo de linux Gestión memoria y acceso al hardware ✓ Controladores. Dispositivos, modelos y depuración Dispositivos DMA Estudio de un tipo específico de controlador (3h) 10 Mapa desarrollo de núcleo 2.6 7 6 5 4 3 2 1 9 8
  4. 4. La acción es el fruto propio del conocimiento. (Thomas Fuller) 4 Conf, compilación y arranque del núcleo <ul><li>Requerimientos </li></ul><ul><li>Aplicaciones dependientes de la versión del núcleo </li></ul><ul><li>Configuración y </li></ul>Juan Sánchez - jsancheznav@gmail.com
  5. 5. Migración a un nuevo núcleo <ul><li>Configuración, compiliación y arranque del núcleo </li></ul>Definir nuevo núcleo como núcleo por defecto y puesta en producción Selección de las opciones a compilar en el núcleo y compilación Descargar código del kernel desde http://www.kernel.org Descarga del fuente e instalarlo Verificación versionado y dependencias Configuración y construcción Reinicio sist y testeo completo Puesta en marcha Juan Sánchez - jsancheznav@gmail.com Configurar sistema para reinicio con el nuevo núcleo y testeo completo de servidor Verificar que el nuevo código es compatible con nuestras utilidades actuales
  6. 6. Herramientas necesarias <ul><li>Configuración, compiliación y arranque del núcleo </li></ul>Juan Sánchez - jsancheznav@gmail.com make --version Herramienta que busca en árbol src del núcleo llamando a compilador y enlazador &quot;Buscador&quot; paquete binutils ld -v Enlaza ficheros objetos generados por compilador con las librerías creando fichero ejecutable binario Enlazador gcc --version Traductor de .c a lenguaje máquina, analizando parse (lexico, sintaxis, semántica) Compilador Programa/Paquete Descripción Tipo
  7. 7. Aplicaciones dependientes <ul><li>Configuración, compiliación y arranque del núcleo </li></ul>Juan Sánchez - jsancheznav@gmail.com ps --version Conjunto de utilidades básicas gestión de procesos (ps, top, …) process tools (procps) tune2fs reiserfsck -V Conjunto de herramientas de gestión de los filesystem (ext*=e2fsprogs, reiserfs=reiserfsprogs) filesystem tools depmod --version Conjunto de utilidades de gestión del módulos del kernel (depmod, insmod, rmmod, modprobe, modinfo, …) module-init-tools fdformat --version Conjunto de utilidades básicas de linux (dmesg, fdformat, fsck, halt, kill, mkfs, reboot, swapon, whereis, …) util-linux Versión Descripción Utilidad
  8. 8. Selección de opciones <ul><li>Configuración, compiliación y arranque del núcleo </li></ul><ul><li>Fichero conf /usr/src/linux/.config </li></ul><ul><li>Recreación fichero  make oldconfig </li></ul><ul><li>Tipos de opciones: </li></ul><ul><ul><li>y = Yes = * = Sí = Compilado en el núcleo </li></ul></ul><ul><ul><li>n = No = ' ' = No = No incluido en el núcleo </li></ul></ul><ul><ul><li>m = Module = M = Módulo = Como módulo </li></ul></ul>Juan Sánchez - jsancheznav@gmail.com
  9. 9. Selección de opciones <ul><li>Configuración, compiliación y arranque del núcleo </li></ul><ul><li>Edición fichero .config mediante vi + make </li></ul><ul><li>Modo interactivo  make config </li></ul><ul><li>Modo menu  make menuconfig </li></ul><ul><li>Modo Xwin  make xconfig </li></ul><ul><li>Modo recreacion  make oldconfig </li></ul>Juan Sánchez - jsancheznav@gmail.com
  10. 10. Selección de opciones <ul><li>Configuración, compiliación y arranque del núcleo </li></ul>Juan Sánchez - jsancheznav@gmail.com
  11. 11. ¿Qúe controlador usa un disp? <ul><li>Configuración, compiliación y arranque del núcleo </li></ul><ul><li>Necesario determinar que controlador usa un dispositivo </li></ul><ul><li>Conociendo el dispositivo </li></ul><ul><li>basename `readlink /proc/sys/class/<tipo>/<disp>/device/driver/module` </li></ul>Juan Sánchez - jsancheznav@gmail.com
  12. 12. ¿Qúe controlador usa un disp? <ul><li>Configuración, compiliación y arranque del núcleo </li></ul><ul><li>Desonociendo el dispositiv </li></ul><ul><ul><li>Escanear el hardware (lspci, lsdev, …) </li></ul></ul><ul><ul><li>Con el id en los dispositivos, buscar la definición </li></ul></ul><ul><ul><li>Buscar el módulo según la definición </li></ul></ul>Juan Sánchez - jsancheznav@gmail.com
  13. 13. ¿Qúe controlador usa un disp? <ul><li>Configuración, compiliación y arranque del núcleo </li></ul>Juan Sánchez - jsancheznav@gmail.com
  14. 14. Compilación Instalación de los módulos compilados previamente en /lib/modules/ Creación de la imagen iniciable del núcleo bzImage = Imagen Grande comprimida con gzip Borrado ficheros de salida de compilaciones precedentes (core files, system map files, …) Your own footer make clean make dep make bzImage make modules make modules_ install Configuración, compiliación y arranque del núcleo Compilación de los módulos (contralores, fs, …) Revisión dependencias Creación .depend en cada directorio
  15. 15. Selección de opciones <ul><li>Configuración, compiliación y arranque del núcleo </li></ul><ul><li>Edición fichero .config mediante vi + make </li></ul><ul><li>Modo interactivo  make config </li></ul><ul><li>Modo menu  make menuconfig </li></ul><ul><li>Modo Xwin  make xconfig </li></ul><ul><li>Modo recrecion defecto  make defconfig </li></ul><ul><li>Modo recreacion  make oldconfig </li></ul>Juan Sánchez - jsancheznav@gmail.com
  16. 16. Creación del nuevo núcleo <ul><li>Configuración, compiliación y arranque del núcleo </li></ul><ul><li>2 posibilidades: paso a paso o bien make </li></ul><ul><li>Opciones de mejora compilación: </li></ul><ul><ul><li>Si multiprocesador  make -j2*<Nº CPUs> </li></ul></ul><ul><ul><li>Si solo controladores especificos  make M=drivers/… </li></ul></ul><ul><ul><li>Crosscompilling dep  make ARCH=x86_64 defconfig </li></ul></ul><ul><ul><li>Crosscompilling  make ARCH=arm CROSS_COMPILE=<tool_chain> </li></ul></ul><ul><ul><li>Utilizar precache  make CC=&quot;ccache gcc&quot; </li></ul></ul>Juan Sánchez - jsancheznav@gmail.com
  17. 17. Instalación nuevo núcleo <ul><li>Configuración, compiliación y arranque del núcleo </li></ul><ul><li>make no ha dado ningún error </li></ul><ul><li>Modos posibles: </li></ul><ul><ul><li>Manual </li></ul></ul><ul><ul><li>Automático  installkernel (mkinitrd) </li></ul></ul>Juan Sánchez - jsancheznav@gmail.com
  18. 18. Instalación manual <ul><li>Configuración, compiliación y arranque del núcleo </li></ul><ul><li>Instalación de los módulos creados </li></ul><ul><ul><li>cd /usr/src/linux && make modules_install </li></ul></ul><ul><li>Copia del nuevo nuevo al directorio arranque </li></ul><ul><ul><li>export kversion=`make kernelversion` </li></ul></ul><ul><ul><li>cp arch/i386/boot/bzImage /boot/vmlinuz-$kversion </li></ul></ul><ul><ul><li>cp System.map /boot/System.map-$kersion </li></ul></ul>Juan Sánchez - jsancheznav@gmail.com
  19. 19. Instalación manual <ul><li>Configuración, compiliación y arranque del núcleo </li></ul><ul><li>Modificación del bootload </li></ul><ul><ul><li>GRUB  /boot/grub/menu.list </li></ul></ul><ul><ul><ul><li>Copiar entrada existente </li></ul></ul></ul><ul><ul><ul><li>Apuntar nueva entrada a nuevo núcleo </li></ul></ul></ul><ul><ul><li>LILO  /etc/lilo.conf </li></ul></ul><ul><ul><ul><li>Copiar entrada existente </li></ul></ul></ul><ul><ul><ul><li>Apuntar nueva entrada a nuevo núcleo </li></ul></ul></ul><ul><ul><ul><li>Ejecutar /sbin/lilo </li></ul></ul></ul>Juan Sánchez - jsancheznav@gmail.com
  20. 20. Instalación manual <ul><li>Configuración, compiliación y arranque del núcleo </li></ul><ul><li>Reiniciar sistema </li></ul><ul><li>Testear todo el sistema </li></ul><ul><li>Definir nuevo núcleo como núcleo por defecto </li></ul><ul><ul><li>default <posición nuevo núcleo> </li></ul></ul>Juan Sánchez - jsancheznav@gmail.com
  21. 21. Proceso de arranque del sistema <ul><li>Configuración, compiliación y arranque del núcleo </li></ul>Descompresión bzImage o zImage y llamada rutina head.S y carga de los contraladores Definir nuevo núcleo como núcleo por defecto y puesta en producción LILO, GRUB cargan núcleo seleccionado en memoria Carga de initrd Master Boot Record 512b=446 bootloader+64 partition+2magic number Busqueda sector arranque Inicio del sistema Cargador del núcleo Expansión del núcleo en memoria Puesta en marcha Juan Sánchez - jsancheznav@gmail.com BIOS /Boot Monitor
  22. 22. Initial RAM disk (initrd) <ul><li>Configuración, compiliación y arranque del núcleo </li></ul><ul><li>Sistema raiz temporal montado en tiempo de montado </li></ul><ul><li>Contiene controladores y ejecutables (insmod, …) que permiten montar sistema raiz real </li></ul><ul><li>En sistemas embebidos es el sistema real </li></ul><ul><li>Utiliza dispositivo /dev/loop </li></ul>Juan Sánchez - jsancheznav@gmail.com
  23. 23. Initial RAM disk (initrd) <ul><li>Configuración, compiliación y arranque del núcleo </li></ul><ul><li>Fichero montado como dispositivo de bloque </li></ul><ul><li>/boot/initrd </li></ul><ul><ul><li>Versiones nuevas = cpio + gzip </li></ul></ul><ul><ul><li>Versiones anteriores = gzip + ext2 </li></ul></ul>Juan Sánchez - jsancheznav@gmail.com
  24. 24. Creación initrd <ul><li>Configuración, compiliación y arranque del núcleo </li></ul>Juan Sánchez - jsancheznav@gmail.com <ul><li>Automática :mkinitrd sh  Personalizable!!! </li></ul><ul><li>Manual </li></ul><ul><ul><li>Creación fichero </li></ul></ul><ul><ul><li>Formateo fichero </li></ul></ul><ul><ul><li>Montado fichero y rellenado </li></ul></ul>
  25. 25. #!/bin/bash RDSIZE=4000 BLKSIZE=1024 dd if=/dev/zero of=/tmp/ramdisk.img bs=$BLKSIZE count=$RDSIZE /sbin/mke2fs -F -m 0 -b $BLKSIZE /tmp/ramdisk.img $RDSIZE mount /tmp/ramdisk.img /mnt/initrd -t ext2 -o loop=/dev/loop0 cd /mnt/initrd mkdir bin sys dev proc # Grab busybox and create the symbolic links pushd /mnt/initrd/bin cp /usr/local/src/busybox-1.1.1/busybox . ln -s busybox ash ln -s busybox mount ln -s busybox echo ln -s busybox ls ln -s busybox cat ln -s busybox ps ln -s busybox dmesg ln -s busybox sysctl popd Configuración, compiliación y arranque del núcleo Creación de initrd Juan Sánchez - jsancheznav@gmail.com
  26. 26. cp -a /dev/console /mnt/initrd/dev cp -a /dev/ramdisk /mnt/initrd/dev cp -a /dev/ram0 /mnt/initrd/dev cp -a /dev/null /mnt/initrd/dev cp -a /dev/tty1 /mnt/initrd/dev cp -a /dev/tty2 /mnt/initrd/dev pushd /mnt/initrd ln -s bin sbin popd cat >> /mnt/initrd/linuxrc << EOF #!/bin/ash echo echo &quot;Simple initrd is active&quot; echo mount -t proc /proc /proc mount -t sysfs none /sys /bin/ash --login EOF chmod +x /mnt/initrd/linuxrc umount /mnt/initrd gzip -9 /tmp/ramdisk.img cp /tmp/ramdisk.img.gz /boot/ramdisk.img.gz Configuración, compiliación y arranque del núcleo Creación de initrd Juan Sánchez - jsancheznav@gmail.com
  27. 27. Migración a un nuevo núcleo <ul><li>Configuración, compiliación y arranque del núcleo </li></ul>Crear un nuevo núcleo e instalarlo. Aplicar parche final patch -p1 < ../parche_final Verificar Makefile Aplicar cada uno de los parches patch -p1 < ../parche_1 Verificar Makefile Aplicar parches precedentes Descarga parches y descompresión Aplicar parche final Guardar configuracion anterior Crear nuevo núcleo Juan Sánchez - jsancheznav@gmail.com Obtener configuración anterior pero con el nuevo código Conectarse a kernel.org y descargar los parches. Verificar Makefile
  28. 28. <ul><li>Bibliografia </li></ul><ul><ul><li>The Linux Kernel Module Programming Guide ( http :/* www.tldp.org /LDP/ lkmpg /2.6/ html / index.html ) </li></ul></ul><ul><ul><li>Linux Kernel Development Second Edition (Robert Love) </li></ul></ul><ul><ul><li>Understanding The Linux Kernel 3 Rd - (Daniel P.Bovet) </li></ul></ul><ul><ul><li>Linux Kernel Architecture (Wolfgang Maurer) </li></ul></ul><ul><ul><li>Linux Device Drivers (Jonathan Corbet, Alessandro Rubini) </li></ul></ul>Juan Sánchez - jsancheznav@gmail.com

×