Miguel Ojeda, autor del proyecto Rust-for-Linux, ha propuesto a los desarrolladores del núcleo de Linux una tercera opción de componentes para el desarrollo de controladores de dispositivos en el lenguaje Rust. El soporte para Rust se considera experimental, pero ya se ha acordado su inclusión en la rama linux-next. 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 promueve el uso de HTTPS y el desarrollo de tecnologías para aumentar la seguridad en Internet.
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.
En la nueva versión de los parches se ha continuado la eliminación de los comentarios realizados durante la discusión de la primera y segunda versiones de los parches. Los cambios más notables son:
- Se ha realizado la transición a utilizar la versión estable 1.57 de Rust como compilador de referencia y se ha vinculado a la edición estabilizada del lenguaje Rust 2021. Anteriormente, los parches estaban vinculados a la rama Beta de Rust y utilizaban algunas características del lenguaje que pertenecen a la categoría de inestables. La transición a la especificación Rust 2021 ha permitido iniciar el trabajo para eliminar del código de los parches características inestables como const_fn_transmute, const_panic, const_unreachable_unchecked y core_panic y try_reserve.
- Se ha continuado el desarrollo de la variante de la biblioteca alloc de Rust incluida en los parches, que ha sido modificada para eliminar funciones de distribución de memoria con posibles generadores de estado de 'panic' al ocurrir errores, como la falta de memoria. En la nueva versión se han implementado las opciones 'no_rc' y 'no_sync' para desactivar funcionalidades no utilizadas en el código Rust para el núcleo, lo que hace que la biblioteca sea más modular. Se sigue trabajando con los desarrolladores principales de alloc, enfocados en trasladar los cambios necesarios para el núcleo al conjunto principal de la biblioteca. Se ha trasladado a la biblioteca base de Rust (core) la opción 'no_fp_fmt_parse', necesaria para el funcionamiento de la biblioteca a nivel de núcleo.
- Se ha realizado una limpieza del código para eliminar posibles advertencias del compilador al compilar el núcleo en modo CONFIG_WERROR. Durante la compilación del código en Rust se han incluido modos de diagnóstico adicionales del compilador y advertencias del linter Clippy.
- Se han propuesto abstracciones para su uso en el código en el lenguaje Rust, como bloqueos seqlock (bloqueos de secuencia), llamadas de retorno para la gestión de energía, I/O Memory (readX/writeX), manejadores de interrupciones y hilos, GPIO, acceso a dispositivos, controladores y credenciales.
- Se han ampliado las herramientas para el desarrollo de controladores utilizando mutexes movibles, iteradores de bits, envoltorios simplificados sobre punteros, diagnóstico mejorado de fallos e infraestructura independiente del bus de datos.
- Se ha mejorado el manejo de referencias mediante un tipo simplificado Ref, basado en el backend refcount_t, que utiliza la API del núcleo para el conteo de referencias. El soporte para los tipos Arc y Rc, proporcionados en la biblioteca estándar alloc, ha sido eliminado y no está disponible en el código que se ejecuta a nivel del núcleo (para la propia biblioteca se han preparado opciones que desactivan estos tipos).
- Se ha añadido al conjunto de parches una variante del controlador PL061 GPIO, reescrita en Rust. La característica del controlador es que su implementación prácticamente sigue línea por línea al controlador GPIO existente en el lenguaje C. Para los desarrolladores que deseen familiarizarse con la creación de controladores en Rust, se ha preparado una comparación línea por línea que permite entender en qué construcciones de Rust se ha transformado el código en C.
- Se ha aceptado en la base de código principal de Rust rustc_codegen_gcc, el backend rustc para GCC, que implementa la posibilidad de compilación anticipada (AOT) utilizando la biblioteca libgccjit. Con el adecuado desarrollo del backend, permitirá compilar el código Rust utilizado en el núcleo mediante GCC.
- Además de las empresas ARM, Google y Microsoft, la empresa Red Hat ha expresado interés en el uso del lenguaje Rust en el núcleo de Linux. Cabe recordar que Google apoya directamente el proyecto Rust for Linux, desarrolla una nueva implementación del mecanismo de comunicación entre procesos Binder en Rust y considera la posibilidad de reescribir varios controladores en Rust. Microsoft ha comenzado la implementación de controladores para Hyper-V en Rust. ARM está trabajando en mejorar el soporte de Rust para sistemas basados en procesadores ARM. IBM ha implementado soporte para Rust en el núcleo para sistemas PowerPC.
Fuente: opennet.ru
