Octava versión de 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 la publicación de la versión 8 de los componentes para el desarrollo de controladores de dispositivos en el lenguaje Rust. Esta es una revisión de los parches considerando la primera versión, que se publicó sin número de versión. El soporte para Rust se considera experimental, pero ya está incluido en la rama linux-next, con aspiraciones de integración en la versión de otoño 5.20/6.0 y está lo suficientemente desarrollado para comenzar a trabajar en la creación de capas de abstracción sobre los subsistemas del núcleo, así como para 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 promueve HTTPS y el desarrollo de tecnologías para aumentar la seguridad de Internet.

En la nueva versión:

  • Las herramientas y la variante de la biblioteca alloc, desprovista de posibles generaciones de estado de "panic" al surgir errores, se han actualizado a la versión Rust 1.62. En comparación con la versión utilizada anteriormente, la soporte de la funcionalidad const_fn_trait_bound en las herramientas Rust ha sido estabilizada.
  • El código de enlaces se ha separado en un paquete crate denominado "bindings", lo que simplifica la recompilación en caso de que se realicen cambios solo en el paquete principal "kernel".
  • La implementación del macro "concat_idents!" ha sido reescrita en forma de un macro procedural, no vinculado a la funcionalidad concat_idents y que permite el uso de referencias a variables locales.
  • Se ha reescrito el macro "static_assert!", lo que permite usar "core::assert!()" en cualquier contexto en lugar de constantes.
  • El macro "build_error!" ha sido adaptado para trabajar al establecer el modo "RUST_BUILD_ASSERT_{WARN,ALLOW}" para módulos.
  • Se ha añadido un archivo separado con configuraciones "kernel/configs/rust.config".
  • Los archivos manejados en las sustituciones macro "*.i" han sido renombrados a "*.rsi".
  • Se ha dejado de lado el soporte para la compilación de componentes Rust con niveles de optimización distintos a los aplicados al código en lenguaje C.
  • Se ha añadido un módulo fs que proporciona enlaces para trabajar con sistemas de archivos. Se ha propuesto un ejemplo de un sistema de archivos simple escrito en lenguaje Rust.
  • Se ha añadido un módulo workqueue para trabajar con colas del sistema (proporciona enlaces sobre las estructuras del núcleo work_struct y workqueue_struct).
  • Continuó el desarrollo del módulo kasync con la implementación de métodos de programación asíncrona (async). Se agregó un ejemplo de un servidor TCP funcional a nivel de núcleo, escrito en Rust.
  • Se añadió la capacidad de manejar interrupciones en Rust mediante los rasgos [Threaded]Handler y los tipos [Threaded]Registration`.
  • Se agregó el macro procedural «#[vtable]», que simplifica el trabajo con tablas de punteros a funciones, como la estructura file_operations.
  • Se añadió la implementación de listas enlazadas bidireccionales «unsafe_list::List».
  • Se agregó soporte inicial para RCU (Read-copy-update) y el tipo Guard para verificar la vinculación de bloqueos de lectura al hilo actual.
  • Se añadió la función Task::spawn() para crear e iniciar automáticamente hilos en el núcleo. También se agregó el método Task::wake_up().
  • Se añadió el módulo delay, que permite usar retrasos (una envoltura sobre msleep()).

Los cambios propuestos permiten utilizar 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 activa por defecto y que no hace que Rust se convierta en una de las dependencias de compilació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, evitando problemas como el acceso a la memoria después de haber sido liberada, la desreferenciación de punteros nulos y el desbordamiento de 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