La puerta del kernel
Ningún programa toca el hardware: todo lo pide al kernel. Al terminar sabrás espiar esos pedidos y extender el kernel en marcha.
Primero, la idea completa
Mira el video entero o salta a la parte que quieras repasar. Después, cada idea tiene su propia escena para tocarla.
Modo usuario y modo kernel
ampliación La CPU tiene niveles de privilegio. Los programas corren en modo usuario: no pueden tocar el hardware ni la memoria de otros. El kernel corre en modo kernel, con acceso a todo. Para pedirle algo al kernel, un programa ejecuta una instrucción especial que provoca un trap: la CPU pasa a modo kernel, el kernel atiende el pedido y devuelve el control y el resultado.
- Un trap es síncrono: lo provoca la instrucción que se está ejecutando, sea una llamada al sistema o un error como dividir entre cero.
- Una interrupción es asíncrona: la provoca el hardware en cualquier momento, como el disco al terminar una lectura o el reloj al acabarse un quantum.
Según cuánto corre en modo kernel, hay kernels monolíticos (todo el kernel en un solo espacio, como Linux), microkernels (lo mínimo en el kernel y el resto como servicios aparte, como el Hurd de GNU) e híbridos.
Un programa lee un archivo con read(). Avanza paso a paso y mira en qué modo está la CPU.
Llamadas al sistema
Las llamadas al sistema (syscalls) son la API que los programas usan para comunicarse con el kernel. Linux tiene más de 300, y varían un poco según la arquitectura. Casi nunca se invocan directamente: se usan a través de la biblioteca estándar de C, que funciona como envoltorio y se encarga de todo el ciclo de la llamada. Algunas comunes, por categoría:
- Procesos:
clone,execve,exit,wait4,kill. - Archivos:
openat,read,write,close,stat. - Memoria:
brk,mmap,munmap. - Red:
socket,connect,sendto,recvfrom. - Información:
uname,getpid.
Con el comando strace se ven todas las llamadas que hace un programa, con sus argumentos y lo que devolvieron.
Elige una función de la biblioteca de C y mira qué llamadas al sistema hace por dentro.
Módulos del kernel
Como el kernel de Linux es monolítico pero modular, se puede extender con módulos: programas, normalmente escritos en C como el kernel, que se cargan bajo demanda sin reiniciar. Casi siempre son controladores. Los módulos cargados se ven con lsmod y los disponibles están en /lib/modules.
ampliación insmod carga un archivo .ko tal cual y falla si le faltan las piezas de las que depende. modprobe busca el módulo por su nombre y carga primero sus dependencias (las lee de modules.dep). rmmod lo descarga, pero no si otro módulo o el sistema lo está usando.
eBPF
Una forma moderna de extender el kernel es eBPF (extended BPF). Nació como el Berkeley Packet Filter, para filtrar paquetes de red; hoy permite ejecutar pequeños programas en una máquina virtual dentro del kernel, de forma segura y eficiente. Se usa sobre todo para monitorear el sistema: contar llamadas, medir latencias o seguir paquetes sin cambiar el kernel ni cargar un módulo. Está disponible desde la versión 3.15.
Tres formas de que el kernel haga algo nuevo. Compara.
Antes de leer la respuesta
strace cat notas.txt muestra cada llamada al sistema de cat. Las líneas en verde son las que tocan tu archivo; las de arriba son el programa cargando la biblioteca de C.Tu turno: espía y extiende
Espía las llamadas al sistema de un programa, identifica el controlador de la tarjeta de red y extiende el kernel cargando módulos. Uno de ellos no se deja cargar a mano: averigua por qué.
Comprueba lo que entendiste
Cada respuesta incorrecta explica por qué parece correcta y en qué falla.