Presentación del núcleo
- Visión general del sistema y función del núcleo.
- Sitios de referencia.
- Características específicas de los núcleos 3.x y 4.x.
- Ciclos de desarrollo del núcleo, parches.
- Modo de funcionamiento (supervisor y usuario). Llamadas al sistema.
- Organización de fuentes (Include/linux, Arch, Kernel, Documentación, etc.).
- Principio de compilación del núcleo y los módulos.
- Dependencias y símbolos.
- Exportación de símbolos.
- Carga del núcleo (soporte, argumentos, etc.).
Trabajo práctico
Compilación e instalación de un kernel 3.x.
Herramientas que puede utilizar
- Herramientas de desarrollo (Gcc, Kbuild, Kconfig y Makefile, etc.).
- Herramientas de depuración (GDB, KGDB, ftrace, etc.).
- Entorno de depuración (Linux Trace Toolkit, etc.).
- Herramienta de gestión de versiones (Git, etc.).
- Rastrea las llamadas al sistema (ptrace...).
Trabajo práctico
Instalar todas las herramientas y fuentes para generar un módulo para el kernel. Configurar el sistema para que cargue los módulos automáticamente al arrancar. Escribir y probar módulos sencillos.
Gestión y programación de hilos
- Los diferentes tipos de periféricos.
- Contextos de funcionamiento del núcleo. Protección de variables globales.
- Representación de hilos (estado, estructura task_stru, thread_info, etc.).
- Hilos, contexto de ejecución.
- El planificador de Linux y la preferencia.
- Crear un hilo del núcleo (kthread_create, wakeup_process...).
Trabajo práctico
Crear un módulo que cree un hilo del kernel durante la inserción y lo descargue durante rmmod. Escribir un módulo de registro de tiempo de eventos de alta precisión. Escribir un módulo que proporcione información sobre las estructuras internas de los procesos.
Gestión de memoria, tiempo y proc
- Organización de la memoria para arquitecturas UMA y NUMA.
- Espacio de direcciones del usuario y del núcleo.
- Busca personas a la carta.
- Asignaciones de memoria, buddy allocator, kmalloc, slabs y memory pools.
- Gestión del acceso a la memoria (cachés y MMU).
- Problemas relacionados con la sobrerreserva de memoria.
- Gestión de memoria en x86 y ARM, uso de Hugepages.
- Optimización de las llamadas al sistema (IAPX32, VDSO).
- Sincronización y espera en el núcleo, colas de espera, mutexes y finalizaciones.
- Ticks y jiffies en Linux.
- Reloj en tiempo real (RTC), implementación de temporizadores.
- Interfaz de temporizador de alta resolución, sellos.
- Herramientas específicas del núcleo, listas enlazadas, kfifo y container_of.
- La interfaz del núcleo con /proc a través de procfs.
Trabajo práctico
Uso de temporizadores y marcas de tiempo. Implementación del acceso procfs. Implementación de la asignación de memoria en el kernel y optimización mediante slabs.
Dispositivo en modo carácter
- Escritura de controladores de dispositivos de caracteres.
- VFS (Sistema de archivos virtual).
- Métodos asociados a los periféricos de caracteres.
- Gestión de las interrupciones DMA y acceso al hardware.
- Registro y optimización de controladores de dispositivos de caracteres.
Trabajo práctico
Escritura progresiva de un controlador periférico en modo carácter. Implementación de la sincronización de E/S entre hilos y con la rutina de interrupción. Implementación de la asignación de memoria.
Marco de controladores de Linux - sysfs
- Presentación del marco, kobject, kset y kref.
- Controlador, controlador de dispositivo, bus y objetos de clase.
- Uso y generación de atributos presentados en sysfs.
- Interfaz con métodos de conexión en caliente, emparejamiento, sondeo y liberación.
- Gestión del firmware.
- Gestión de la energía, métodos de gestión de la energía.
Trabajo práctico
Implementación de un bus, un controlador y un controlador de dispositivo. Adaptación del controlador de dispositivo de caracteres. Ejemplo de uso de la interfaz.
Periféricos y sistemas de archivos en modo bloque
- Principio de los periféricos en modo bloque. Registro de controladores.
- Llamada de retorno de lectura y escritura. Soporte para formateo y operaciones avanzadas.
- Programador de E/S en bloque para el núcleo.
- Diseño de sistemas de archivos.
- Registro de un nuevo sistema de archivos.
Trabajo práctico
Ejemplo de controlador de dispositivo virtual completo. Ejemplo de un sistema de archivos personalizado.
Interfaces y protocolos de red
- Gestión de interfaces de red en Linux.
- Uso de skbuff.
- Ganchos Netfilter.
- Integración de un protocolo.
Trabajo práctico
Ejemplo de controlador de red para un dispositivo virtual. Implementación del protocolo de red.
Controladores para periféricos USB
- Principio de los periféricos USB. Interfaz con el módulo USB-core.
- Interacción del dispositivo con el núcleo Linux.
- Construcción de un URB (bloque de solicitud USB).
- Aparatos USB.
Trabajo práctico
Registro de un controlador USB. Escritura de un controlador en modo isócrono.