La sexta versión de parches para el kernel de Linux con soporte para el lenguaje Rust

Miguel Ojeda, autor del proyecto Rust-for-Linux, propuso el lanzamiento de componentes v6 para desarrollar controladores de dispositivos en el lenguaje Rust para que los desarrolladores del kernel de Linux los consideren. Esta es la séptima edición de los parches, teniendo en cuenta la primera versión, publicada sin número de versión. El soporte de Rust se considera experimental, pero ya está incluido en la rama Linux-next y está lo suficientemente desarrollado como para comenzar a trabajar en la creación de capas de abstracción sobre los subsistemas del kernel, así como también para escribir controladores y módulos. El desarrollo está financiado por Google y el ISRG (Internet Security Research Group), que es el fundador del proyecto Let's Encrypt y promueve HTTPS y el desarrollo de tecnologías para mejorar la seguridad en Internet.

Versículos nuevos:

  • El kit de herramientas y una variante de la biblioteca alloc, liberados de la posible generación de un estado de "pánico" cuando ocurren errores, se actualizaron a la versión Rust 1.60, que estabiliza el soporte para el modo "maybe_uninit_extra" utilizado en los parches del kernel.
  • Se agregó la capacidad de ejecutar pruebas desde la documentación (pruebas que también se usan como ejemplos en la documentación), mediante la conversión en tiempo de compilación de pruebas vinculadas a la API del kernel en pruebas KUnit ejecutadas durante la carga del kernel.
  • Se han adoptado requisitos para que las pruebas no den como resultado una advertencia de Clippy linter, al igual que el código del kernel de Rust.
  • Se propone una implementación inicial del módulo “net” con funciones de red. El código Rust tiene acceso a estructuras de red del kernel como Namespace (basado en la estructura del kernel struct net), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) y sus equivalentes IPv6. .
  • Existe soporte inicial para técnicas de programación asincrónica (async), implementadas en forma del módulo kasync. Por ejemplo, puede escribir código asincrónico para manipular sockets TCP: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; bucle { let n = stream.read(&mut buf).await?; si n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
  • Se agregó el módulo net::filter para manipular filtros de paquetes de red. Se agregó el ejemplo Rust_netfilter.rs con una implementación de filtro en el lenguaje Rust.
  • Se agregó la implementación de un mutex simple smutex::Mutex, que no requiere fijación.
  • Se agregó NoWaitLock, que nunca espera un bloqueo y, si está ocupado por otro subproceso, provoca que se informe un error al intentar adquirir el bloqueo en lugar de detener a la persona que llama.
  • Se agregó RawSpinLock, identificado por raw_spinlock_t en el kernel, para aplicar a las secciones que no pueden estar inactivas.
  • Se agregó el tipo ARef para referencias a un objeto al que se aplica el mecanismo de conteo de referencias (siempre contado).
  • El backend Rustc_codegen_gcc, que le permite utilizar la biblioteca libgccjit del proyecto GCC como generador de código en Rustc para brindarle a Rustc soporte para arquitecturas y optimizaciones disponibles en GCC, ha implementado la capacidad de arrancar el compilador Rustc. La promoción del compilador significa la capacidad de utilizar un generador de código basado en GCC en Rustc para construir el propio compilador Rustc. Además, la reciente versión de GCC 12.1 incluye correcciones a libgccjit necesarias para que rustc_codegen_gcc funcione correctamente. Se están realizando preparativos para brindar la posibilidad de instalar Rustc_codegen_gcc utilizando la utilidad Rustup.
  • Se destaca el avance en el desarrollo del frontend gccrs de GCC con la implementación del compilador del lenguaje Rust basado en GCC. Actualmente hay dos desarrolladores de tiempo completo trabajando en gccrs.

Recuerde que los cambios propuestos hacen posible el uso de Rust como segundo lenguaje para desarrollar controladores y módulos del kernel. El soporte de Rust se presenta como una opción que no está habilitada de forma predeterminada y no da como resultado la inclusión de Rust entre las dependencias de compilación requeridas para el kernel. El uso de Rust para desarrollar controladores le permitirá crear controladores mejores y más seguros con un esfuerzo mínimo, sin problemas como acceder a un área de memoria después de liberarla, desreferenciar punteros nulos y desbordamientos de búfer.

La seguridad de la memoria se proporciona en Rust en tiempo de compilación mediante la verificación de referencias, el seguimiento de la propiedad del objeto y la vida útil del objeto (alcance), 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 brinda protección contra desbordamientos de 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 referencias y variables inmutables de forma predeterminada, ofrece tipado estático fuerte para minimizar los errores lógicos.

Fuente: opennet.ru

Añadir un comentario