A oitava versión de parches para o núcleo de Linux con soporte para a linguaxe Rust

Miguel Ojeda, autor do proxecto Rust-for-Linux, propuxo o lanzamento de compoñentes v8 para desenvolver controladores de dispositivos na linguaxe Rust para a consideración dos desenvolvedores do núcleo de Linux. Esta é a versión revisada dos parches, tendo en conta a primeira versión, publicada sen número de versión. O soporte de Rust considérase experimental, pero xa está incluído na rama linux-next, afirma estar integrado na versión de outono de 5.20/6.0 e é o suficientemente maduro como para comezar a traballar na creación de capas de abstracción sobre os subsistemas do núcleo, así como a escritura de controladores. e módulos. O desenvolvemento está financiado por Google e o ISRG (Internet Security Research Group), que é o fundador do proxecto Let's Encrypt e promove o HTTPS e o desenvolvemento de tecnoloxías para mellorar a seguridade en Internet.

Na nova versión:

  • O kit de ferramentas e unha variante da biblioteca alloc, libre da posible xeración dun estado de "pánico" cando se producen erros, foron actualizados para o lanzamento de Rust 1.62. En comparación coa versión usada anteriormente, o kit de ferramentas Rust estabilizou o soporte para a funcionalidade const_fn_trait_bound usada nos parches do núcleo.
  • O código de vinculación está separado nun paquete de caixa separado "bindings", o que simplifica a reconstrución se se realizan cambios só no paquete principal "kernel".
  • Implementación da macro “concat_idents!” reescrita en forma de macro procedimental que non está vinculada á funcionalidade concat_idents e permite o uso de referencias a variables locais.
  • A macro "static_assert!" foi reescrita, permitindo o uso de "core::assert!()" en calquera contexto en lugar de constantes.
  • Macro "erro_construción!" adaptado para funcionar cando o modo "RUST_BUILD_ASSERT_{WARN,ALLOW}" está configurado para módulos.
  • Engadiuse un ficheiro separado coa configuración "kernel/configs/rust.config".
  • Os ficheiros "*.i" procesados ​​nas substitucións de macros renombráronse a "*.rsi".
  • O soporte para a construción de compoñentes de Rust con niveis de optimización diferentes aos utilizados para o código C foi descontinuado.
  • Engadiuse o módulo fs, que proporciona enlaces para traballar con sistemas de ficheiros. Ofrécese un exemplo dun sistema de ficheiros sinxelo escrito en Rust.
  • Engadiuse un módulo workqueue para traballar con colas do sistema (ofrece conexións sobre as estruturas do núcleo work_struct e workqueue_struct).
  • O desenvolvemento do módulo kasync continuou coa implementación de métodos de programación asíncrona (async). Engadiuse un exemplo dun servidor TCP de nivel central escrito en Rust.
  • Engadiuse a capacidade de xestionar interrupcións na linguaxe Rust usando os tipos [Threaded]Handler e [Threaded]Registration`.
  • Engadiuse a macro de procedemento "#[vtable]" para facilitar o traballo con táboas de punteiros de función, como a estrutura file_operations.
  • Engadiuse a implementación de listas vinculadas bidireccionais "unsafe_list::List".
  • Engadido soporte inicial para RCU (Read-copy-update) e tipo Guard para comprobar se un bloqueo de lectura está ligado ao fío actual.
  • Engadiuse a función Task::spawn() para crear e iniciar automaticamente fíos do núcleo. Tamén engadiu o método Task::wake_up().
  • Engadiuse un módulo de atraso que che permite usar atrasos (un envoltorio sobre msleep()).

Os cambios propostos permiten utilizar Rust como segunda linguaxe para desenvolver controladores e módulos do núcleo. O soporte de Rust preséntase como unha opción que non está activada por defecto e non fai que Rust se inclúa como unha dependencia de compilación necesaria para o núcleo. Usar Rust para o desenvolvemento de controladores permitirache crear controladores máis seguros e mellores cun mínimo esforzo, libre de problemas como o acceso á memoria despois da liberación, desreferencias de punteiro nulo e desbordamentos do búfer.

O manexo seguro para a memoria ofrécese en Rust no momento da compilación mediante a comprobación de referencias, o seguimento da propiedade do obxecto e a súa vida útil (alcance), así como a través da avaliación da corrección do acceso á memoria durante a execución do código. Rust tamén ofrece protección contra desbordamentos de enteiros, require a inicialización obrigatoria dos valores variables antes do seu uso, manexa mellor os erros na biblioteca estándar, aplica o concepto de referencias e variables inmutables por defecto, ofrece unha forte escritura estática para minimizar os erros lóxicos.

Fonte: opennet.ru

Engadir un comentario