Lanzamiento del núcleo de Linux 5.18

Luego de dos meses de desarrollo, Linus Torvalds presentó el lanzamiento del kernel Linux 5.18. Entre los cambios más notables: se llevó a cabo una limpieza importante de la funcionalidad obsoleta, se declaró obsoleto el Reiserfs FS, se implementaron eventos de seguimiento de procesos de usuario, se agregó soporte para el mecanismo para bloquear exploits Intel IBT, se habilitó un modo de detección de desbordamiento de búfer cuando usando la función memcpy(), se agregó un mecanismo para rastrear las llamadas a la función fprobe, se mejoró el rendimiento del programador de tareas en las CPU AMD Zen, se incluyó un controlador para administrar la funcionalidad de la CPU Intel (SDS), se integraron algunos parches para reestructurar archivos de cabecera y se ha aprobado el uso del estándar C11.

La nueva versión incluye 16206 correcciones de 2127 desarrolladores (en la última versión hubo 14203 correcciones de 1995 desarrolladores), el tamaño del parche es de 108 MB (los cambios afectaron a 14235 archivos, se agregaron 1340982 líneas de código, se eliminaron 593836 líneas). Aproximadamente el 44% de todos los cambios introducidos en 5.18 están relacionados con controladores de dispositivos, aproximadamente el 16% de los cambios están relacionados con la actualización de código específico para arquitecturas de hardware, el 11% están relacionados con la pila de redes, el 3% están relacionados con sistemas de archivos y el 3% están relacionados con los subsistemas internos del núcleo.

