Después de dos meses de desarrollo, Linus Torvalds presentó el lanzamiento del núcleo Linux 5.18. Entre los cambios más destacados se encuentran: una gran limpieza de funcionalidades obsoletas, se ha declarado obsoleta el sistema de archivos Reiserfs, se han implementado eventos de trazado de procesos de usuario, se ha añadido soporte para el mecanismo de bloqueo de exploits Intel IBT, se ha incluido un modo de detección de desbordamientos de búfer al usar la función memcpy(), se ha añadido un mecanismo de seguimiento de llamadas a funciones fprobe, se ha mejorado el rendimiento del programador de tareas en CPUs AMD Zen, se ha incluido un controlador para gestionar la funcionalidad de CPUs Intel (SDS), se han integrado algunos parches para la reestructuración de archivos de encabezado, y se ha aprobado la aplicación del estándar C11.
En la nueva versión se han incorporado 16206 correcciones de 2127 desarrolladores (en la última versión se registraron 14203 correcciones de 1995 desarrolladores), el tamaño del parche es de 108 MB (los cambios afectaron a 14235 archivos, se añadieron 1340982 líneas de código y se eliminaron 593836 líneas). Aproximadamente el 44% de todos los cambios presentados en 5.18 están relacionados con controladores de dispositivos, alrededor del 16% de los cambios se refieren a la actualización de código específico de arquitecturas de hardware, el 11% está relacionado con la pila de red, el 3% con sistemas de archivos y el 3% con subsistemas internos del núcleo.
Novedades principales en el núcleo 5.18:
- Subsistema de disco, entrada/salida y sistemas de archivos
- En el sistema de archivos Btrfs se ha añadido soporte para el pasaje de datos comprimidos al realizar operaciones de send y receive. Anteriormente, al utilizar send/receive, el lado emisor descomprimía los datos almacenados de forma comprimida, mientras que el receptor volvían a comprimir antes de escribir. En el núcleo 5.18, las aplicaciones en espacio de usuario que utilizan llamadas send/receive tienen la posibilidad de transmitir datos comprimidos sin necesidad de reempaquetarlos. Esta funcionalidad se ha implementado gracias a las nuevas operaciones ioctl BTRFS_IOC_ENCODED_READ y BTRFS_IOC_ENCODED_WRITE, que permiten leer y escribir información directamente en los extremos.
Además, en Btrfs se ha mejorado el rendimiento de fsync. Se ha añadido la posibilidad de deduplicación y ejecución de reflink (clonación de metadatos de archivo creando un enlace a datos ya existentes sin copiar realmente) para todo el almacenamiento, sin limitarse a los puntos de montaje.
- En el modo de entrada/salida directa (Direct I/O) se ha habilitado el acceso a archivos cifrados al usar cifrado inline de fscrypt, donde las operaciones de cifrado y descifrado son realizadas por el controlador del dispositivo en lugar del núcleo. Con el cifrado estándar del núcleo, el acceso a archivos cifrados mediante Direct I/O sigue siendo imposible, ya que la interacción con los archivos se lleva a cabo eludiendo el mecanismo de almacenamiento en búfer del núcleo.
- En el servidor NFS, por defecto, se ha habilitado el soporte para el protocolo NFSv3, que ahora no requiere ser activado por separado y está disponible con la habilitación general de NFS. NFSv3 se considera la versión principal y siempre soportada de NFS, y el soporte para NFSv2 podría ser descontinuado en el futuro. Se ha incrementado significativamente la eficiencia al leer el contenido de los directorios.
- El sistema de archivos ReiserFS ha sido clasificado como obsoleto y se espera su eliminación en 2025. La clasificación de ReiserFS como obsoleto permitirá reducir los costos de mantenimiento de los cambios comunes entre sistemas de archivos relacionados con el soporte de una nueva API para el montaje, iomap y folios.
- Para el sistema de archivos F2FS, se ha implementado la posibilidad de mapear identificadores de usuarios de sistemas de archivos montados, que se utiliza para asociar archivos de un usuario específico en una partición montada de otro usuario con otro usuario en el sistema actual.
- Se ha reescrito el código para el conteo de estadísticas en los controladores de Device-mapper, lo que ha permitido aumentar significativamente la precisión del conteo en controladores como dm-crypt.
- Para dispositivos NVMe, se ha implementado soporte para sumas de verificación de 64 bits para la verificación de integridad.
- Para el sistema de archivos exfat, se ha propuesto una nueva opción de montaje "keep_last_dots", que prohíbe la eliminación de puntos al final del nombre del archivo (en Windows, los puntos al final del nombre se eliminan por defecto).
- En EXT4, se ha mejorado el rendimiento del modo fast_commit y se ha aumentado la escalabilidad. La opción de montaje "mb_optimize_scan", que permite mejorar el rendimiento en condiciones de alta fragmentación del sistema de archivos, se ha adaptado para trabajar con archivos con extensiones.
- Se ha descontinuado el soporte para flujos de escritura (write stream) en el subsistema que gestiona los dispositivos de bloques. Esta función fue propuesta para SSD, pero no se extendió y actualmente no existen dispositivos con soporte para este modo, siendo poco probable que aparezcan en el futuro.
- En el sistema de archivos Btrfs se ha añadido soporte para el pasaje de datos comprimidos al realizar operaciones de send y receive. Anteriormente, al utilizar send/receive, el lado emisor descomprimía los datos almacenados de forma comprimida, mientras que el receptor volvían a comprimir antes de escribir. En el núcleo 5.18, las aplicaciones en espacio de usuario que utilizan llamadas send/receive tienen la posibilidad de transmitir datos comprimidos sin necesidad de reempaquetarlos. Esta funcionalidad se ha implementado gracias a las nuevas operaciones ioctl BTRFS_IOC_ENCODED_READ y BTRFS_IOC_ENCODED_WRITE, que permiten leer y escribir información directamente en los extremos.
- Memoria y servicios del sistema
- Se ha iniciado la integración de un conjunto de parches que permite reducir significativamente el tiempo de recompilación del núcleo mediante la reestructuración de la jerarquía de archivos de cabecera y la reducción de dependencias cruzadas. En el núcleo 5.18 se incluyen parches que optimizan la estructura de archivos de cabecera del planificador de tareas (kernel/sched). En comparación con la versión anterior, el consumo de tiempo del procesador durante la compilación del código kernel/sched/ se ha reducido en un 61%, y el tiempo real se ha reducido en un 3.9% (de 2.95 a 2.84 segundos).
- En el código del núcleo se permite ahora el uso del estándar C11, publicado en 2011. Anteriormente, el código añadido al núcleo debía ajustarse a la especificación ANSI C (C89), establecida en 1989. En los scripts de construcción del núcleo 5.18, la opción ‘—std=gnu89’ ha sido reemplazada por ‘—std=gnu11 -Wno-shift-negative-value’. Se consideró la posibilidad de usar el estándar C17, pero en ese caso habría que elevar la versión mínima soportada de GCC, mientras que la inclusión del soporte para C11 se ajusta a los requisitos actuales de la versión de GCC (5.1).
- Se ha mejorado el rendimiento del planificador de tareas en procesadores AMD con microarquitectura Zen, en los que cada nodo con canales de memoria locales dispone de múltiples cachés de último nivel (LLC, Last Level Cache). En la nueva versión se ha eliminado el desbalance de LLC entre nodos NUMA, lo que ha llevado a un aumento significativo del rendimiento en algunas cargas de trabajo.
- Se han ampliado las herramientas para la trazabilidad de aplicaciones en el espacio de usuario. En la nueva versión del núcleo se ha añadido la posibilidad de que los procesos de usuario creen eventos de trazabilidad (User events) y registren datos en un búfer de trazabilidad que pueden ser visualizados a través de utilidades de trazabilidad del núcleo, tales como ftrace y perf. Los eventos de trazabilidad del espacio de usuario están aislados de los eventos de trazabilidad del núcleo. El estado de los eventos puede ser visualizado a través del archivo /sys/kernel/debug/tracing/user_events_status, y el registro de eventos y la grabación de datos a través del archivo /sys/kernel/debug/tracing/user_events_data.
- Se ha añadido un mecanismo de seguimiento (probe) de llamadas a funciones — fprobe. La API de fprobe se basa en ftrace, pero se limita únicamente a la posibilidad de adjuntar controladores de callback a los puntos de entrada y salida de la función. A diferencia de los kprobes y kretprobes, el nuevo mecanismo permite utilizar un controlador para varias funciones a la vez.
- Se ha retirado el soporte para los antiguos procesadores ARM (ARMv4 y ARMv5) que no cuentan con una unidad de gestión de memoria (MMU). Se mantiene el soporte para sistemas ARMv7-M sin MMU.
- Se ha retirado el soporte para la arquitectura NDS32, similar a RISC, que era utilizada en los procesadores de Andes Technologies. El código fue eliminado debido a la falta de mantenimiento y la escasa demanda de soporte para NDS32 en el núcleo principal de Linux (los pocos usuarios restantes utilizan versiones especializadas del núcleo proporcionadas por los fabricantes de hardware).
- De manera predeterminada, se ha deshabilitado la compilación del núcleo con soporte para el formato de archivo ejecutable a.out para las arquitecturas alpha y m68k, donde este formato sigue siendo utilizado. Es probable que el soporte para el obsolete formato a.out sea completamente eliminado del núcleo en el futuro cercano. Los planes para eliminar el formato a.out se han discutido desde 2019.
- Para la arquitectura PA-RISC, se ha implementado un soporte mínimo para el mecanismo vDSO (objetos compartidos dinámicos virtuales), que proporciona un conjunto limitado de llamadas del sistema accesibles en el espacio del usuario sin cambiar de contexto. El soporte para vDSO ha permitido la posibilidad de ejecutar con una pila no ejecutable.
- Se ha añadido soporte para el mecanismo Intel HFI (Hardware Feedback Interface), que permite al hardware transmitir información al núcleo sobre el rendimiento actual y la eficiencia energética de cada CPU.
- Se ha añadido un controlador para el mecanismo Intel SDSi (Silicon Definido por Software), que permite gestionar la activación de capacidades adicionales en el procesador (como instrucciones especializadas y memoria caché adicional). La idea es que chips con funciones avanzadas bloqueadas pueden ser suministrados a un costo más bajo y luego se pueden "comprar" y activar capacidades adicionales sin reemplazo físico del chip.
- Se agregó el controlador amd_hsmp para el soporte de la interfaz AMD HSMP (Host System Management Port), que proporciona acceso a las funciones de gestión del procesador a través de un conjunto de registros especiales, que aparecieron en los procesadores del servidor AMD EPYC a partir de la generación Fam19h. Por ejemplo, a través de HSMP se pueden obtener datos sobre el consumo de energía y la temperatura, establecer límites en la frecuencia, activar diferentes modos de aumento de rendimiento y gestionar los parámetros de funcionamiento de la memoria.
- En la interfaz de entrada/salida asíncrona io_uring se ha implementado la opción IORING_SETUP_SUBMIT_ALL para registrar en el búfer anular un conjunto de descriptores de archivos, así como la operación IORING_OP_MSG_RING, que permite enviar una señal de un búfer anular a otro búfer anular.
- En el mecanismo DAMOS (Esquemas de Operación Basados en Monitoreo de Acceso a Datos), que permite liberar memoria teniendo en cuenta la frecuencia de acceso a la memoria, se han ampliado las capacidades de control sobre las operaciones de memoria desde el espacio de usuario.
- Se ha integrado la tercera serie de parches con la implementación del concepto de folios de página de memoria (page folios), que se asemejan a las páginas de memoria combinadas (compound pages) pero se diferencian por su semántica mejorada y su organización más clara del trabajo. El uso de folios permite acelerar la gestión de la memoria en ciertos subsistemas del núcleo. En los parches propuestos se ha realizado la conversión a folios de funciones internas de gestión de memoria, incluyendo variedades de la función get_user_pages(). Se ha proporcionado soporte para crear grandes folios en el código de lectura anticipada de datos.
- En el sistema de construcción se ha añadido soporte para las variables de entorno USERCFLAGS y USERLDFLAGS, mediante las cuales se pueden pasar banderas adicionales al compilador y al enlazador.
- En el subsistema eBPF, en el mecanismo BTF (BPF Type Format), que proporciona información para la verificación de tipos en pseudo código BPF, se ha implementado la posibilidad de agregar anotaciones a las variables que hacen referencia a áreas de memoria en el espacio de usuario. Las anotaciones ayudan al sistema de verificación de código BPF a identificar y verificar más eficazmente el acceso a la memoria.
- Se ha propuesto un nuevo manejador de asignación de memoria para almacenar programas BPF cargados, que permite un uso más eficiente de la memoria en situaciones de carga de un gran número de programas BPF.
- La llamada al sistema madvise() ha añadido la bandera MADV_DONTNEED_LOCKED, que complementa la ya existente MADV_DONTNEED, a través de la cual el núcleo puede ser informado anticipadamente sobre la liberación inminente de un bloque de memoria, es decir, que este bloque ya no es necesario y puede ser utilizado por el núcleo. A diferencia de MADV_DONTNEED, el uso de la bandera MADV_DONTNEED_LOCKED es permitido para las páginas de memoria fijas en RAM, que al invocar madvise se expulsan sin cambiar su estado de fijación y, en caso de una posterior referencia al bloque y generación de un «page fault», se devuelven manteniendo su vinculación. Además, se ha añadido una modificación para permitir el uso de la bandera MADV_DONTNEED con grandes páginas de memoria en HugeTLB.
- Virtualización y seguridad
- Para la arquitectura x86 se ha añadido soporte para el mecanismo de protección de ejecución de instrucciones Intel IBT (Indirect Branch Tracking), que dificulta el uso de técnicas de construcción de exploits mediante métodos de programación orientada al retorno (ROP, Return-Oriented Programming), donde el exploit se forma como una cadena de llamadas a fragmentos de instrucciones de máquina ya existentes en la memoria, que finalizan con una instrucción de retorno (generalmente, son los finales de funciones). La esencia del método de protección implementado radica en bloquear las transferencias indirectas al cuerpo de la función mediante la adición de una instrucción especial ENDBR al inicio de la función y permitir la ejecución por transferencia indirecta únicamente si se transfiere a esta instrucción (una llamada indirecta a través de JMP y CALL debe siempre desembocar en la instrucción ENDBR, que se coloca al principio de la función).
- Se ha incluido una verificación más estricta de los límites de búfer en las funciones memcpy(), memmove() y memset(), que se lleva a cabo en la fase de compilación al activar el modo CONFIG_FORTIFY_SOURCE. La modificación añadida consiste en comprobar el desbordamiento de los elementos de estructuras cuyo tamaño es conocido. Se señala que esta capacidad implementada podría bloquear todas las vulnerabilidades relacionadas con memcpy() encontradas en el núcleo, detectadas al menos en los últimos tres años.
- Se añadió la segunda parte del código de la implementación actualizada del generador de números pseudoaleatorios RDRAND, responsable del funcionamiento de los dispositivos /dev/random y /dev/urandom. La nueva implementación se destaca por unificar el funcionamiento de /dev/random y /dev/urandom, añadiendo protección contra la aparición de duplicados en el flujo de números aleatorios al inicio. máquinas virtuales y la transición al uso de la función hash BLAKE2s en lugar de SHA1 para las operaciones de mezcla de entropía. Este cambio ha aumentado la seguridad del generador de números pseudoaleatorios al eliminar el problemático algoritmo SHA1 y excluir la reescritura del vector de inicialización del RNG. Dado que el algoritmo BLAKE2s supera a SHA1 en rendimiento, su aplicación también ha tenido un impacto positivo en el rendimiento.
- Para la arquitectura ARM64, se añadió soporte para un nuevo algoritmo de autenticación de punteros: «QARMA3», que es más rápido que el algoritmo QARMA manteniendo un nivel adecuado de seguridad. La tecnología permite utilizar instrucciones especializadas de ARM64 para verificar las direcciones de retorno mediante firmas digitales que se almacenan en los bits superiores no utilizados del propio puntero.
- Para la arquitectura ARM64, se implementó soporte para compilar con la inclusión en GCC 12 del modo de protección contra la sobreescritura de la dirección de retorno desde la función en caso de un desbordamiento de búfer en la pila. La protección radica en guardar, después de pasar el control a la función, la dirección de retorno en una «pila sombra» separada y extraer esta dirección antes de salir de la función.
- Se añadió un nuevo almacén de claves (keyring) — «machine», que contiene las claves del propietario del sistema (MOK, Machine Owner Keys), soportadas en el cargador shim. Estas claves pueden ser utilizadas para certificar con una firma digital los componentes del núcleo cargados en la fase posterior al arranque inicial (por ejemplo, módulos del núcleo).
- Se eliminó el soporte para claves privadas asimétricas para TPM, que se ofrecieron en la versión obsoleta de TPM, tienen problemas de seguridad conocidos y no se han generalizado en la práctica.
- Se añadió protección de datos del tipo size_t contra desbordamientos enteros. En el código se utilizan los manejadores size_mul(), size_add() y size_sub(), que permiten realizar multiplicaciones, sumas y restas de tamaños del tipo size_t de forma segura.
- Al compilar el núcleo se han habilitado las banderas «-Warray-bounds» y «-Wzero-length-bounds», que generan advertencias cuando un índice sale del límite del array o se utilizan arrays de longitud cero.
- El dispositivo virtio-crypto ha añadido soporte para cifrado utilizando el algoritmo RSA.
- Subsistema de red
- En la implementación de puentes de red se ha añadido soporte para el modo de bloqueo de puertos (locked mode), donde el usuario puede enviar tráfico a través de un puerto solo con una dirección MAC permitida. También se ha añadido la posibilidad de utilizar múltiples estructuras para evaluar el estado del protocolo STP (Spanning Tree Protocol). Anteriormente, la vinculación para VLAN solo podía hacerse de forma directa a STP (1:1), donde cada VLAN era gestionada de manera independiente. En la nueva versión se ha añadido el parámetro mst_enable, que, al estar activado, permite que el estado de las VLAN sea controlado por el módulo MST (Multiple Spanning Trees) y que la vinculación de las VLAN pueda corresponderse con el modelo M:N.
- Se ha continuado el trabajo de integración en la pila de red de herramientas para rastrear las causas del descartado de paquetes (códigos de motivo). El código de motivo se transmite durante la liberación de la memoria asociada al paquete y permite tener en cuenta situaciones como el descarte de un paquete debido a errores en los campos del encabezado, la detección de suplantación de identidad por parte del filtro rp_filter, un checksum incorrecto, falta de memoria, activación de reglas IPSec XFRM, un número de secuencia TCP incorrecto, etc.
- Se ha habilitado la posibilidad de transmitir paquetes de red desde programas BPF, que se ejecutan desde el espacio de usuario en modo BPF_PROG_RUN, donde los programas BPF se ejecutan en el núcleo pero devuelven resultados al espacio de usuario. Los paquetes se transmiten utilizando la subestructura XDP (eXpress Data Path). Se admite el modo live de procesamiento de paquetes, donde el manejador de XDP puede redirigir paquetes de red sobre la marcha al stack de red o a otros dispositivos. También es posible crear generadores de tráfico externo por software o insertar tramas de red en el stack de red.
- Para los programas BPF, que se adjuntan a cgroups de red, se han propuesto funciones auxiliares para establecer explícitamente el valor devuelto por las llamadas al sistema, lo que permite transmitir información más completa sobre las razones del bloqueo de la llamada al sistema.
- Se ha añadido soporte para paquetes fragmentados en la subestructura XDP (eXpress Data Path), colocados en múltiples buffers, lo que permite manejar Jumbo-frames en XDP y aplicar TSO/GRO (TCP Segmentation Offload/Generic Receive Offload) para XDP_REDIRECT.
- Se ha acelerado significativamente el proceso de eliminación de espacios de nombres de red, lo que ha sido solicitado en algunos sistemas grandes con alto volumen de tráfico.
- Hardware
- En el controlador amdgpu, la tecnología de sincronización adaptativa FreeSync está habilitada por defecto, lo que permite ajustar la frecuencia de actualización de la información en pantalla, garantizando fluidez y ausencia de desgarros de imagen durante los juegos y la visualización de videos. Se ha declarado la compatibilidad estable con la GPU Aldebaran.
- En el controlador i915 se ha añadido soporte para los chips Intel Alderlake N y las tarjetas gráficas discretas Intel DG2-G12 (Arc Alchemist).
- En el controlador nouveau se ha mejorado el soporte para tasas de bits más altas en las interfaces DP/eDP y se ha añadido soporte para extensores de cable lttprs (Link-Training Tunable PHY Repeaters).
- En el subsistema drm (Gestor de Renderizado Directo) de los controladores armada, exynos, gma500, hyperv, imx, ingenic, mcde, mediatek, msm, omap, rcar-du, rockchip, sprd, sti, tegra, tilcdc, xen y vc4 se ha añadido soporte para el parámetro nomodeset, que permite desactivar el cambio de modos de video a nivel de núcleo y el uso de medios para la aceleración de renderizado, dejando solo las funcionalidades relacionadas con el framebuffer del sistema.
- Se ha añadido soporte para SoCs ARM Qualcomm Snapdragon 625/632 (utilizados en smartphones LG Nexus 5X y Fairphone FP3), Samsung Exynos 850, Samsung Exynos 7885 (utilizados en Samsung Galaxy A8), Airoha (Mediatek/EcoNet) EN7523, Mediatek mt6582 (tableta Prestigio PMT5008 3G), Microchip Lan966, Renesas RZ/G2LC, RZ/V2L, Tesla FSD, TI K3/AM62 e i.MXRTxxxx.
- Se ha añadido soporte para dispositivos y placas ARM de Broadcom (Raspberry Pi Zero 2 W), Qualcomm (Google Herobrine R1 Chromebook, SHIFT6mq, Samsung Galaxy Book2), Rockchip (Pine64 PineNote, Bananapi-R2-Pro, STM32 Emtrion emSBS, Samsung Galaxy Tab S, tableta Prestigio PMT5008 3G), Allwinner (A20-Marsboard), Amlogic (Amediatek X96-AIR, CYX A95XF3-AIR, Haochuangy H96-Max, Amlogic AQ222 y OSMC Vero 4K+), Aspeed (Quanta S6Q, ASRock ROMED8HM3), Marvell MVEBU/Armada (Ctera C200 V1 y V2 NAS), Mstar (DongShanPiOne, Miyoo Mini), NXP i.MX (Protonic PRT8MM, emCON-MX8M Mini, Toradex Verdin, Gateworks GW7903).
- Se ha añadido soporte para sistemas de sonido y códecs como AMD PDM, Atmel PDMC, Awinic AW8738, i.MX TLV320AIC31xx, Intel CS35L41, ESSX8336, Mediatek MT8181, nVidia Tegra234, Qualcomm SC7280, Renesas RZ/V2L y Texas Instruments TAS585M. Se ha añadido una implementación inicial del controlador de sonido para el chip DSP Intel AVS. Se ha actualizado el soporte para controladores de Intel ADL y Tegra234, y se han realizado cambios para mejorar el soporte de audio en dispositivos de Dell, HP, Lenovo, ASUS, Samsung y Clevo.
Al mismo tiempo, la Fundación Latinoamericana de Software Libre ha formado una versión completamente libre del núcleo 5.18 — Linux-libre 5.18-gnu, depurado de elementos de firmware y controladores que contienen componentes no libres o secciones de código cuyo uso está limitado por el fabricante. En esta nueva versión, se han limpiado los controladores para paneles MIPI DBI, VPU Amphion, WiFi MediaTek MT7986 WMAC, Mediatek MT7921U (USB) y Realtek 8852a/8852c, chips de sonido Intel AVS y Texas Instruments TAS5805M. También se han limpiado los archivos DTS para diferentes SoC Qualcomm con procesadores basados en la arquitectura AArch64. Se ha actualizado el código de limpieza de blobs en los controladores y subsistemas de AMD GPU, MediaTek MT7915, Silicon Labs WF200+ WiFi, Mellanox Spectrum Ethernet, Realtek rtw8852c, Qualcomm Q6V5, Wolfson ADSP, MediaTek HCI UART.
Fuente: opennet.ru
