Miguel Ojeda, autor do projeto Rust-for-Linux, propôs aos desenvolvedores do núcleo Linux a versão v6 de componentes para o desenvolvimento de drivers de dispositivos na linguagem Rust. Esta é a sétima edição dos patches considerando a primeira versão, que foi publicada sem número de versão. O suporte ao Rust é considerado experimental, mas já está incluído na branch linux-next e bastante desenvolvido para iniciar o trabalho na criação de camadas de abstração sobre as subsistemas do núcleo, assim como para a escrita de drivers e módulos. O desenvolvimento é financiado pela Google e pela organização ISRG (Internet Security Research Group), que é a fundadora do projeto Let’s Encrypt e ajuda a promover HTTPS e desenvolver tecnologias para aumentar a segurança da internet.
Na nova versão:
- O conjunto de ferramentas e a versão da biblioteca alloc, livres de possíveis gerações de estado 'panic' ao ocorrer erros, foram atualizados para o lançamento do Rust 1.60, no qual foi estabilizado o suporte ao modo 'maybe_uninit_extra', utilizado nos patches para o núcleo.
- Adicionada a capacidade de executar testes da documentação (testes que também servem como exemplos na documentação), através da conversão durante a compilação de testes que envolvem a API do núcleo em testes KUnit, executados durante a inicialização do núcleo.
- Aceitas as exigências segundo as quais os testes não devem gerar avisos do linter Clippy, assim como o código do núcleo escrito em Rust.
- Sugerida uma implementação inicial do módulo 'net' com funções de rede. Para o código em Rust, fornecido acesso a estruturas de rede do núcleo, como 'Namespace' (baseado na estrutura do núcleo 'struct net'), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) e seus equivalentes para IPv6.
- Implementado suporte inicial a métodos de programação assíncrona (async), realizado na forma de um módulo kasync. Por exemplo, é possível criar um código que funciona em modo assíncrono para manipular sockets TCP: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
- Adicionado o módulo net::filter para manipulação de filtros de pacotes de rede. Incluído o exemplo rust_netfilter.rs com a implementação de um filtro na linguagem Rust.
- Foi adicionada a implementação de um mutex simples smutex::Mutex, que não requer pinagem.
- Foi adicionado o bloqueio NoWaitLock, que nunca leva à espera pela liberação e, se ocupado por outra thread, resulta em um erro ao tentar obter o bloqueio ao invés de parar a chamada.
- Foi adicionado o bloqueio RawSpinLock, que está associado a raw_spinlock_t no núcleo, aplicado a seções que não podem estar em estado de espera.
- Foi adicionado o tipo ARef para referências a um objeto, ao qual se aplica o mecanismo de contagem de referências (sempre contado).
- No backend rustc_codegen_gcc, que permite utilizar a biblioteca libgccjit do projeto GCC como gerador de código no rustc para garantir no rustc o suporte às arquiteturas e otimizações disponíveis no GCC, foi implementada a capacidade de bootstrap do compilador rustc. O bootstrap do compilador refere-se à capacidade de usar no rustc um gerador de código baseado no GCC para construir o próprio compilador rustc. Além disso, na recente versão do GCC 12.1, foram incluídas correções no libgccjit, necessárias para o funcionamento correto do rustc_codegen_gcc. Está sendo preparado o suporte para a instalação do rustc_codegen_gcc utilizando a ferramenta rustup.
- Observa-se progresso no desenvolvimento do frontend do GCC gccrs com a implementação do compilador da linguagem Rust baseado em GCC. Atualmente, dois desenvolvedores estão trabalhando no gccrs em modo de funcionamento completo.
Vale lembrar que as mudanças propostas permitem o uso do Rust como uma segunda linguagem para o desenvolvimento de drivers e módulos do kernel. O suporte para Rust é apresentado como uma opção, que não está ativa por padrão e não resulta na inclusão do Rust entre as dependências obrigatórias de compilação do kernel. O uso do Rust para o desenvolvimento de drivers permitirá a criação de drivers seguros e de melhor qualidade com um mínimo de esforço, livres de problemas como acesso à memória após sua liberação, desreferenciação de ponteiros nulos e estouros de buffer.
A segurança no manuseio da memória é garantida no Rust durante a compilação através da verificação de referências, rastreamento da propriedade dos objetos e consideração do tempo de vida dos objetos (escopo), bem como pela avaliação da correção do acesso à memória durante a execução do código. O Rust também oferece ferramentas para proteção contra estouros inteiros, exige a inicialização obrigatória dos valores das variáveis antes do uso, lida melhor com erros na biblioteca padrão, aplica o conceito de imutabilidade (immutable) para referências e variáveis por padrão e oferece forte tipagem estática para minimizar erros lógicos.
Fonte: opennet.ru
