wandres.dev
EL ÁRBOL DE FUENTES · Estructura y git

El árbol de fuentes del kernel

Obtener el código del kernel y aprender a navegar sus millones de líneas: la estructura de directorios, las herramientas de exploración, y cómo no perderse.

⏱ 12 min

El kernel son más de 30 millones de líneas de código. Enfrentarse a eso sin un mapa es abrumador. Pero su estructura es lógica y sus herramientas de navegación, potentes. Aprender a moverte por el árbol de fuentes es lo que convierte “un océano de código” en “sé dónde buscar”.

🎯 Al terminar esta lección sabrás
  • Obtener el código del kernel.
  • La estructura de directorios de primer nivel.
  • Herramientas para navegar el código.
  • Cómo encontrar lo que buscas.

Obtener el código

# el árbol oficial de Linus (enorme, con todo el historial)
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

# o un tarball de una versión concreta desde kernel.org
# (más ligero si solo quieres compilar)

El repositorio incluye décadas de historia. Para explorar y aprender, también existe Elixir (elixir.bootlin.com): un navegador web del código con referencias cruzadas, ideal para estudiar sin clonar nada.

La estructura de directorios

El primer nivel del árbol es un mapa de los subsistemas (los del nivel 0):

Directorio Qué contiene
kernel/ núcleo: planificador, gestión de procesos, tiempo
mm/ memory management: asignadores, memoria virtual
fs/ filesystems: el VFS y cada sistema de archivos
drivers/ los drivers de dispositivos (¡la mayoría del código!)
net/ la pila de red y los protocolos
arch/ código específico de cada arquitectura (x86, arm64, riscv…)
include/ los headers: include/linux/ es tu diccionario de APIs
init/ el arranque del kernel (start_kernel)
lib/ utilidades genéricas (estructuras de datos, etc.)
Documentation/ la documentación oficial, oro puro
💡
drivers/ es el 60% del kernel

Si te asombra el tamaño del kernel, mira dónde está: más de la mitad del código son drivers. El núcleo conceptual (planificador, memoria, VFS) es relativamente compacto y estable; la inmensa mayoría es soporte para los millones de dispositivos que existen. Esto es una buena noticia para quien empieza: no necesitas entender los 30 millones de líneas. El núcleo que de verdad tienes que comprender —lo que enseña este track— es una fracción, y los drivers son variaciones sobre patrones que aprenderás (nivel 29). Además, es donde más se contribuye: escribir o mejorar un driver es la vía de entrada habitual al kernel.

Con millones de líneas, grep no basta. Las herramientas de referencias cruzadas te dejan saltar a la definición de cualquier símbolo:

# generar índices de navegación
make cscope        # base de datos para cscope
make tags          # tags para vim/emacs

# buscar dónde se define o usa algo
grep -rn "start_kernel" init/
Leer el kernel es una habilidad en sí misma

Una verdad que libera: nadie entiende todo el kernel, ni siquiera sus mantenedores. La habilidad no es memorizarlo, sino saber navegarlo: partir de un síntoma o una función, seguir las referencias, leer la documentación del subsistema, y construir un modelo mental de la parte que te interesa. Los grandes desarrolladores del kernel son maestros de la exploración: usan Elixir, cscope, git blame y git log para entender por qué un código es como es, y la carpeta Documentation/ religiosamente. Aprender a leer código ajeno a esta escala —seguir el hilo, no perderte, saber qué ignorar— es quizá la habilidad más transferible de todo el track. Empieza siempre por Documentation/ del subsistema que te interese.

Un primer recorrido

El arranque del kernel es un buen punto de partida para orientarse: empieza en init/main.c, en la función start_kernel(), que inicializa cada subsistema en orden. Leerla (sin entenderlo todo) te da el índice de lo que el kernel monta al arrancar.

⚔️ Explora el árbol
  1. Clona el kernel (o abre elixir.bootlin.com) y recorre los directorios de primer nivel.
  2. Localiza init/main.c y encuentra start_kernel().
  3. Abre un archivo de Documentation/ sobre un tema que te intrigue.
  4. Usa grep -rn o Elixir para encontrar dónde se define printk.