La tercera edición de parches para el kernel de Linux con soporte para el lenguaje Rust

Miguel Ojeda, autor del proyecto Rust-for-Linux, ha propuesto una tercera opción para los componentes de desarrollo de controladores de dispositivos Rust para que la consideren los desarrolladores del kernel de Linux. El soporte de Rust se considera experimental, pero ya se acordó incluirlo en la rama linux-next. 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.

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.

En la nueva versión de los parches se continúa con la eliminación de los comentarios realizados durante la discusión de la primera y segunda versión de los parches. Los cambios más notables:

  • Se realizó la transición a la versión estable de Rust 1.57 como compilador de referencia y se aseguró el enlace a la edición estabilizada del lenguaje Rust 2021. Anteriormente, los parches estaban vinculados a la rama beta de Rust y usaban algunas de las características de la lengua incluida en la categoría inestable. El cambio a la especificación Rust 2021 ha iniciado el trabajo para dejar de usar características inestables como const_fn_transmute, const_panic, const_unreachable_unchecked y core_panic y try_reserve en parches.
  • Desarrollo continuo de la variante parcheada de la biblioteca alloc Rust, modificada para evitar que las funciones de asignación de memoria generen potencialmente un estado de "pánico" cuando ocurren errores, como falta de memoria. La nueva versión implementa las opciones "no_rc" y "no_sync" para deshabilitar la funcionalidad que no se usa en el código principal de Rust, lo que hace que la biblioteca sea más modular. El trabajo continúa con los principales desarrolladores de alloc para trasladar los cambios necesarios para el núcleo a la biblioteca principal. La opción "no_fp_fmt_parse" se ha movido a la biblioteca central de Rust (núcleo), que es necesaria para que la biblioteca funcione en el nivel central.
  • El código se limpió para deshacerse de posibles advertencias del compilador al construir el kernel en el modo CONFIG_WERROR. Al compilar código Rust, se habilitan modos de diagnóstico del compilador adicionales y advertencias de linter de Clippy.
  • Se proponen abstracciones para su uso en código Rust para bloqueos seqlock (bloqueos de secuencia), devoluciones de llamada para administración de energía, memoria de E/S (readX/writeX), controladores de interrupción y subprocesos, GPIO, acceso a dispositivos, controladores y credenciales.
  • Herramientas de desarrollo de controladores mejoradas para incluir mutex reubicables, iteradores de bits, enlaces de puntero simplificados, diagnósticos de fallas mejorados e infraestructura independiente del bus de datos.
  • Trabajo mejorado con enlaces usando un tipo Ref simplificado basado en el backend refcount_t, que usa la API central del mismo nombre para contar enlaces. Se eliminó la compatibilidad con los tipos Arc y Rc proporcionados en la biblioteca de asignación estándar y no está disponible en el código que se ejecuta a nivel de kernel (se han preparado opciones para la propia biblioteca que deshabilitan estos tipos).
  • Se ha agregado a los parches una variante del controlador GPIO PL061, reescrito en Rust. Una característica del controlador es que su implementación casi línea por línea repite el controlador GPIO existente en el lenguaje C. Para los desarrolladores que desean familiarizarse con la creación de controladores en Rust, se ha preparado una comparación línea por línea, que le permite comprender en qué construcciones en Rust se convierte el código C.
  • El código base principal de Rust adoptó rustc_codegen_gcc, un backend de rustc para GCC que implementa la compilación preventiva (AOT) utilizando la biblioteca libgccjit. Con el desarrollo adecuado del backend, le permitirá compilar el código Rust involucrado en el kernel usando GCC.
  • Además de ARM, Google y Microsoft, Red Hat ha expresado interés en utilizar el lenguaje Rust en el kernel de Linux. Recuerde que Google brinda soporte directo para el proyecto Rust para Linux, desarrolla una nueva implementación del mecanismo de comunicación entre procesos de Binder en Rust y está considerando reelaborar varios controladores en Rust. Microsoft ha comenzado a implementar controladores para Hyper-V en Rust. ARM está trabajando para mejorar el soporte de Rust para sistemas basados ​​en ARM. IBM ha implementado el soporte de Rust en el kernel para sistemas PowerPC.

Fuente: opennet.ru

Añadir un comentario