A sexta 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 v6 para desenvolvimento de drivers de dispositivos na linguagem Rust para consideração dos desenvolvedores do kernel Linux. Esta é a sétima edição 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 e está suficientemente desenvolvido 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.60, que estabiliza o suporte para o modo "maybe_uninit_extra" usado em patches do kernel.
  • Adicionada a capacidade de executar testes da documentação (testes que também são usados ​​como exemplos na documentação), por meio da conversão em tempo de compilação de testes vinculados à API do kernel em testes KUnit executados durante o carregamento do kernel.
  • Foram adotados requisitos de que os testes não devem resultar em um aviso de linter Clippy, assim como o código do kernel Rust.
  • É proposta uma implementação inicial do módulo “net” com funções de rede. O código Rust tem acesso a estruturas de rede do kernel, como Namespace (baseado na estrutura struct net kernel), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) e seus equivalentes IPv6 .
  • Há suporte inicial para técnicas de programação assíncrona (async), implementadas na forma do módulo kasync. Por exemplo, você pode escrever código assíncrono para manipular soquetes TCP: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { deixe n = stream.read(&mut buf).await?; se n == 0 { retornar Ok(()); } stream.write_all(&buf[..n]).await?; } }
  • Adicionado módulo net::filter para manipular filtros de pacotes de rede. Adicionado exemplo Rust_netfilter.rs com uma implementação de filtro na linguagem Rust.
  • Adicionada implementação de um mutex simples smutex::Mutex, que não requer fixação.
  • Adicionado NoWaitLock, que nunca espera por um bloqueio e, se ocupado por outro thread, faz com que um erro seja relatado ao tentar adquirir o bloqueio em vez de interromper o chamador.
  • Adicionado RawSpinLock, identificado por raw_spinlock_t no kernel, para aplicar a seções que não podem ficar ociosas.
  • Adicionado tipo ARef para referências a um objeto ao qual o mecanismo de contagem de referências é aplicado (sempre recontado).
  • O back-end Rustc_codegen_gcc, que permite usar a biblioteca libgccjit do projeto GCC como um gerador de código no Rustc para fornecer ao Rustc suporte para arquiteturas e otimizações disponíveis no GCC, implementou a capacidade de inicializar o compilador Rustc. Promoção do compilador significa a capacidade de usar um gerador de código baseado em GCC no Rustc para construir o próprio compilador Rustc. Além disso, a versão recente do GCC 12.1 inclui correções para libgccjit necessárias para que rustc_codegen_gcc funcione corretamente. Os preparativos estão em andamento para fornecer a capacidade de instalar o Rustc_codegen_gcc usando o utilitário Rustup.
  • É observado o progresso no desenvolvimento do frontend GCC gccrs com a implementação do compilador da linguagem Rust baseado em GCC. Atualmente existem dois desenvolvedores em tempo integral trabalhando no gccrs.

Lembre-se que as mudanças propostas possibilitam o uso do Rust como segunda linguagem para o 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