Ya fue publicada la septima versión de los parches para el soporte de controladores Rust en Linux
Hace pocos dias, Miguel Ojeda, encargado del desarrollo y envió de estas propuestas y autor del proyecto Rust-for-Linux dio a conocer la séptima propuesta de los componentes para el desarrollo de controladores de dispositivos Rust para que los desarrolladores del kernel de Linux los consideren.
Esta es la séptima edición de los parches y a lo cual aun el soporte de Rust se considera experimental, pero ya está incluido en la rama linux-next y es lo suficientemente maduro como para comenzar a trabajar en la creación de capas de abstracción sobre los subsistemas del kernel, así como en la escritura de 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 aumentar la seguridad de Internet.
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.
Principales novedades en la séptima propuesta
En esta nueva propuesta se destaca que el kit de herramientas y una variante de la biblioteca alloc, que eliminó la posible generación de estado de «panic» en los errores, se actualizó a la versión Rust 1.60 y que con lo cual se estabiliza el soporte para el modo «may_uninit_extra» utilizado en los parches del kernel.
Ademas de ello, se destaca que se agregó la capacidad de ejecutar pruebas desde la documentación (pruebas que se usan simultáneamente como ejemplos en la documentación), al convertir las pruebas en tiempo de compilación vinculadas a la API del kernel en pruebas KUnit que se ejecutan en el momento del arranque del kernel. Se requiere que las pruebas no produzcan una advertencia de linter de Clippy, al igual que el código central de Rust.
Por otra parte se propone una implementación inicial del módulo «net» con funciones de red. El código Rust proporciona acceso a las 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.
El backend rustc_codegen_gcc, ha implementado la capacidad de arrancar el compilador rustc. La puesta en funcionamiento del compilador se refiere a la capacidad de rustc para usar un generador de código basado en GCC para construir el compilador rustc.
Además, la versión reciente de GCC 12.1 incluye correcciones a libgccjit necesarias para que rustc_codegen_gcc funcione correctamente. Se están realizando preparativos para proporcionar la capacidad de instalar rustc_codegen_gcc utilizando la utilidad rustup.
De los demás cambios que se destacan de esta nueva version:
- Soporte inicial implementado para métodos de programación asíncrona (async), implementado en forma de módulo kasync.
- Se agregó el módulo net::filter para manipular los filtros de paquetes de red. Ejemplo agregado rust_netfilter.rs con implementación de filtro en lenguaje Rust.
- Se agregó la implementación de un mutex simple smutex::Mutex que no requiere fijación.
- Se agregó un bloqueo NoWaitLock que nunca espera a que se libere y, si está ocupado por otro subproceso, genera un error al intentar adquirir el bloqueo en lugar de detener a la persona que llama.
- Se agregó un bloqueo RawSpinLock, identificado con raw_spinlock_t en el kernel, que se aplica a las secciones que no pueden estar inactivas.
- Se agregó el tipo ARef para las referencias de objetos a los que se les aplica el mecanismo de conteo de referencias (siempre refuntadas).
- Se observan avances 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.
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.