Innovaciones clave en el kernel 5.18:

  • Subsistema de disco, E/S y sistemas de archivos
    • El sistema de archivos Btrfs ha agregado soporte para reenviar datos comprimidos al realizar operaciones de envío y recepción. Anteriormente, cuando se usaba enviar/recibir, el lado emisor descomprimió los datos almacenados en forma comprimida y el lado receptor los recomprimió antes de escribirlos. En el kernel 5.18, las aplicaciones de espacio de usuario que utilizan llamadas de envío/recepción recibieron la capacidad de transmitir datos comprimidos sin volver a empaquetarlos. La funcionalidad se implementa gracias a las nuevas operaciones ioctl BTRFS_IOC_ENCODED_READ y BTRFS_IOC_ENCODED_WRITE, que le permiten leer y escribir información directamente en extensiones.

      Además, Btrfs mejora el rendimiento de fsync. Se agregó la capacidad de deduplicar y realizar reflink (clonación de metadatos de archivos mediante la creación de un vínculo a datos existentes sin copiarlos) para todo el almacenamiento, sin limitarse a los puntos de montaje.

    • En el modo de E/S directa, es posible acceder a archivos cifrados cuando fscrypt utiliza cifrado en línea, en el que las operaciones de cifrado y descifrado las realiza el controlador de la unidad en lugar del kernel. Con el cifrado normal del kernel, el acceso a archivos cifrados mediante E/S directa sigue siendo imposible, ya que se accede a los archivos sin pasar por el mecanismo de almacenamiento en búfer del kernel.
    • El servidor NFS incluye soporte para el protocolo NFSv3 de forma predeterminada, que ahora no requiere una habilitación por separado y está disponible cuando NFS está habilitado de manera general. NFSv3 se considera la versión principal y siempre admitida de NFS, y es posible que se suspenda la compatibilidad con NFSv2 en el futuro. Se ha mejorado significativamente la eficiencia de lectura del contenido del directorio.
    • El sistema de archivos ReiserFS ha quedado obsoleto y se espera que se elimine en 2025. Desaprobar ReiserFS reducirá el esfuerzo necesario para mantener los cambios en todo el sistema de archivos relacionados con la compatibilidad con la nueva API para montaje, iomap y tomos.
    • Para el sistema de archivos F2FS, se implementó la capacidad de asignar ID de usuario de sistemas de archivos montados, que se utiliza para comparar los archivos de un usuario específico en una partición externa montada con otro usuario en el sistema actual.
    • Se ha reelaborado el código para calcular estadísticas en los controladores Device-mapper, lo que ha mejorado significativamente la precisión de la contabilidad en controladores como dm-crypt.
    • Los dispositivos NVMe ahora admiten sumas de comprobación de 64 bits para comprobar la integridad.
    • Para el sistema de archivos exfat, se ha propuesto una nueva opción de montaje "keep_last_dots", que desactiva la eliminación de puntos al final del nombre del archivo (en Windows, los puntos al final del nombre del archivo se eliminan de forma predeterminada).
    • EXT4 mejora el rendimiento del modo fast_commit y aumenta la escalabilidad. La opción de montaje "mb_optimize_scan", que permite aumentar el rendimiento en condiciones de gran fragmentación del sistema de archivos, está adaptada para trabajar con archivos con extensiones.
    • Se ha interrumpido la compatibilidad con secuencias de escritura en el subsistema que admite dispositivos de bloque. Esta característica se propuso para los SSD, pero no estaba muy extendida y actualmente no hay dispositivos en uso que admitan este modo y es poco probable que aparezcan en el futuro.
  • Servicios de memoria y sistema.
    • Ha comenzado la integración de un conjunto de parches, que permiten reducir significativamente el tiempo de reconstrucción del kernel al reestructurar la jerarquía de los archivos de encabezado y reducir el número de dependencias cruzadas. Kernel 5.18 incluye parches que optimizan la estructura de los archivos de encabezado del programador de tareas (kernel/sched). En comparación con la versión anterior, el consumo de tiempo de CPU al ensamblar el código kernel/sched/se redujo en un 61 %, y el tiempo real disminuyó en un 3.9 % (de 2.95 a 2.84 segundos).
    • El código kernel puede utilizar el estándar C11, publicado en 2011. Anteriormente, el código agregado al kernel tenía que cumplir con la especificación ANSI C (C89), creada en 1989. En los scripts de compilación del kernel 5.18, la opción "—std=gnu89" fue reemplazada por "—std=gnu11 -Wno-shift-negative-value". Se consideró la posibilidad de utilizar el estándar C17, pero en este caso sería necesario aumentar la versión mínima soportada de GCC, mientras que la inclusión del soporte C11 se ajusta a los requisitos actuales para la versión GCC (5.1).
    • Se mejoró el rendimiento de la programación de tareas en los procesadores AMD con microarquitectura Zen, que proporcionan múltiples cachés de último nivel (LLC) para cada nodo con canales de memoria locales. La nueva versión elimina el desequilibrio LLC entre los nodos NUMA, lo que condujo a un aumento significativo en el rendimiento para algunos tipos de carga de trabajo.
    • Se han ampliado las herramientas para rastrear aplicaciones en el espacio del usuario. La nueva versión del kernel agrega la capacidad de que los procesos de usuario creen eventos de usuario y escriban datos en el búfer de seguimiento, que se pueden ver a través de utilidades de seguimiento del kernel estándar como ftrace y perf. Los eventos de seguimiento del espacio de usuario están aislados de los eventos de seguimiento del kernel. El estado del evento se puede ver a través del archivo /sys/kernel/debug/tracing/user_events_status, y el registro de eventos y el registro de datos a través del archivo /sys/kernel/debug/tracing/user_events_data.
    • Se agregó un mecanismo para monitorear llamadas a funciones (sonda): fprobe. La API fprobe se basa en ftrace, pero está limitada únicamente por la capacidad de adjuntar controladores de devolución de llamada a puntos de entrada y salida de funciones. A diferencia de kprobes y kretprobes, el nuevo mecanismo le permite utilizar un controlador para varias funciones a la vez.
    • Se ha interrumpido la compatibilidad con procesadores ARM más antiguos (ARMv4 y ARMv5) que no están equipados con una unidad de administración de memoria (MMU). Se mantiene la compatibilidad con sistemas ARMv7-M sin MMU.
    • Se ha descontinuado el soporte para la arquitectura NDS32 similar a RISC utilizada en los procesadores de Andes Technologies. El código se eliminó debido a la falta de mantenimiento y la falta de demanda de soporte NDS32 en el kernel principal de Linux (los usuarios restantes usan compilaciones de kernel especializadas de fabricantes de hardware).
    • De forma predeterminada, la compilación del kernel compatible con el formato de archivo ejecutable a.out está deshabilitada para las arquitecturas alpha y m68k, que continúan usando este formato. Es probable que pronto se elimine por completo del kernel la compatibilidad con el formato heredado a.out. Desde 2019 se han discutido planes para eliminar el formato a.out.
    • La arquitectura PA-RISC proporciona un soporte mínimo para el mecanismo vDSO (objetos virtuales dinámicos compartidos), que proporciona un conjunto limitado de llamadas al sistema disponibles en el espacio del usuario sin cambio de contexto. La compatibilidad con vDSO hizo posible implementar la capacidad de ejecutarse con una pila no ejecutable.
    • Se agregó soporte para el mecanismo Intel HFI (Hardware Feedback Interface), que permite que el hardware transmita información al kernel sobre el rendimiento actual y la eficiencia energética de cada CPU.
    • Se agregó un controlador para el mecanismo Intel SDSi (Software-Defined Silicon), que le permite controlar la inclusión de funciones adicionales en el procesador (por ejemplo, instrucciones especializadas y memoria caché adicional). La idea es que los chips se puedan suministrar a un precio más bajo con funciones avanzadas bloqueadas, que luego se puedan “comprar” y activar capacidades adicionales sin necesidad de reemplazar el hardware del chip.
    • El controlador amd_hsmp se agregó para admitir la interfaz AMD HSMP (Host System Management Port), que brinda acceso a las funciones de administración del procesador a través de un conjunto de registros especiales que aparecieron en los procesadores de servidor AMD EPYC a partir de la generación Fam19h. Por ejemplo, a través de HSMP puede obtener datos sobre el consumo de energía y la temperatura, establecer límites de frecuencia, activar varios modos de mejora del rendimiento y administrar parámetros de memoria.
    • La interfaz de E/S asíncrona io_uring implementa la opción IORING_SETUP_SUBMIT_ALL para registrar un conjunto de descriptores de archivos en un búfer de anillo, y la operación IORING_OP_MSG_RING para enviar una señal desde un búfer de anillo a otro búfer de anillo.
    • 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, tiene capacidades ampliadas para monitorear las operaciones de memoria desde el espacio del usuario.
    • Se ha integrado una tercera serie de parches con la implementación del concepto de folios de páginas, que se asemejan a páginas compuestas, pero tienen una semántica mejorada y una organización del trabajo más clara. El uso de tomos le permite acelerar la administración de la memoria en algunos subsistemas del kernel. En los parches propuestos, las funciones de administración de la memoria interna se tradujeron en publicaciones, incluidas variaciones de la función get_user_pages(). Se brindó soporte para la creación de grandes volúmenes en código de lectura anticipada.
    • El sistema ensamblador ahora admite variables de entorno USERCFLAGS y USERLDFLAGS, con las que puede pasar indicadores adicionales al compilador y al vinculador.
    • En el subsistema eBPF, el mecanismo BTF (BPF Type Format), que proporciona información de verificación de tipos en pseudocódigo BPF, brinda la capacidad de agregar anotaciones a variables que hacen referencia a áreas de memoria en el espacio del usuario. Las anotaciones ayudan al sistema de verificación de códigos BPF a identificar y verificar mejor los accesos a la memoria.
    • Se ha propuesto un nuevo controlador de asignación de memoria para almacenar programas BPF cargados, que permite un uso más eficiente de la memoria en situaciones donde se carga una gran cantidad de programas BPF.
    • Se ha agregado el indicador MADV_DONTNEED_LOCKED a la llamada al sistema madvise(), que proporciona herramientas para optimizar la gestión de la memoria del proceso, que complementa el indicador MADV_DONTNEED existente, a través del cual se puede informar al núcleo con antelación sobre la inminente liberación de un bloque de memoria, es decir. que este bloque ya no es necesario y puede ser utilizado por el kernel. A diferencia de MADV_DONTNEED, el uso del indicador MADV_DONTNEED_LOCKED está permitido para páginas de memoria ancladas en la RAM que, cuando se llama a madvise, se desalojan sin cambiar su estado anclado y, en caso de un acceso posterior al bloque y la generación de una "página culpa”, se devuelven con la encuadernación conservada. Además, se agregó un cambio para permitir que el indicador MADV_DONTNEED se use con páginas de memoria grandes en HugeTLB.
  • Virtualización y seguridad
    • Para la arquitectura x86, se ha agregado soporte para el mecanismo de protección del flujo de comandos Intel IBT (Indirect Branch Tracking), que evita el uso de técnicas de construcción de exploits utilizando técnicas de programación orientada al retorno (ROP, Return-Oriented Programming), en las que el exploit se forma en forma de una cadena de llamadas ya existentes en la memoria de partes de instrucciones de la máquina que terminan con una instrucción de retorno de control (por regla general, estos son los finales de las funciones). La esencia del método de protección implementado es bloquear las transiciones indirectas al cuerpo de una función agregando una instrucción ENDBR especial al comienzo de la función y permitiendo la ejecución de una transición indirecta solo en el caso de una transición a esta instrucción (una transición indirecta las llamadas a través de JMP y CALL siempre deben recaer en la instrucción ENDBR, que se coloca al principio de las funciones).
    • Se habilitó una verificación más estricta de los límites del búfer en las funciones memcpy(), memmove() y memset(), realizada en tiempo de compilación cuando el modo CONFIG_FORTIFY_SOURCE está habilitado. El cambio añadido se reduce a comprobar si los elementos de las estructuras cuyo tamaño se conoce superan los límites. Cabe señalar que la característica implementada permitiría bloquear todos los desbordamientos del búfer del kernel relacionados con memcpy() identificados en al menos los últimos tres años.
    • Se agregó la segunda parte del código para la implementación actualizada del generador de números pseudoaleatorios RDRAND, que es responsable del funcionamiento de los dispositivos /dev/random y /dev/urandom. La nueva implementación se destaca por unificar la operación de /dev/random y /dev/urandom, agregar protección contra la aparición de duplicados en el flujo de números aleatorios al iniciar máquinas virtuales y cambiar al uso de la función hash BLAKE2s en lugar de SHA1 para operaciones de mezcla de entropía. El cambio mejoró la seguridad del generador de números pseudoaleatorios al eliminar el problemático algoritmo SHA1 y eliminar la sobrescritura del vector de inicialización RNG. Dado que el algoritmo BLAKE2s es superior al SHA1 en rendimiento, su uso también tuvo un efecto positivo en el rendimiento.
    • Para la arquitectura ARM64, se agregó soporte para un nuevo algoritmo de autenticación de puntero: "QARMA3", que es más rápido que el algoritmo QARMA y al mismo tiempo mantiene el nivel adecuado de seguridad. La tecnología le permite utilizar instrucciones ARM64 especializadas para verificar las direcciones de retorno mediante firmas digitales que se almacenan en los bits superiores no utilizados del puntero.
    • Para la arquitectura ARM64, se implementó soporte para ensamblaje con la inclusión en GCC 12 de un modo de protección contra la sobrescritura de la dirección de retorno de una función en caso de desbordamiento del búfer en la pila. La esencia de la protección es guardar la dirección de retorno en una pila "sombra" separada después de transferir el control a una función y recuperar esta dirección antes de salir de la función.
    • Se agregó un nuevo llavero: "máquina", que contiene las claves del propietario del sistema (MOK, claves del propietario de la máquina), admitidas en el gestor de arranque shim. Estas claves se pueden utilizar para firmar digitalmente los componentes del kernel cargados en una etapa posterior al arranque (por ejemplo, módulos del kernel).
    • Se eliminó la compatibilidad con claves privadas asimétricas para TPM, que se ofrecían en una versión heredada de TPM, tenían problemas de seguridad conocidos y no se adoptaron ampliamente en la práctica.
    • Se agregó protección de datos con tipo size_t contra desbordamientos de enteros. El código incluye controladores size_mul(), size_add() y size_sub(), que le permiten multiplicar, sumar y restar tamaños de forma segura con el tipo size_t.
    • Al construir el kernel, se habilitan los indicadores “-Warray-bounds” y “-Wzero-length-bounds”, que muestran advertencias cuando el índice va más allá del límite de la matriz y cuando se utilizan matrices de longitud cero.
    • El dispositivo virtio-crypto ha agregado soporte para cifrado mediante el algoritmo RSA.
  • Subsistema de red
    • En la implementación de puentes de red, se agregó soporte para el modo de enlace de puerto (modo bloqueado), en el que el usuario puede enviar tráfico a través del puerto solo desde una dirección MAC autorizada. También se ha agregado la capacidad de utilizar varias estructuras para evaluar el estado del protocolo STP (Spanning Tree Protocol). Anteriormente, las VLAN solo podían asignarse directamente a STP (1:1), y cada VLAN se administraba de forma independiente. La nueva versión agrega el parámetro mst_enable, cuando está habilitado, el estado de las VLAN es controlado por el módulo MST (Multiple Spanning Trees) y la vinculación de las VLAN puede corresponder al modelo M:N.
    • Se continuó trabajando en la integración de herramientas en la pila de red para rastrear los motivos de la caída de paquetes (códigos de motivo). El código de motivo se envía cuando se libera la memoria asociada con el paquete y permite situaciones tales como descarte de paquetes debido a errores de encabezado, detección de suplantación de identidad de rp_filter, suma de verificación no válida, falta de memoria, reglas IPSec XFRM activadas, número de secuencia TCP no válido, etc.
    • Es posible transferir paquetes de red desde programas BPF iniciados desde el espacio del usuario en el modo BPF_PROG_RUN, en el que los programas BPF se ejecutan en el kernel, pero devuelven el resultado al espacio del usuario. Los paquetes se transmiten mediante el subsistema XDP (eXpress Data Path). Se admite el modo de procesamiento de paquetes en vivo, en el que el procesador XDP puede redirigir paquetes de red sobre la marcha a la pila de red o a otros dispositivos. También es posible crear generadores de software de tráfico externo o sustituir marcos de red en la pila de red.
    • Para los programas BPF adjuntos a grupos c de red, se han propuesto funciones auxiliares para establecer explícitamente el valor de retorno de las llamadas al sistema, lo que permite transmitir información más completa sobre los motivos del bloqueo de una llamada al sistema.
    • El subsistema XDP (eXpress Data Path) ha agregado soporte para paquetes fragmentados colocados en múltiples buffers, lo que le permite procesar tramas gigantes en XDP y usar TSO/GRO (descarga de segmentación TCP/descarga de recepción genérica) para XDP_REDIRECT.
    • Se ha acelerado significativamente el proceso de eliminación de espacios de nombres de red, algo que era muy solicitado en algunos sistemas grandes con un gran volumen de tráfico.
  • Equipo
    • El controlador amdgpu incluye de forma predeterminada la tecnología de sincronización adaptativa FreeSync, que le permite ajustar la frecuencia de actualización de la información en la pantalla, garantizando imágenes fluidas y sin cortes mientras juega y mira videos. La compatibilidad con la GPU Aldebaran se ha anunciado como estable.
    • El controlador i915 agrega soporte para chips Intel Alderlake N y tarjetas gráficas discretas Intel DG2-G12 (Arc Alchemist).
    • El controlador nouveau brinda soporte para velocidades de bits más altas para interfaces DP/eDP y soporte para extensores de cable lttprs (Repetidores PHY sintonizables de entrenamiento de enlace).
    • En el subsistema drm (Direct Rendering Manager) en los controladores armada, exynos, gma500, hyperv, imx, ingenic, mcde, mediatek, msm, omap, rcar-du, rockchip, sprd, sti, tegra, tilcdc, xen y vc4. Se ha agregado nomodeset, que le permite deshabilitar el cambio de modos de video a nivel del kernel y el uso de herramientas de aceleración de renderizado de hardware, dejando solo la funcionalidad relacionada con el framebuffer del sistema.
    • Se agregó soporte para ARM SoС Qualcomm Snapdragon 625/632 (usado en los teléfonos inteligentes LG Nexus 5X y Fairphone FP3), Samsung Exynos 850, Samsung Exynos 7885 (usado en Samsung Galaxy A8), Airoha (Mediatek/EcoNet) EN7523, Mediatek mt6582 (Prestigio PMT5008 tableta 3G), Microchip Lan966, Renesas RZ/G2LC, RZ/V2L, Tesla FSD, TI K3/AM62 y i.MXRTxxxx.
    • Se agregó 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 agregó soporte para sistemas de sonido y códecs AMD PDM, Atmel PDMC, Awinic AW8738, i.MX TLV320AIC31xx, Intel CS35L41, ESSX8336, Mediatek MT8181, nVidia Tegra234, Qualcomm SC7280, Renesas RZ/V2L, Texas Instruments TAS585M. Se agregó la implementación inicial del controlador de sonido para el chip Intel AVS DSP. Se actualizó la compatibilidad con controladores para Intel ADL y Tegra234 y se realizaron cambios para mejorar la compatibilidad con audio en dispositivos Dell, HP, Lenovo, ASUS, Samsung y Clevo.

    Al mismo tiempo, la Fundación Latinoamericana de Software Libre creó una versión del kernel 5.18 completamente libre - Linux-libre 5.18-gnu, sin elementos de firmware y controladores que contengan componentes o secciones de código no libres, cuyo alcance es limitado. por el fabricante. La nueva versión limpia los controladores para paneles MIPI DBI, VPU Amphion, WiFi MediaTek MT7986 WMAC, Mediatek MT7921U (USB) y chips de sonido Realtek 8852a/8852c, Intel AVS y Texas Instruments TAS5805M. También se limpiaron archivos DTS para varios SoC de Qualcomm con procesadores basados ​​en la arquitectura AArch64. Código de limpieza de blobs actualizado en controladores y subsistemas de AMD GPU, MediaTek MT7915, Silicon Labs WF200+ WiFi, Mellanox Spectru Ethernet, Realtek rtw8852c, Qualcomm Q6V5, Wolfson ADSP, MediaTek HCI UART.

Fuente: opennet.ru

Añadir un comentario