Sexta versión de los parches para el núcleo de Linux con soporte para el lenguaje Rust

Miguel Ojeda, autor del proyecto Rust-for-Linux, ha propuesto a los desarrolladores del núcleo de Linux considerar la publicación de la versión 6 de los componentes para el desarrollo de controladores de dispositivos en el lenguaje Rust. Esta es la séptima edición de los parches, teniendo en cuenta la primera variante, publicada sin número de versión. El soporte para Rust se considera experimental, pero ya está incluido en la rama linux-next y es lo suficientemente avanzado como para comenzar a trabajar en capas de abstracción sobre las subsistemas del núcleo, así como en la escritura de controladores y módulos. El desarrollo está financiado por Google y la organización ISRG (Internet Security Research Group), que es la fundadora del proyecto Let’s Encrypt y apoya la promoción de HTTPS y el desarrollo de tecnologías para aumentar la seguridad en internet.

En la nueva versión:

  • Las herramientas y la variante de la biblioteca alloc, libres de posibles generaciones de estado de "panic" al ocurrir errores, han sido actualizadas a la versión Rust 1.60, en la cual se ha estabilizado el soporte para el modo "maybe_uninit_extra", utilizado en los parches para el núcleo.
  • Se ha añadido la capacidad de ejecutar pruebas desde la documentación (pruebas que también se utilizan como ejemplos en la documentación), mediante la transformación en tiempo de compilación de pruebas vinculadas a la API del núcleo en pruebas KUnit, que se ejecutan durante el arranque del núcleo.
  • Se han aceptado requisitos según los cuales las pruebas no deben generar advertencias del linter Clippy, así como el código para el núcleo en el lenguaje Rust.
  • Se ha propuesto una implementación inicial del módulo "net" con funciones de red. Se ha proporcionado acceso al código en el lenguaje Rust a estructuras de red del núcleo, como "Namespace" (basada en la estructura del núcleo "struct net"), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) y sus equivalentes para IPv6.
  • Se ha implementado un soporte inicial para métodos de programación asincrónica (async), realizado en forma de módulo kasync. Por ejemplo, se puede crear código que funcione en modo asincrónico para manipular sockets TCP: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
  • Se ha añadido el módulo net::filter para manipular filtros de paquetes de red. Se ha añadido un ejemplo rust_netfilter.rs con la implementación de un filtro en el lenguaje Rust.
  • Se ha añadido la implementación de un mutex simple smutex::Mutex, que no requiere vinculación (pinning).
  • Se ha añadido el bloqueo NoWaitLock, que nunca causa espera para liberarse, y en caso de que otro hilo lo ocupe, genera un error al intentar obtener el bloqueo en lugar de detener al llamador.
  • Se ha añadido el bloqueo RawSpinLock, que se identifica con raw_spinlock_t en el núcleo, utilizado en secciones que no pueden estar en estado de espera.
  • Se ha añadido el tipo ARef para referencias a objetos, que aplica un mecanismo de conteo de referencias (always-refcounted).
  • En el backend rustc_codegen_gcc, que permite usar la biblioteca libgccjit del proyecto GCC como generador de código en rustc para proporcionar soporte en rustc para arquitecturas y optimizaciones disponibles en GCC, se ha implementado la capacidad de arranque del compilador (bootstrapping) rustc. Por 'arranque del compilador' se entiende la posibilidad de usar en rustc un generador de código basado en GCC para compilar el propio compilador rustc. Además, en la reciente versión GCC 12.1 se han incluido correcciones en libgccjit, necesarias para el correcto funcionamiento de rustc_codegen_gcc. Se está preparando la posibilidad de instalar rustc_codegen_gcc mediante la utilidad rustup.
  • Se destaca el progreso en el desarrollo del frontend de GCC gccrs con la implementación de un compilador para el lenguaje Rust basado en GCC. Actualmente, dos desarrolladores están trabajando a tiempo completo en gccrs.

Recordemos que los cambios propuestos permiten usar Rust como segundo lenguaje para el desarrollo de controladores y módulos del núcleo. El soporte para Rust se presenta como una opción, no activada por defecto y no provoca la inclusión de Rust entre las dependencias de construcción obligatorias del núcleo. Usar Rust para el desarrollo de controladores permitirá crear controladores seguros y de mayor calidad con un esfuerzo mínimo, libre de problemas como el acceso a áreas de memoria después de su liberación, la desreferencia de punteros nulos y la salida de los límites del búfer.

El manejo seguro de la memoria se garantiza en Rust durante la compilación a través de la verificación de referencias, el seguimiento de la propiedad de los objetos y la consideración del tiempo de vida de los objetos (áreas de visibilidad), así como mediante la evaluación de la corrección del acceso a la memoria durante la ejecución del código. Rust también proporciona medios para proteger contra desbordamientos enteros, requiere la inicialización obligatoria de los valores de las variables antes de su uso, maneja mejor los errores en la biblioteca estándar, aplica el concepto de inmutabilidad (immutable) de referencias y variables por defecto, y ofrece una fuerte tipificación estática para minimizar errores lógicos.

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster