A oitava versão de patches para o kernel Linux com suporte para a linguagem Rust

Miguel Ojeda, autor do projeto Rust-for-Linux, propôs o lançamento de componentes v8 para desenvolvimento de drivers de dispositivos na linguagem Rust para consideração dos desenvolvedores do kernel Linux. Esta é a versão revisada dos patches, levando em consideração a primeira versão, publicada sem número de versão. O suporte ao Rust é considerado experimental, mas já está incluído no ramo linux-next, afirma estar integrado na versão de outono 5.20/6.0 e está maduro o suficiente para começar a trabalhar na criação de camadas de abstração sobre subsistemas do kernel, bem como na gravação de drivers. e módulos. O desenvolvimento é financiado pelo Google e pelo ISRG (Internet Security Research Group), que é o fundador do projeto Let's Encrypt e promove o HTTPS e o desenvolvimento de tecnologias para melhorar a segurança da Internet.

Na nova versão:

  • O kit de ferramentas e uma variante da biblioteca alloc, livre da possível geração de um estado de “pânico” quando ocorrem erros, foram atualizados para o lançamento do Rust 1.62. Comparado com a versão usada anteriormente, o kit de ferramentas Rust estabilizou o suporte para a funcionalidade const_fn_trait_bound usada em patches do kernel.
  • O código de ligação é separado em um pacote de crate separado “bindings”, o que simplifica a reconstrução se as alterações forem feitas apenas no “kernel” do pacote principal.
  • Implementação da macro “concat_idents!” reescrito na forma de uma macro processual que não está vinculada à funcionalidade concat_idents e permite o uso de referências a variáveis ​​locais.
  • A macro “static_assert!” foi reescrita, permitindo o uso de “core::assert!()” em qualquer contexto em vez de constantes.
  • Macro "build_error!" adaptado para funcionar quando o modo “RUST_BUILD_ASSERT_{WARN,ALLOW}” está definido para módulos.
  • Adicionado um arquivo separado com configurações “kernel/configs/rust.config”.
  • Os arquivos “*.i” processados ​​nas substituições de macro foram renomeados para “*.rsi”.
  • O suporte para construção de componentes Rust com níveis de otimização diferentes daqueles usados ​​para código C foi descontinuado.
  • Adicionado módulo fs, que fornece ligações para trabalhar com sistemas de arquivos. É fornecido um exemplo de sistema de arquivos simples escrito em Rust.
  • Adicionado módulo workqueue para trabalhar com filas do sistema (fornece ligações sobre as estruturas do kernel work_struct e workqueue_struct).
  • O desenvolvimento do módulo kasync continuou com a implementação de métodos de programação assíncrona (async). Adicionado um exemplo de servidor TCP de nível central escrito em Rust.
  • Adicionada a capacidade de lidar com interrupções na linguagem Rust usando os tipos [Threaded]Handler e [Threaded]Registration`.
  • Adicionada macro processual "#[vtable]" para facilitar o trabalho com tabelas de ponteiros de função, como a estrutura file_operations.
  • Adicionada implementação de listas vinculadas bidirecionais "unsafe_list::List".
  • Adicionado suporte inicial para RCU (Read-copy-update) e tipo Guard para verificar se um bloqueio de leitura está vinculado ao thread atual.
  • Adicionada função Task::spawn() para criar e iniciar automaticamente threads do kernel. Também foi adicionado o método Task::wake_up().
  • Adicionado um módulo de atraso que permite usar atrasos (um wrapper sobre msleep()).

As mudanças propostas possibilitam a utilização do Rust como segunda linguagem para desenvolvimento de drivers e módulos do kernel. O suporte ao Rust é apresentado como uma opção que não é habilitada por padrão e não resulta na inclusão do Rust como uma dependência de construção necessária para o kernel. Usar Rust para desenvolvimento de driver permitirá que você crie drivers melhores e mais seguros com o mínimo de esforço, livres de problemas como acesso à memória após a liberação, desreferências de ponteiro nulo e saturação de buffer.

A manipulação de memória segura é fornecida em Rust em tempo de compilação por meio de verificação de referência, acompanhando a propriedade do objeto e o tempo de vida do objeto (escopo), bem como por meio da avaliação da exatidão do acesso à memória durante a execução do código. Rust também fornece proteção contra estouros de número inteiro, requer inicialização obrigatória de valores de variáveis ​​antes do uso, lida melhor com erros na biblioteca padrão, aplica o conceito de referências e variáveis ​​imutáveis ​​por padrão, oferece tipagem estática forte para minimizar erros lógicos.

Fonte: opennet.ru

Adicionar um comentário