El núcleo Linux es el corazón del sistema operativo Linux y es responsable de gestionar recursos y proporcionar servicios esenciales para todas las aplicaciones y procesos en un sistema. Para convertirse en un desarrollador competente en el mundo de Linux, es fundamental tener un conjunto de conocimientos básicos sólidos.
En este artículo, exploraremos algunos de los conocimientos fundamentales que debe poseer un desarrollador moderno del núcleo Linux.
Conocimiento de Lenguajes de Programación
El Kernel Linux está escrito en lenguaje de programación C, por lo que C es el lenguaje más importante para el desarrollador del Kernel Linux. Inicialmente, el núcleo estaba escrito en GNU C (ahora también es posible construirlo usando LLVM) que extiende el C estándar con algunas palabras clave y atributos adicionales. Recomendaría aprender alguna versión moderna de C como C11 y adicionalmente aprender extensiones GNU para poder leer el código del kernel de forma efectiva. Las partes pequeñas y específicas de la arquitectura del núcleo y algunas partes altamente optimizadas de varios controladores están escritas en lenguaje ensamblador. Este es el segundo lenguaje de elección. Hoy en día existen 3 arquitecturas principales: x86, ARM y RISC-V. El lenguaje ensamblador que elijas dependerá de tu plataforma de hardware.
Puede leer también | Lanzamiento del kernel GNU Linux-Libre 6.5 para quienes buscan un PC 100% libre
Definitivamente deberías echar un vistazo a Rust, que está ganando popularidad en la comunidad del Kernel Linux como una alternativa más segura y fiable a C.
Linux es un sistema altamente configurable y su configurabilidad se basa en el sistema de construcción del núcleo, KBuild. Cada desarrollador debe conocer los fundamentos de KBuild y Make para ser capaz de extender/modificar con éxito el código del kernel. Por último, pero no menos importante, está el shell scripting. Es difícil imaginar el desarrollo del núcleo sin el uso de la línea de comandos y un desarrollador inevitablemente tiene que escribir algunos scripts de shell para apoyar su trabajo mediante la automatización de tareas repetitivas.
Entorno de software
El desarrollo del núcleo de Linux está inextricablemente ligado al sistema de control de código fuente Git. No es posible imaginar hoy en día el flujo de trabajo de desarrollo del núcleo sin él. Por lo tanto, el conocimiento de Git es un requisito.
Puede leer también | Linus Torvalds y su post para presentar el kernel de Linux 6.5
A menos que los desarrolladores del kernel ejecuten su kernel en hardware específico/personalizado - la emulación es el mejor amigo del desarrollador. La plataforma más popular para esto es Qemu/KVM. Un flujo de trabajo típico es el siguiente: un desarrollador introduce algunos cambios en el núcleo o en un controlador, lo crea, lo copia en un entorno virtual y lo prueba allí. Si todo va bien, entonces el desarrollador prueba estos cambios en hardware real, pero si algo va mal, entonces el núcleo bajo la máquina virtual se bloquea. En este caso, es bastante fácil apagar la máquina virtual, corregir el error y repetir el ciclo de desarrollo y depuración. Si no tuviéramos virtualización, reiniciaríamos la máquina real en cada caída del kernel y el tiempo de desarrollo aumentaría en un orden de magnitud.
A diferencia del espacio de usuario, el kernel tiene capacidades de depuración limitadas. En realidad, el método más popular de depuración del kernel era (y a veces es) insertar llamadas a la función printk, que almacena su salida en el buffer circular del kernel, en el código en cuestión y analizar esta salida en el espacio de usuario usando el comando dmesg -kw. Desde la versión 2.6 del kernel se introdujo un nuevo marco ftrace en el kernel. Se ha estado desarrollando desde entonces y ahora es completo y robusto. Propone muchas formas de depuración y muchos formatos de salida. La función más popular - rastrear las trazas de pila del kernel para todo el kernel, o parte de él, o módulos específicos y mostrar su salida en un archivo especial. Ahorra horas y horas de depuración a los desarrolladores. Además, no tiene sobrecarga mientras está inactivo. Todo desarrollador moderno del kernel debería conocer ftrace.
Puede leer también | Disponible Arch Linux 2023.08.01 con Kernel Linux 6.4 y Archinstall 2.6
Hay muchos casos en los que un desarrollador se encuentra con que su módulo del kernel es simplemente lento. Aquí es donde perf ayuda. perf es un par de un marco de perfiles en el núcleo y una herramienta de espacio de usuario que ayuda a analizar el rendimiento en el núcleo. La herramienta más sofisticada y flexible para recopilar información en tiempo de ejecución del núcleo es el marco eBPF, que permite ejecutar programas de usuario dentro del núcleo y pasar información al espacio de usuario. De hecho, al permitir la telemetría del núcleo definida por el usuario, este marco revoluciona la observabilidad del núcleo.
Puede leer también | Nueva vulnerabilidad del kernel de Linux que permite obtener privilegios elevados
Una de las principales áreas de desarrollo del núcleo es el desarrollo integrado. De hecho, la mayoría de los dispositivos integrados, desde los IoT para hogares inteligentes hasta los smartphones basados en Android, llevan a bordo una versión del núcleo Linux. Existen dos sistemas de compilación principales en el mundo de los sistemas embebidos: Buildroot y Yocto. El primero es más sencillo y directo, mientras que el segundo es más flexible y sofisticado. Ambos están pensados para construir una distro Linux altamente personalizada, es decir, el Kernel Linux + un conjunto de software de espacio de usuario, adaptado a una placa hardware en particular. Vale la pena mencionar que un desarrollador embebido debe ser consciente y capaz de crear/actualizar archivos dts que describan un conjunto de componentes de hardware en la placa. El principal gestor de arranque en el mundo embebido es u-boot y su conocimiento también es un requisito. Hablando del espacio de usuario, uno de los frameworks minimalistas más sencillos y conocidos es busybox contiene sólo el conjunto mínimo de utilidades necesarias. Es muy pequeño en tamaño y por lo tanto conveniente para el desarrollo tanto embebido como emulado (Qemu/KVM).
Puede leer también | Nueva vulnerabilidad del kernel de Linux que permite obtener privilegios elevados
Por último, pero no menos importante, el entorno de desarrollo. La mayoría de los desarrolladores del Kernel Linux usan el editor de texto vim (o qemu) en la terminal, tmux como un moderno y conveniente multiplexor de terminal y cscope para construir referencias cruzadas para el código fuente del kernel.
Que conceptos básicos debe aprender a desarrollar el nucleo del Sistema Operativo Linux
Si vas a meterte a lleno con el desarrollo del nucleo y del sistema operativo o simplemente necesitas ampliar tus conocimientos, esto es lo que debes aprender:
1. Programación en C
La programación en C es esencial para trabajar en el núcleo de Linux, ya que el núcleo está escrito principalmente en este lenguaje. Los desarrolladores deben comprender los conceptos fundamentales de C, incluyendo punteros, estructuras de datos, y gestión de memoria. Además, deben ser capaces de leer y escribir código en C de manera efectiva para contribuir al desarrollo del núcleo.
2. Administración de Sistemas Linux
Un desarrollador de núcleo Linux debe tener un conocimiento sólido de la administración de sistemas Linux. Esto incluye habilidades como la gestión de paquetes, la configuración del sistema, la resolución de problemas, y la comprensión de la estructura del sistema de archivos. Sin una comprensión sólida de cómo funciona un sistema Linux, es difícil desarrollar un núcleo que se integre de manera efectiva.
3. Uso de Herramientas de Desarrollo
El ecosistema de desarrollo de Linux está lleno de herramientas que hacen que el desarrollo y la depuración del núcleo sean más eficientes. Los desarrolladores deben estar familiarizados con herramientas como GCC (GNU Compiler Collection), GDB (GNU Debugger), y Make para compilar, depurar y construir el núcleo y los módulos del kernel.
4. Comprensión de la Arquitectura del Núcleo
Un desarrollador de núcleo Linux debe entender la arquitectura general del núcleo, incluyendo conceptos como la gestión de procesos, la administración de memoria, la gestión de dispositivos y la programación de controladores de dispositivo. Comprender cómo se comunican los componentes clave del núcleo es fundamental para la creación de nuevos módulos y características.
5. Conocimiento de las Interfaces de Programación del Núcleo (API)
El núcleo Linux proporciona una serie de API que permiten a las aplicaciones y a los módulos del núcleo interactuar con él. Los desarrolladores deben conocer estas API y entender cómo utilizarlas para crear programas y controladores que se integren correctamente en el sistema. Esto incluye la familiaridad con llamadas al sistema como open()
, read()
, write()
, y muchas otras.
6. Contribución a la Comunidad
Uno de los aspectos más valiosos de trabajar en el desarrollo del núcleo Linux es la comunidad de código abierto que lo respalda. Los desarrolladores deben aprender a colaborar de manera efectiva, presentando parches y contribuciones, siguiendo las convenciones de codificación y participando en discusiones técnicas. Contribuir al núcleo Linux no solo es una forma de mejorar sus habilidades, sino también de dar algo a la comunidad de código abierto.
7. Mantenerse Actualizado
El desarrollo del núcleo Linux es un campo en constante evolución. Los desarrolladores deben mantenerse actualizados sobre las últimas tendencias, cambios y mejoras en el núcleo. Esto incluye seguir las listas de correo, blogs de desarrolladores destacados y participar en conferencias relacionadas con Linux.
Puede leer también | El Kernel de Linux obtiene más infraestructura para Rust
En resumen, convertirse en un desarrollador competente del núcleo Linux requiere un conjunto sólido de conocimientos que abarcan desde la programación en C hasta la administración del sistema y la colaboración en la comunidad de código abierto. Con estos conocimientos básicos en su arsenal, los desarrolladores pueden contribuir de manera efectiva al desarrollo y la mejora continua del núcleo Linux, uno de los sistemas operativos más influyentes y ampliamente utilizados en el mundo.