Después de dos meses de desarrollo, Linus Torvalds lanzó la versión del núcleo Linux 6.6. Entre los cambios más destacados se encuentran: un nuevo programador de tareas EEVDF; un mecanismo de pila en segundo plano para protegerse contra exploits; soporte de fs-verity en OverlayFS; implementación de cuotas y xattr en tmpfs; preparación de fsck en línea en XFS; se ha mejorado el seguimiento de la exportación de símbolos 'GPL-only'; soporte para sockets de red en io_uring; aleatorización de memoria en kmalloc(); ReiserFS ha sido declarada obsoleta; se han añadido primitivas para el controlador de Vulkan NVK en Nouveau.
La nueva versión incluye 15291 correcciones de 2058 desarrolladores, el tamaño del parche es de 39 MB (los cambios afectaron a 14844 archivos, se añadieron 553359 líneas de código y se eliminaron 284012 líneas). En la versión anterior hubo 14674 correcciones de 2016 desarrolladores, el tamaño del parche fue de 78 MB. Aproximadamente el 44% de todos los cambios presentados en 6.6 están relacionados con controladores de dispositivos, alrededor del 17% se refieren a la actualización de código específico para arquitecturas de hardware, el 11% está relacionado con la pila de red, el 4% con sistemas de archivos y el 3% con subsistemas internos del núcleo.
Novedades principales en el núcleo 6.6:
- Memoria y servicios del sistema
- Se ha implementado un nuevo programador de tareas EEVDF (Earliest Eligible Virtual Deadline First), que sustituye al programador CFS (Completely Fair Scheduler), que se ha suministrado desde el núcleo 2.6.23. El nuevo programador, al seleccionar el siguiente proceso para ceder la ejecución, tiene en cuenta los procesos que no han recibido los recursos del procesador o que han recibido injustamente demasiado tiempo de procesador. En el primer caso, la gestión se cede forzosamente al proceso, y en el segundo, se pospone. El antiguo programador CFS utilizaba heurísticas y ajustes finos para definir los procesos que requerían atención especial, mientras que el nuevo programador los rastrea de manera más clara y no requiere ajustes finos. Se espera que EEVDF reduzca la latencia en la ejecución de tareas con las que CFS tenía problemas de planificación.
- Se han introducido cambios en el manejo de los símbolos internos de la categoría «GPL-only», destinados a dificultar el uso de módulos propietarios con puentes GPL para eludir las restricciones de acceso a las subsistemas del núcleo, que solo permiten la interacción con código bajo licencia GPL. En la función symbol_get() se prohíbe a los módulos propietarios buscar símbolos marcados como GPL-only, y viceversa, los módulos GPL no podrán encontrar símbolos exportados por módulos propietarios.
- Se han agregado configuraciones adicionales para las colas de trabajo (unbound workqueue) para mejorar la eficiencia de reutilización de la caché del procesador en sistemas grandes que cuentan con múltiples cachés de nivel tres (L3). También se incluye en el núcleo la utilidad tools/workqueue/wq_dump.py para verificar la configuración actual de las colas de trabajo.
- Se ha añadido soporte inicial para operaciones y comandos específicos de sockets de red en la subsistema io_uring. Se ha agregado el sysctl io_uring_disabled para desactivar io_uring a nivel del sistema. Además, se ha acelerado significativamente la entrada/salida directa (Direct I/O) en modo asíncrono dentro de io_uring. La ganancia en el rendimiento y la reducción de la latencia en las operaciones de entrada-salida después de los cambios alcanzan el 37%.
- Se ha implementado un compilador JIT para BPF en la arquitectura PA-RISC.
- Se ha añadido soporte para parámetros numéricos en la configuración /sys/devices/system/cpu/smt/control, que definen el número de hilos disponibles para cada núcleo de CPU (anteriormente solo se admitían los valores «on» y «off» para habilitar y deshabilitar el soporte de hiperprocesamiento simétrico). Esta nueva función se puede aplicar a algunos procesadores PowerPC que admiten el modo de conexión en caliente de hiperprocesamiento simétrico («hotplug SMT»), para habilitar selectivamente SMT en núcleos específicos durante la operación.
- Se continúa la transferencia de cambios de la rama Rust-for-Linux, relacionados con el uso del lenguaje Rust como segundo idioma para el desarrollo de controladores y módulos del núcleo (el soporte para Rust no está habilitado por defecto, y no lleva a incluir Rust entre las dependencias de compilación obligatorias del núcleo). Se ha realizado el cambio a las versiones 1.71.1 de Rust y 0.65.1 de bindgen. Se ha implementado el rasgo ‘Zeroable’. Se han agregado macros de procedimiento ‘paste!’ y ‘#[derive(Zeroable)]’. Se ha garantizado la compatibilidad con ‘#[pin_data]’. Se han añadido funciones de inicialización ‘{,pin_}init_array_from_fn()’ y el método ‘{,pin_}chain’. Se han ampliado las capacidades del módulo ‘types’. En el marco de pruebas unitarias kunit se ha añadido la posibilidad de ejecutar pruebas desde la documentación de Rust.
- Se ha añadido el subsistema ‘eventfs’, que permite reducir considerablemente el consumo de memoria en el sistema de trazado, al eliminar el almacenamiento de estructuras innecesarias utilizadas para representar puntos de trazado en el sistema de archivos. Anteriormente, dichas estructuras se creaban para todos los puntos de trazado, independientemente de si se utilizaban o no. Con eventfs, tales estructuras pueden crearse dinámicamente, solo cuando se necesiten.
- Se han ampliado las capacidades de la utilidad perf.
- Se ha añadido información al archivo /proc/pid/smaps para diagnosticar la efectividad del mecanismo de fusión de páginas de memoria idénticas (KSM, Kernel Samepage Merging).
- Se ha eliminado la API Frontswap, que permitía ubicar una partición de intercambio en memoria que no se podía direccionar directamente y que no proporcionaba información operativa sobre la disponibilidad de espacio libre. Esta API solo se utilizaba en zswap, por lo que se ha decidido utilizar directamente esta funcionalidad en zswap, eliminando capas innecesarias.
- Para la arquitectura RISC-V, se ha añadido soporte para el acceso a contadores de rendimiento desde el espacio de usuario y la posibilidad de colocar un volcado del núcleo tras un fallo en el área fuera de 4 GB.
- Se ha añadido soporte inicial para las instrucciones ARM SME (Scalable Matrix Extension).
- Se ha implementado la capacidad de usar herramientas de depuración KDB, KGDB, kcov, KFENCE y KASAN en sistemas con arquitectura LoongArch.
- Se ha añadido soporte para archivos de prueba del núcleo en el sistema de integración continua GitLab, que se utiliza en el desarrollo de controladores gráficos.
- Subsistema de disco, entrada/salida y sistemas de archivos
- Se ha añadido soporte para el almacenamiento de los hashes fs-verity en el atributo extendido (xattr) overlay.verity en el sistema de archivos OverlayFS, lo que puede ser utilizado para verificar la integridad y autenticidad de los archivos en las capas inferiores de OverlayFS mediante hashes y claves criptográficas. Así, OverlayFS ahora incluye todos los cambios necesarios para que el proyecto Composefs funcione como una extensión sobre el sistema de archivos OverlayFS y EROFS.
- En el sistema de archivos XFS se ha preparado la implementación de la herramienta fsck para comprobar y corregir problemas detectados en modo online, sin necesidad de desmontar el sistema de archivos. Además, se ha implementado la posibilidad de usar grandes folios (folios) en la caché de páginas y se han añadido algunas optimizaciones relacionadas, lo que ha permitido aumentar notablemente el rendimiento en ciertos tipos de carga.
- Se ha añadido soporte para atributos extendidos personalizados (user xattrs), E/S directa y cuotas vinculadas a usuarios y grupos en el sistema de archivos tmpfs. Se han estabilizado los desplazamientos en directorios, lo que ha resuelto problemas con la exportación de tmpfs a través de NFS.
- En la API de gestión de montaje se ha añadido un nuevo flag FSCONFIG_CMD_CREATE_EXCL para mejorar la seguridad, que prohíbe el uso compartido del superblock en varios puntos de montaje (prohíbe montar una partición en múltiples puntos de montaje). En la herramienta mount, se ha propuesto la opción '--exclusive' para habilitar este flag.
- Se ha añadido soporte en el subsistema VFS para cambiar en tiempo real los parámetros de acceso y modificación (atime, mtime). Anteriormente, los datos de tiempo se reflejaban con cierta latencia, lo que dificultaba el seguimiento de la actualidad de los datos en caché en sistemas como NFS (debido al retraso en la detección de cambios en el archivo, el sistema podía erróneamente pensar que los datos en caché eran actuales). Esta nueva funcionalidad está disponible para Btrfs, Ext4, tmpfs y XFS.
- Se ha declarado obsoleto el mecanismo incorporado de verificación de integridad en Btrfs, que se habilitaba en la etapa de compilación mediante el parámetro BTRFS_FS_CHECK_INTEGRITY. Este mecanismo ha quedado sin mantenimiento, ya no se prueba y genera una carga adicional en la CPU y la memoria. Además, se ha optimizado el rendimiento del nuevo código de verificación del sistema de archivos (scrub) en Btrfs.
- En el sistema de archivos Ext4 se han añadido comprobaciones periódicas para actualizar el superbloque y se han acelerado las operaciones de asignación de memoria al agregar datos al final del archivo.
- En el subsistema FUSE se ha añadido soporte para el atributo btime («tiempo de creación»), que determina el momento en que se creó el inode.
- Se prohíbe la modificación de los permisos de acceso para los enlaces simbólicos.
- Se añade la llamada del sistema fchmodat2(), que se diferencia de la llamada fchmodat() por un argumento adicional para especificar banderas. Por el momento, sólo se admiten las banderas AT_SYMLINK_NOFOLLOW y AT_EMPTY_PATH, que permiten implementar en la función libc fchmodat() la prohibición de la desreferenciación de enlaces simbólicos y la posibilidad de utilizar un descriptor de archivo al especificar una ruta vacía.
- En el sistema de archivos EROFS (Extendable Read-Only File System), diseñado para su uso en particiones disponibles en modo sólo lectura, se ha añadido soporte para el algoritmo de compresión Deflate. Para acelerar la búsqueda de atributos extendidos se ha utilizado una estructura probabilística llamada filtro de Bloom.
- Se ha añadido la configuración CONFIG_BUFFER_HEAD, que permite compilar el kernel sin utilizar la estructura buffer_head. Al compilar sin buffer_head, se pueden utilizar dispositivos de bloques y algunos sistemas de archivos, como xfs, btrfs, cramfs, erofs y squashfs.
- En el controlador de dispositivos de bloques ublk, que permite trasladar la lógica específica al espacio de usuario, se ha añadido soporte para dispositivos de almacenamiento zonificados (división en zonas de grupos de bloques o sectores, donde sólo se permite la adición secuencial de datos y la actualización de todo el grupo de bloques).
- La implementación del sistema de archivos ReiserFS ha sido trasladada de la categoría de soportadas a la de obsoletas (Obsolete). Se prevé que el soporte para ReiserFS finalice en 2025. La razón de esta transición se menciona como la falta de progreso en el mantenimiento de este sistema de archivos, el problema no resuelto del año 2038, la ausencia de capacidades para asegurar la tolerancia a fallos y el deseo de reducir el esfuerzo dedicado al mantenimiento de cambios comunes en los sistemas de archivos relacionados con el soporte de una nueva API para el montaje, iomap y folios.
- En el servidor NFS se ha implementado un mecanismo de delegación de operaciones de escritura para NFSv4, que mejora la efectividad de la caché de escritura de archivos para reducir el tráfico. Se ha incluido el soporte para la operación READ_PLUS, definida en NFS 4.2.
- Se ha añadido soporte para fscrypt en el sistema de archivos Ceph.
- Virtualización y seguridad
- Se ha implementado el mecanismo de Shadow Stack, que permite bloquear la ejecución de muchos exploits, utilizando las capacidades de hardware de los procesadores Intel para protegerse contra la sobrescritura de la dirección de retorno de una función en caso de desbordamiento de búfer en la pila. La esencia de la protección es que, tras transferir el control a una función, el procesador guarda la dirección de retorno no solo en la pila habitual, sino también en una 'pila sombra' separada, que no puede ser modificada directamente. Antes de salir de la función, la dirección de retorno se extrae de la pila sombra y se compara con la dirección de retorno de la pila principal. La discrepancia de direcciones genera una excepción que bloquea situaciones en las que un exploit ha logrado sobrescribir la dirección en la pila principal. La pila sombra de hardware es compatible solo con versiones de 64 bits, mientras que en versiones de 32 bits se utiliza su emulación por software.
- Se ha añadido soporte para compilaciones con el compilador Clang con el modo CFI (Control Flow Integrity) activado, que bloquea violaciones del orden normal de ejecución (control flow) como resultado de exploits que alteran los punteros a funciones almacenados en memoria.
- Para la arquitectura RISC-V, se ha habilitado la aleatorización de la ubicación del núcleo en memoria durante el arranque.
- Se ha añadido la bandera SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP al sistema de llamadas seccomp(), lo que permite manejar eventos de procesos vigilados en modo síncrono para un funcionamiento más eficiente del programador de tareas.
- En la función kmalloc() se ha implementado la aleatorización de cachés slab, dificultando la explotación de vulnerabilidades en el núcleo.
- Se ha eliminado la mención de la Agencia de Seguridad Nacional de EE. UU. de las opciones relacionadas con la habilitación del sistema de control de acceso obligatorio SELinux. Como el proyecto ya ha estado en desarrollo bajo el paraguas de la comunidad durante 20 años y es mantenido por curadores independientes, se ha decidido cambiar el nombre a 'SELinux' en lugar de 'NSA SELinux' en los comentarios y la documentación en Kconfig (por ejemplo, la explicación de la opción de compilación SECURITY_SELINUX se ha modificado de 'NSA SELinux Support' a 'SELinux Support').
- Se ha añadido la operación UFFDIO_POISON al sistema de llamadas userfaultfd(), que permite marcar páginas de memoria como 'envenenadas' (poisoned), lo que puede ser utilizado para trasladar páginas de memoria dañadas durante la migración máquinas virtuales de un sistema a otro.
- Se ha añadido una nueva interfaz de caracteres en el subsistema VFIO (\/dev\/vfio\/devices\/vfioX) para gestionar dispositivos VFIO, permitiendo al usuario abrir directamente el archivo del dispositivo, sin recurrir a la obsoleta interfaz grupal \/dev\/vfio\/$groupID.
- En servidor Se ha descontinuado el soporte para tipos de cifrado Kerberos obsoletos que utilizan algoritmos DES y 3DES en NFS.
- Se ha añadido soporte para sistemas invitados protegidos mediante la tecnología AMD SEV-SNP (Secure Nested Paging) e Intel TDX (Trusted Domain Extensions) al ejecutar en un entorno de hipervisor Hyper-V.
- Al compilar el kernel en modo 'W=1', se incluyen advertencias por defecto en el compilador como '-Wformat-overflow', '-Wformat-truncation', '-Wstringop-overflow' y '-Wrestrict'. Para todas las compilaciones, se activa la advertencia '-Wenum-conversion'.
- Subsistema de red
- La implementación de la familia de direcciones AF_XDP (eXpress Data Path) se ha ampliado para trabajar con paquetes almacenados en varios buffers (por ejemplo, un buffer puede contener el encabezado del paquete, y otro los datos, o en una cadena de varios buffers pueden estar los grandes jumbo-frames de Ethernet). Los programas que utilizan sockets AF_XDP ahora pueden recibir y enviar paquetes desde múltiples buffers.
- Se ha añadido soporte para la desfragmentación de paquetes IPv4 e IPv6, así como la capacidad de filtrar paquetes fragmentados en el subsistema BPF.
- Se ha añadido un nuevo manejador update_socket_protocol en BPF, que permite a los programas BPF modificar el protocolo solicitado para nuevos sockets. Por ejemplo, un programa BPF puede reemplazar de manera transparente el protocolo TCP por MPTCP (multipath TCP) para optimizar el tráfico de la aplicación. También se ha añadido soporte en BPF para gestionar el enrutamiento de paquetes a través de diferentes flujos en MPTCP.
- Se ha levantado la marca de desarrollo experimental del módulo ksmbd, que ofrece una implementación de servidor de archivos a nivel de núcleo basada en el protocolo SMB3. Se ha añadido soporte para la agrupación de operaciones de lectura (solicitudes 'read compound').
- Hardware
- Se han realizado cambios en el subsistema DRM (Direct Rendering Manager) necesarios para el funcionamiento eficiente del controlador abierto NVK con la implementación de la API gráfica Vulkan para tarjetas gráficas NVIDIA. Originalmente, el controlador DRM Nouveau estaba diseñado para la implementación de OpenGL, por lo que carece de los primitivos necesarios para el funcionamiento eficiente de los controladores Vulkan, como el soporte de objetos sincronizados y la gestión del espacio de direcciones virtuales.
- El controlador AMDGPU implementa soporte para SDMA 6.1.0, HDP 6.1, SMUIO 14.0, PSP 14.0, IH 6.1 y GFX 9.4.3. Se ha reestructurado el código para cargar el firmware de PSP (Platform Security Processor). Se ha ampliado el soporte para la tecnología de sincronización adaptativa FreeSync (se añadió soporte para Freesync Panel Replay V2).
- En el controlador i915, continúa la implementación del soporte para los chips Intel Meteor Lake. Se mejoró el soporte para la tecnología de protección contra copias HDCP (High-bandwidth Digital Content Protection). Se ha reestructurado el código para la interacción con la pantalla.
- Se eliminaron de Kconfig las opciones para desactivar la carga de microcódigo en la etapa de compilación — MICROCODE_INTEL y MICROCODE_AMD. El núcleo ahora siempre se compila con el código de carga de microcódigo para sistemas x86, pero la carga real de microcódigo se puede desactivar especificando el parámetro del núcleo 'dis_ucode_ldr'.
- Se añadió funcionalidad en el subsistema de sonido para gestionar dispositivos de audio conectados a través del subsistema IIO (Industrial I/O).
- Se añadió soporte para interfaces de audio Intel LunarLake, Intel ArrowLake y AMD ACP5x, así como para los códecs Cirrus Logic CS42L43, Realtek RT1017 y TI TAS2781, y los amplificadores Cirrus Logic CS35L56 y winic aw88261. Se añadió soporte para ASoC AMD Van Gogh.
- Se añadió un controlador USB MIDI 2.0 Gadget, que emula la interfaz USB MIDI 2.0, enlazada al dispositivo ALSA UMP rawmidi.
- Se añadió soporte para los controladores Ethernet Broadcom ASP 2.0 y Marvell 88Q2XXX.
- Se añadió soporte para los paneles Visionox R66451, TDO TL050HDV35, KD070FHFID015, Inanbo T28CP45TN89 y EDT ET028013DMA, controladores de pantalla Loongson y controladores de pantalla táctil Azoteq IQS7222D/IQS7210A/7211A.
- Se añadió soporte para el SoC ARM Qualcomm SM4450 (Snapdragon 4 Gen 2), TI AM62P5, Intel Agilex5, Qualcomm ipq5018, AN400 (Amlogic T7).
- Se añadió soporte para plataformas ARM Samsung Galaxy Tab 3 8.0, FriendlyElec NanoPC T6, Amlogic A311D2, Khadas Vim4, Xiaomi SM7125, Facebook Yosemite 4, Orange Pi Zero 3 y Radxa ROCK 4SE.
Simultáneamente, la Fundación de Software Libre de América Latina ha formado una variante completamente libre del núcleo 6.6 — Linux-libre 6.6-gnu, depurado de elementos de firmware y controladores que contienen componentes no libres o segmentos de código cuya aplicación está restringida por el fabricante. En la versión 6.6 se actualizó el código de limpieza de blobs en varios controladores y subsistemas, por ejemplo, en los controladores TI gigabit RU ethernet, MediaTek 792x wifi, Cirrus Logic cs42l43 mfd, cs35l56 HD-audio y aw88261 SoC. Se realizó una limpieza de los nombres de blobs en los archivos dts para la arquitectura Aarch64. Se eliminaron blobs en los nuevos controladores ivpu, en los controladores bluetooth, en el controlador de pantallas táctiles y en el codificador/decodificador Qualcomm Venus V4L2.
Fuente: opennet.ru
