El núcleo de Linux se escribe principalmente en C, pero el dialecto empleado difiere notablemente del C habitual del espacio de usuario. El vídeo del canal Lewboski repasa las principales particularidades del lenguaje dentro del kernel y por qué existen.
En la gestión de recursos, C no incorpora RAII de serie, por lo que la memoria debe liberarse manualmente. Sin embargo, el kernel utiliza C con extensiones GNU y se apoya en el atributo cleanup, que libera los datos automáticamente al salir de la función. Desde la versión 2.6.21, la API de dispositivos administrados se encarga además de la memoria de cada asignación, lo que simplifica el manejo de errores en los controladores. Para el acceso concurrente se utilizan mutexes y, en los controladores modernos, primitivas que se bloquean y desbloquean solas.
El manejo de errores recurre a códigos negativos devueltos como punteros: el kernel reserva las direcciones superiores de memoria para errores, de modo que una función puede retornar un puntero válido o un código de fallo. Se emplea también la macro must_check, que obliga al compilador a advertir si se ignora el valor de retorno. El registro de eventos se realiza con macros tipo dev_err, que producen mensajes legibles con marca temporal e identificador del dispositivo.
Linus Torvalds rechazó el uso de BUG como mecanismo de verificación porque detenía el sistema, y hoy se prefieren WARN, que vuelcan la pila sin parar el kernel. El código se analiza con herramientas como sparse —diseñada para el kernel, detecta accesos directos a buffers de usuario y desequilibrios de contexto— y smatch, un analizador estático más general. El vídeo menciona también que, desde la versión 6.1, ya pueden escribirse controladores en Rust, un lenguaje que ofrece RESULT para el manejo de errores y evita buena parte de estas trampas.
