Miguel Ojeda, autor do projeto Rust-for-Linux, propôs para consideração dos desenvolvedores do núcleo Linux a versão v8 dos componentes para o desenvolvimento de drivers de dispositivos em Rust. Esta é uma revisão dos patches levando em conta a primeira versão, publicada sem número de versão. O suporte ao Rust é considerado experimental, mas já está incluído na branch linux-next, pleiteando integração na versão de outono 5.20/6.0 e está suficientemente desenvolvido para o início do trabalho na criação de camadas de abstração sobre subsistemas do núcleo, assim como para a escrita de drivers e módulos. O desenvolvimento é financiado pela Google e pela ISRG (Internet Security Research Group), que é a fundadora do projeto Let’s Encrypt e promove HTTPS e o desenvolvimento de tecnologias para aumentar a segurança na 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 a versão Rust 1.62. Em comparação à versão anteriormente utilizada no conjunto de ferramentas Rust, a funcionalidade const_fn_trait_bound foi estabilizada, sendo usada nos patches para o núcleo.
- O código das ligações foi separado em um pacote crate distinto chamado "bindings", o que simplifica a recompilação em caso de alterações apenas no pacote principal "kernel".
- A implementação do macro "concat_idents!" foi reescrita na forma de um macro procedural, não ligada à funcionalidade concat_idents e permitindo o uso de referências a variáveis locais.
- O macro "static_assert!" foi reescrito, permitindo o uso de "core::assert!()" em qualquer contexto, ao invés de constantes.
- O macro "build_error!" foi adaptado para funcionar ao definir o modo "RUST_BUILD_ASSERT_{WARN,ALLOW}" para módulos.
- Adicionado um arquivo separado com as configurações "kernel/configs/rust.config".
- Os arquivos processados nas substituições de macro "*.i" foram renomeados para "*.rsi".
- Foi encerrado o suporte à compilação de componentes Rust com níveis de otimização diferentes dos aplicados ao código em C.
- Adicionado o módulo fs, que fornece ligações para trabalhar com sistemas de arquivos. Foi proposto um exemplo de um sistema de arquivos simples, escrito em Rust.
- Adicionado o módulo workqueue para trabalhar com filas de sistemas (fornecendo ligações sobre as estruturas do núcleo work_struct e workqueue_struct).
- Continuado o desenvolvimento do módulo kasync com a implementação de métodos de programação assíncrona (async). Adicionado um exemplo de um servidor TCP funcional no nível do núcleo, escrito em Rust.
- Adicionada a possibilidade de processamento de interrupções em Rust através de traits [Threaded]Handler e tipos [Threaded]Registration.
- Adicionado um macro de procedimento "#[vtable]" que simplifica o trabalho com tabelas de ponteiros de funções, como a estrutura file_operations.
- Adicionada a implementação de listas ligadas bidirecionais "unsafe_list::List".
- Adicionada a suporte inicial ao RCU (Read-copy-update) e ao tipo Guard para verificar a associação do bloqueio de leitura ao fluxo atual.
- Adicionada a função Task::spawn() para criar e iniciar automaticamente threads do núcleo. Também foi adicionado o método Task::wake_up().
- Adicionado o módulo delay, permitindo o uso de atrasos (uma camada sobre msleep()).
As mudanças propostas permitem o uso do Rust como uma segunda linguagem para o desenvolvimento de drivers e módulos do núcleo. O suporte ao Rust é apresentado como uma opção, não ativada por padrão e que não resulta na inclusão do Rust como uma dependência de compilação obrigatória para o núcleo. O uso do Rust para desenvolver drivers permitirá a criação de drivers seguros e de qualidade superior com o mínimo de esforço, eliminando problemas como acesso a áreas de memória após a liberação, desreferenciação de ponteiros nulos e estouro 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
