Cómo compilar un kernel Linux
Índice
¿Qué es Linux?
Pero Linux no solo se limita a equipos fijos, también abarca los dispositivos móviles. Un ejemplo muy conocido actualmente es Android. Android es uno de los sistemas operativos más utlizados en los dispositivos portátiles y su proyecto AOSP (Android Open Source Project) consiste en compartir libremente el código de su sistema operativo para que cada fabricante lo adapte a sus productos. Como Android se basa en Linux también utiliza su kernel con pequeñas modificaciones que lo hacen ejecutarse en procesadores menos potentes.
Puedes encontrar este kernel en las particiones de boot y aboot de los dispositivos (en el caso de procesadores Snapdragon).
Aboot es la partición básica que ejecuta el código del bootloader que carga las funciones más básicas, dando paso después al boot.
Boot es la partición que contiene el kernel de linux en formato zImage, así como las instrucciones de inicio de Android y el Device Tree, que es la información acerca de los sensores del dispositivo: la corriente que necesitan y cómo funcionan.
En esta página os voy a enseñar cómo compilar el kernel para la partición boot, ya que para compilar el bootloader tenemos otro proyecto más pequeño llamado Little Kernel.
En la raíz del kernel tenemos muchas carpetas. Las que más utilizaremos serán las carpetas drivers y arch.
En la carpeta de drivers podemos encontrar todo tipo de controladores de los cuales usaremos tan solo unos pocos. Ahí podremos añadir soporte a más dispositivos y mejorar o arreglar los que ya están creados.
En la carpeta arch podemos gestionar la configuración del kernel antes de compilar (que nos permite activar y desactivar controladores o funciones), la configuración del procesador de destino y la información de todos los periféricos de entrada y salida que tendrá la plataforma de destino; esto es el Device Tree.
Teniendo un archivo de configuración en arch/<arquitectura_del_procesador_destino>/configs llamado, por ejemplo, Android_defconfig podemos empezar a compilar.
Para ello vamos a ejecutar este comando que copia ese archivo de configuración a la carpeta principal del kernel asignándole el nombre de ".config":
make ARCH=<arquitectura_del_procesador_destino> Android_defconfig
Este es el archivo que el comando "make" leerá al empezar a compilar.Finalmente para compilar necesitaremos definir un CROSS COMPILE, que es un conjunto de archivos binarios que permiten al procesador de un PC compilar cualquier kernel para un procesador con otra arquitectura diferente (como arm o aarch64).
En nuestro cross compile tenemos que meternos en la carpeta bin y copiar la ruta de los archivos con su prefijo. Por ejemplo si tengo:
/media/ramon/Android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androidkernel-ar
Deberé poner "CROSS_COMPILE=/media/ramon/Android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androidkernel-". El comando quedaría así:
make ARCH=<arquitectura_del_procesador_destino> CROSS_COMPILE=/media/ramon/Android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androidkernel-
Y al ejecutarlo comenzaría el proceso de compilación del kernel.Nota: para acelerar el proceso se puede añadir el parámetro -j<número_de_núcleos_del_procesador+1> que utilizará el máximo potencial del procesador.
Al final del proceso tendrás un archivo llamado zImage en arch/<arquitectura_del_procesador_destino>/boot que será el kernel en formato binario. Ese fichero se debe incluir en un boot.img y habrá que instalar ese boot.img para probar el nuevo kernel.