Archivo de la etiqueta SoC

Introducción breve a la arquitectura de U-boot

Hasta hace poco no sabía muy bien de que iba esto del U-boot, pero al intentar actualizar mi apad M70003 he tenido que entender su funcionamiento. U-boot es un gestor de arranque universal para Linux pero… ¿Es universal y solo para Linux? sí, es universal en cuanto al hardware, está diseñado para utilizarse en dispositivos enbebidos y soporta una gran cantidad. Su estructura es sencilla, se basa en archivos de imágen binarios cuya carga y ejecución se controla mediante variables de entorno y comandos, estos comandos pueden agruparse en scripts convertidos a archivos imágen de U-boot.

Bien lo primero que hay que entender es que los archivos imágen que usa U-boot no son iguales, es decir que existe más de un tipo de imágenes, de hecho las imágenes no son más que archivos con una cabecera añadida mediante el comando mkimage de U-boot, estos archivos pueden ser un kernel o un archivo de texto simple, la cabecera contiene información sobre: magic number para reconocer que es una imágen de U-boot, el tipo de archivo que contiene la imágen, a que plataforma va destinado, fecha de creación, nombre, direcciones de carga, compresión… y un hash del archivo que incluye para comprobar que no se ha modificado la imágen, por lo tanto cada modifición de un archivo conlleva la creación de una imágen nueva para cuadrar el hash.

Un proceso de inicio básico de U-boot es así:

  1. Se carga U-boot con sus parámetros
  2. Se cargan las variables de entorno que contienen parámetros para U-boot
  3. U-boot carga el Linux del sistema embebido

Veamos más detalles sobre estos pasos:

1-La carga de U-boot

Los sistemas embebidos suelen funcionar sin un chip BIOS para abaratar costes de producción y porque realmente no es necesario ya que sus funciones son muy concretas y limitadas, por lo tanto hay que realizar las funciones básicas de otro modo, esta es la función de U-boot. Esta imágen tiene que tener capacidad para comunicarse con los distintos dispositivos del sistema embebido, ya que será la encargada de iniciar la pantalla, gestionar la memória, reproducir alertas sonoras y cualquier otra función que se quiera realizar al iniciar el sistema como mover archivos o conectarse a la red para usar BOOTP. U-boot soporta unos cuantos sistemas de archivos*1: de chip (Flash, MTD, ROM) de memória (tmpfs) y de disco (ramdisk, jffs2, cramfs, ext2…).

Una vez cargado U-boot y según los parámetros que se le hayan pasado se obtendrá una consola o este iniciará la carga del sistema embebido.

2-Establecimiento de las variable de entorno U-boot

U-boot admite una serie de comandos*2 que sirven para multiples propósitos: gestión de dispositivos, extraer información sobre el sistema, mover archivos, control de ejecución… y de variables de entorno*3 que establecen parámetros utilizados por los comandos: resolución de la pantalla, dispositivos a iniciar, tema…

La ejecución de estos comandos se puede automatizar mediante scripts, para ello hay que crear un archivo de texto, introducir los comandos que queramos y crear el archivo imágen que ejecutará U-boot, para crear la imágen hay que instalar el programa mkimage (suele estar disponible en los repositorios de las distribuciones GNU/Linux) y ejecutar:

mkimage -A arm -T script -n scriprinicio -d ruta_al_archivo.txt ruta_de_destino

A excepción del parámetro -T que indica el tipo de imágen que se va a crear, en este caso script, el resto de parámetro puede variar (-A: arquitectura destino, -n nombre) además hay otros parámetros, para obtener un listado ejecutar

mkimage

Para obtener información sobre una imágen ya creada hay que ejecutar

mkimage -l ruta_de_la_imagen

En el caso de tener una imágen de tipo script y querer modificarla, es muy sencillo, tan solo hay que copiarla, abrirla con un editor de texto cualquiera y eliminar la primera linea, teniendo en cuenta que al final puede haber un comando valido que hay que mantener, osea buscamos al final de la primera linea y si hay carácteres ascii comprensibles no los borramos.

3-Carga de la imágen Linux

Una vez ejecutados los comandos: inicializados los dispositivos, cargado los archivos… sel carga el núcleo de Linux pasandole como argumentos los establecidos por la variable bootargs

Para crear la imágen de Linux con las cabeceras necesarias para U-boot, hay que configurar un kernel y compilarlo con compilación cruzada para la arquitectura destino, esto requiere tener las utilidades necesarias para compilación cruzada, no voy a explicar como realizar estos pasos porque queda fuera del ámbito del post, tan solo indicar que teniendo mkimage en el PATH del sistema en lugar de especificar bzImage u otros hay que compilar con el parámetro uImage, el comando sería algo así

make ARCH=arm CROSS_COMPILE=ruta_a_las_toolchain- modules uImage

Referencias

1-Sistemas de archivo soportados por U-boot

2-Comandos admitidos por U-boot

3-Variables de entorno adminitas por U-boot