Después de dos meses de desarrollo, Linus Torvalds presentó el lanzamiento del núcleo Linux 6.11. Entre los cambios más destacados se encuentran: soporte para operaciones de escritura atómica a nivel de bloque, soporte para operaciones bind() y listen() en io_uring, un nuevo mecanismo de bloqueo para controladores de interrupción, la posibilidad de escribir en archivos ejecutables mapeados en memoria, apoyo para la escritura de controladores de dispositivos de bloque en el lenguaje Rust y optimización de la llamada a getrandom(), además de una nueva implementación de AES-GCM.
En esta nueva versión se aceptaron 15130 correcciones de 2078 desarrolladores, con un tamaño de parche de 85 MB (los cambios afectaron a 13282 archivos, se añadieron 985857 líneas de código y se eliminaron 268915 líneas). En la última versión hubo 14564 correcciones de 1989 desarrolladores, con un tamaño de parche de 41 MB (dos veces menos que el parche para el núcleo 6.11). Cerca del 46% de todos los cambios presentados en 6.11 están relacionados con controladores de dispositivos, aproximadamente el 17% corresponde a la actualización de código específico de arquitecturas de hardware, el 10% está relacionado con la pila de red, el 5% con sistemas de archivos y el 3% con subsistemas internos del núcleo.
Las principales novedades en el núcleo 6.11:
- Subsistema de disco, entrada/salida y sistemas de archivos
- Se ha implementado el soporte para operaciones de escritura atómica a nivel de bloque, en las que se escribe en el almacenamiento todo el conjunto de bloques especificado o ninguno de ellos, lo que permite protegerse contra situaciones en las que, tras una falla de hardware, sólo se escriben algunas partes de los bloques, dejando información antigua en otras partes. Para habilitar el modo de escritura atómica en la llamada al sistema pwritev(), se ha agregado el flag RWF_ATOMIC. La información sobre el soporte de escritura atómica (atomic_write_unit_min, atomic_write_unit_max y atomic_write_segments_max) en relación con archivos específicos puede obtenerse utilizando la función statx().
- Se ha proporcionado soporte para escribir en archivos ejecutables asociados a procesos en ejecución. Anteriormente, al igual que en otros sistemas Unix-like, el núcleo generaba un error al intentar escribir en un archivo ejecutable de un proceso en ejecución. Esta restricción se ha eliminado, ya que carecía de sentido práctico.
- Se ha implementado la posibilidad de desarrollar controladores de dispositivos de bloque en el lenguaje Rust. Como ejemplo, se ha añadido al núcleo un controlador rnull, que es análogo al controlador null_blk, escrito en Rust.
- En el sistema de archivos Btrfs, en la opción de montaje «rescue=», se ha implementado soporte para nuevos modos «ignoremetacsums» e «ignoresuperflags», que se pueden utilizar para mover algunas verificaciones al espacio de usuario durante la recuperación del sistema de archivos después de un fallo. La implementación de la operación de retorno dinámico de grupos de bloques se ha modificado para eliminar la situación de falta de espacio libre en condiciones de llenado incompleto del sistema de archivos.
- En el sistema de archivos ntfs3 se ha implementado soporte para los atributos «compressed» e «immutable», que definen archivos comprimidos e inmutables.
- En los sistemas de archivos F2FS y Ext4, el manejo de los nombres de archivos sin distinción de mayúsculas (casefold) se ha simplificado mediante el almacenamiento de nombres en forma de cadenas qstr sin conversiones de mayúsculas innecesarias.
- En el sistema de archivos Ext4, la implementación de la función jbd2_transaction_committed se ha optimizado para aumentar el rendimiento en unidades de almacenamiento muy rápidas (en las pruebas se ha observado un aumento en la cantidad de operaciones procesadas por segundo que alcanza hasta un 20%).
- En la llamada al sistema statx() se permite pasar un puntero NULL en lugar de una cadena vacía con la ruta del archivo, en caso de que se establezca la bandera AT_EMPTY_PATH.
- En la llamada al sistema open_by_handle_at() se han suavizado las verificaciones de derechos de acceso al archivo, en caso de no tener los privilegios CAP_DAC_READ_SEARCH para buscar en el espacio de nombres inicial. Anteriormente, la necesidad de tener privilegios CAP_DAC_READ_SEARCH en el espacio de nombres inicial impedía el uso de la llamada al sistema open_by_handle_at() en contenedores.
- Se han ampliado las capacidades de las llamadas al sistema listmount() y statmount(). En listmount() se ha añadido la bandera LISTMOUNT_REVERSE para mostrar el contenido de la tabla de puntos de montaje en orden inverso (los registros más recientes en la parte superior). En statmount() se ha implementado la salida de opciones establecidas al montar el sistema de archivos. En ambas llamadas al sistema se permite la operación en ausencia de acceso al espacio de nombres inicial (cuando solo se tiene acceso al espacio de nombres local o externo).
- En el sistema de archivos Bcachefs se ha implementado soporte para la recuperación automática y transparente de datos problemáticos, utilizando códigos de recuperación de errores: si ocurre un error de entrada/salida al leer o se calcula una discrepancia en la suma de verificación, el bloque de datos problemático se sobrescribe automáticamente cuando hay redundancia disponible para su recuperación.
- Memoria y servicios del sistema
- Se han incluido parches que implementan un nuevo mecanismo de bloqueo para los controladores de interrupciones (BH, bottom-half), que asegura el bloqueo de las estructuras de datos utilizadas, sin bloquear, a su vez, la ejecución paralela de código no relacionado. Se destaca que el cambio no solo ha reducido las latencias para núcleos que operan en modo de tiempo real, sino que también ha mejorado el rendimiento de los núcleos comunes (por ejemplo, se observa un aumento del 14.5% en el rendimiento del subsistema de red para ciertos tipos de carga).
- Se ha añadido soporte para operaciones en la subsistema de entrada/salida asíncrona io_uring para implementar las funciones bind() y listen(), utilizadas para crear sockets de red que aceptan conexiones.
- Se ha agregado un conjunto de operaciones ioctl para el pseudo-sistema de archivos NSFS (NameSpace FS), utilizado para trabajar con espacios de nombres. Los nuevos ioctl permiten transformar identificadores de procesos y grupos de hilos entre diferentes espacios de nombres de identificadores de procesos (PID namespace). También se han añadido ioctl similares que permiten, basándose en identificadores pidfd, determinar descriptores de archivos de procesos en espacios de nombres separados en el pseudo-sistema pidfd.
- Para los programas BPF, se ha añadido soporte para un nuevo iterador que trabaja con máscaras de bits, que se puede utilizar, por ejemplo, para recorrer bits individuales en regiones de memoria como cpumask. Se ha implementado un mecanismo para enviar a los procesos en espacio de usuario notificaciones sobre la desconexión (detach/unregister) de un objeto struct_ops. Se ha ampliado la gama de tipos que se pueden utilizar en matrices (por ejemplo, se pueden declarar matrices que tengan elementos con tipos kptr, bpf_rb_root y bpf_list_head). Se ha propuesto un mecanismo más fiable llamado Split BTF (BPF Type Format), que se utiliza para verificar tipos en el pseudocódigo BPF.
- Se ha añadido una subsistema que permite organizar la alimentación de dispositivos en un orden específico, en caso de que un dispositivo deba activarse antes que otro (por ejemplo, al activar chips inalámbricos en plataformas Qualcomm).
- Se ha añadido el módulo 'Sloppy logic analyzer', que permite crear analizadores lógicos de señales simples que utilizan GPIO y funcionan en un núcleo de CPU separado.
- Se ha añadido soporte para constantes en tiempo de ejecución que pueden utilizarse en lugar de variables inicializadas una sola vez. Por ejemplo, las constantes en tiempo de ejecución pueden aplicarse en lugar de variables que almacenan un puntero y un tamaño para la caché dentry. Estas variables se establecen durante la carga y luego nunca cambian. La idea es insertar directamente los valores de tales variables en las instrucciones del código, eliminando los gastos generales asociados con las manipulaciones de punteros.
- Continúa la transferencia de cambios de la rama Rust-for-Linux, relacionada con el uso del lenguaje Rust como segundo idioma para el desarrollo de controladores y módulos del núcleo (el soporte de Rust no está habilitado por defecto y no convierte a Rust en una de las dependencias obligatorias para compilar el núcleo). Se ha añadido soporte para la versión de Rust 1.80 (la versión mínima sigue siendo Rust 1.78). Además de las herramientas previamente mencionadas para el desarrollo de controladores de dispositivos de bloque, la nueva versión incluye abstracciones para la carga de firmware, acceso al espacio de usuario (uaccess) y manipulación de la estructura de "page".
- Para los sistemas x86-64 se ha implementado una nueva llamada al sistema uretprobe(), que optimiza el funcionamiento del mecanismo de trazado uretprobe, permitiendo rastrear los valores devueltos por funciones en aplicaciones del espacio de usuario.
- Se han añadido parámetros de línea de comandos al núcleo: "reserve_mem" para reservar un área de memoria nombrada durante el arranque y "ramoops.mem_name" para utilizar en el área de memoria pstore creada a través de reserve_mem.
- En el controlador de memoria basado en cgroup, se ha añadido el parámetro "swappiness" al archivo memory.reclaim, que define la configuración de desalojo de memoria, permitiendo ajustar el equilibrio entre desalojar páginas de memoria anónimas al área de intercambio y liberar páginas de memoria ocupadas por caché de archivos.
- Se ha añadido una interfaz ioctl PROCMAP_QUERY para una búsqueda más eficiente de áreas de memoria virtual (Virtual Memory Area) en /proc/PID/maps.
- Se ha añadido una bandera MAP_DROPPABLE a la llamada al sistema mmap() para solicitar memoria que nunca será escrita en el área de intercambio, y que en caso de escasez de memoria puede ser eliminada.
- Para la arquitectura ARM64 se ha implementado soporte para el hot-plugging (cambio a modos online/offline) de CPUs físicas y virtuales en sistemas con ACPI.
- Para la arquitectura RISC-V, se ha habilitado la conexión en caliente de la memoria y se ha añadido soporte para el plugin GCC STACKLEAK (que inicializa todas las variables almacenadas en la pila para evitar la fuga de información del núcleo a través de variables no inicializadas que pueden contener restos de datos anteriormente guardados en la pila).
- Se ha eliminado el mecanismo de mapeo de memoria EFI ficticio (fake EFI memory map) durante el proceso de arranque. Este mecanismo no se utilizaba en la práctica y obstaculizaba el desarrollo en el ámbito de la ejecución confidencial. máquinas virtuales.
- Se ha interrumpido el soporte para la plataforma PowerPC 40x.
- Se han incrementado los requisitos de la versión de GNU Make: se requiere al menos una versión de GNU Make publicada en 2013 para compilar el núcleo.
- Virtualización y seguridad
- Se han integrado parches que aceleran significativamente (hasta 15 veces) la obtención de números aleatorios a través de la llamada al sistema getrandom(). La optimización se basa en el uso del mecanismo vDSO (virtual dynamic shared object), que permite trasladar el manejador de la llamada del sistema del núcleo al espacio del usuario y evitar cambios de contexto. La implementación de la llamada del sistema se carga directamente en el espacio de direcciones del proceso por el núcleo.
- Para sistemas x86-64, se ha habilitado una nueva implementación del algoritmo de cifrado AES-GCM, que soporta el uso de instrucciones vectoriales VAES, VPCLMULQDQ y AVX512/AVX10 para acelerar los cálculos. En las pruebas realizadas, el aumento de rendimiento tras la transición a la nueva implementación alcanza hasta el 156%. La implementación en ensamblador de AES-GCM se ha reescrito completamente teniendo en cuenta la corrección, el rendimiento, el tamaño y una documentación exhaustiva del código.
- Se ha implementado la capacidad de ejecutar el núcleo como un sistema invitado en entornos virtualizados que utilizan la extensión de procesador AMD SEV-SNP (Secure Nested Paging), destinada a garantizar un funcionamiento seguro con tablas de páginas de memoria anidadas. Para una mayor aislamiento del acceso a los recursos desde las máquinas virtuales, se puede emplear el módulo SVSM (Linux Secure VM Service Module). En el hipervisor. KVM se ha añadido soporte inicial para el arranque de sistemas invitados protegidos mediante AMD SEV-SNP.
- Se ha añadido un asignador de bucket slab separado, que se activa mediante el parámetro CONFIG_SLAB_BUCKETS y proporciona protección contra ataques utilizando la técnica de "heap spraying".
- Se ha añadido una llamada ioctl al hipervisor KVM para la asignación anticipada de memoria al sistema operativo invitado antes de su inicio real.
- Subsistema de red
- Se ha añadido el parámetro sysctl net.tcp_rto_min_us, que permite configurar el tiempo mínimo de reenvío (retransmission timeout) para los sockets TCP.
- Se ha añadido a la utilidad ethtool la posibilidad de afinar la configuración de los manejadores de interrupciones para interfaces de red que utilizan la interfaz Net DIM.
- Hardware
- El controlador AMDGPU ha incluido soporte inicial para la GPU AMD RDNA4 (‘GFX12’). Se ha añadido soporte para las tecnologías DCN 4.0.x, GC 12.0, GMC 12.0, SDMA 7.0, MES12 y MMHUB 4.1.
- Se ha continuado trabajando en el controlador drm (Direct Rendering Manager) Xe para GPU basadas en la arquitectura Intel Xe, que se utiliza en tarjetas gráficas Intel de la familia Arc y gráficos integrados, comenzando con los procesadores Tiger Lake. Se ha mejorado el soporte para GPU basadas en las microarquitecturas Battlemage, Arrow Lake y Lunar Lake.
- En el subsistema DRM (Direct Rendering Manager) se ha reescrito el controlador de parámetros EDID (Extended Display Identification Data) proporcionados por el monitor.
- En el controlador i915 se ha añadido soporte para la GPU Battlemage Xe2 y se ha activado por defecto el modo CMRR (Content Match Refresh Rate).
- En el controlador DRM msm (GPU Qualcomm Adreno) se ha añadido soporte para la plataforma SM7150 y las GPUs X185 y a505.
- Se ha añadido soporte para los paneles LCD Lincoln Tech Sol LCD185-101CT, Microtips Technology 13-101HIEBCAF0-C, Microtips Technology MF-103HIEB0GA0, BOE nv110wum-l60, IVO t109nw41, WL-355608-A8, PrimeView PM070WL4, Lincoln Technologies LCD197, Ortustech COM35H3P70ULC, AUO G104STN01 y K&d kd101ne3-40ti.
- En el subsistema de sonido se ha añadido soporte para los chips y códecs Intel Panther Lake, Asahi Kasei AK4619, Cirrus Logic CS530x, Everest Semiconductors ES8311, NXP i.MX95, LPC32xx, Qualcomm LPASS v2.5, WCD937x, Realtek RT1318, RT1320 y Texas Instruments PCM5242.
- Se ha realizado una última ronda de cambios para permitir el soporte del SoC ARM Snapdragon X Elite, que utiliza su propio CPU Qualcomm Oryon de 12 núcleos y GPU Qualcomm Adreno. Este chip está diseñado para su uso en laptops y PCs, y supera en muchas pruebas de rendimiento a los chips Apple M3 e Intel Core Ultra 155H. Los cambios añadidos al núcleo 6.11 están relacionados con el soporte para la GPU Adreno X1-85 y la gestión del consumo energético. Se ha anunciado el soporte para laptops ASUS Vivobook S15 y Lenovo Yoga Slim7x basadas en el SoC Snapdragon X Elite.
Al mismo tiempo, la Fundación de Software Libre Latinoamericana ha formado una versión completamente libre del núcleo 6.11 — Linux-libre 6.10-gnu, depurado de elementos de firmware y controladores que contienen componentes no libres o partes de código cuya aplicación está limitada por el fabricante. En la versión 6.11, se ha actualizado el código de limpieza de blobs en los controladores mdgpu, adreno, vgxy61, atomisp, btnxpuart, prueth y tas2781. Se ha realizado la limpieza de nuevos controladores amdgpu isp, tn40, rtl8192du, cs40l50, rt1320 y pcie-rcar-gen4. Se ha llevado a cabo la limpieza de nombres de blobs en archivos dts (devicetree) para la arquitectura Aarch64. Se ha añadido una versión de primitivas para la carga de firmwares que no genera advertencias ni solicitudes (nowait-nowarn). Se ha incluido código para la identificación de primitivas de carga de firmwares en código Rust.
Fuente: opennet.ru
