La octava 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 v8 para desarrollar controladores de dispositivos en el lenguaje Rust para su consideración por parte de los desarrolladores del kernel de Linux. Esta es la versión revisada 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, afirma estar integrado en la versión de otoño 5.20/6.0 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 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, libre de la posible generación de un estado de "pánico" cuando ocurren errores, se actualizaron para el lanzamiento de Rust 1.62. En comparación con la versión utilizada anteriormente, el kit de herramientas Rust ha estabilizado el soporte para la funcionalidad const_fn_trait_bound utilizada en los parches del kernel.
  • El código de enlace se separa en "enlaces" de paquetes de caja separados, lo que simplifica la reconstrucción si los cambios se realizan sólo en el "núcleo" del paquete principal.
  • Implementación de la macro “concat_idents!” reescrito en forma de macro de procedimiento que no está vinculada a la funcionalidad concat_idents y permite el uso de referencias a variables locales.
  • La macro “static_assert!” ha sido reescrita, permitiendo el uso de “core::assert!()” en cualquier contexto en lugar de constantes.
  • Macro "build_error!" adaptado para funcionar cuando el modo "RUST_BUILD_ASSERT_{WARN,ALLOW}" está configurado para los módulos.
  • Se agregó un archivo separado con la configuración "kernel/configs/rust.config".
  • Los archivos “*.i” procesados ​​en sustituciones de macros han sido renombrados a “*.rsi”.
  • Se ha descontinuado el soporte para la creación de componentes de Rust con niveles de optimización diferentes a los utilizados para el código C.
  • Se agregó el módulo fs, que proporciona enlaces para trabajar con sistemas de archivos. Se proporciona un ejemplo de un sistema de archivos simple escrito en Rust.
  • Se agregó un módulo de cola de trabajo para trabajar con colas del sistema (proporciona enlaces sobre las estructuras del núcleo work_struct y workqueue_struct).
  • El desarrollo del módulo kasync continuó con la implementación de métodos de programación asíncronos (async). Se agregó un ejemplo de un servidor TCP de nivel central escrito en Rust.
  • Se agregó la capacidad de manejar interrupciones en el lenguaje Rust usando los tipos [Threaded]Handler y [Threaded]Registration`.
  • Se agregó la macro de procedimiento "#[vtable]" para facilitar el trabajo con tablas de punteros de funciones, como la estructura file_operatives.
  • Se agregó la implementación de listas enlazadas bidireccionales "unsafe_list::List".
  • Se agregó soporte inicial para RCU (lectura, copia y actualización) y tipo de protección para verificar si un bloqueo de lectura está vinculado al hilo actual.
  • Se agregó la función Task::spawn() para crear e iniciar automáticamente subprocesos del kernel. También se agregó el método Task::wake_up().
  • Se agregó un módulo de retraso que le permite usar retrasos (un contenedor sobre msleep()).

Los cambios propuestos permiten utilizar Rust como segundo lenguaje para desarrollar controladores y módulos del kernel. La compatibilidad con Rust se presenta como una opción que no está habilitada de forma predeterminada y no da como resultado que Rust se incluya como una dependencia de compilación requerida para el kernel. El uso de Rust para el desarrollo de controladores le permitirá crear controladores mejores y más seguros con un mínimo esfuerzo, sin problemas como el acceso a la memoria después de la liberación, desreferencias de punteros nulos y desbordamientos del 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