Miguel Ojeda, autor do projeto Rust-for-Linux, proposto para consideração pelos desenvolvedores do kernel Linux A terceira versão de componentes para desenvolvimento de drivers de dispositivos em Rust. O suporte a Rust é considerado experimental, mas já foi aprovado para inclusão na branch linux-next. O desenvolvimento é financiado pelo Google e pelo ISRG (Internet Security Research Group), fundador do projeto Let's Encrypt, que promove o HTTPS e o desenvolvimento de tecnologias para aprimorar a segurança da internet.
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.
A nova atualização continua a abordar as preocupações levantadas durante a discussão das duas primeiras versões da atualização. As mudanças mais notáveis incluem:
- A transição para o uso da versão estável Rust 1.57 como compilador de referência foi concluída e a vinculação à edição estável da linguagem Rust 2021 foi garantida. Anteriormente, os patches estavam vinculados à ramificação beta do Rust e utilizavam alguns recursos da linguagem classificados como instáveis. A transição para a especificação Rust 2021 nos permitiu iniciar o trabalho para remover recursos instáveis, como `const_fn_transmute`, `const_panic`, `const_unreachable_unchecked`, `core_panic` e `try_reserve` dos patches.
- O desenvolvimento da versão da biblioteca Rust `alloc` incluída nos patches continuou. Esta versão foi modificada para evitar que as funções de alocação de memória gerem condições de pânico quando erros como falta de memória ocorrem. A nova versão implementa as opções `no_rc` e `no_sync` para desabilitar funcionalidades não utilizadas no código Rust principal, tornando a biblioteca mais modular. O trabalho continua com os desenvolvedores principais da função `alloc` para migrar as alterações necessárias para a biblioteca principal. A opção `no_fp_fmt_parse`, necessária para o funcionamento da biblioteca no nível do kernel, foi migrada para a biblioteca Rust principal.
- O código foi limpo para eliminar possíveis avisos do compilador ao compilar o kernel no modo CONFIG_WERROR. Modos de diagnóstico adicionais do compilador e avisos do linter Clippy são ativados ao compilar código Rust.
- São propostas abstrações para uso em código Rust para seqlocks (bloqueios de sequência), callbacks para gerenciamento de energia, memória de E/S (readX/writeX), manipuladores de interrupção e threads, GPIO, acesso a dispositivos, drivers e credenciais.
- As ferramentas de desenvolvimento de drivers foram expandidas para incluir mutexes móveis, iteradores bit a bit, wrappers de ponteiro simplificados, diagnósticos de falhas aprimorados e uma infraestrutura independente do barramento de dados.
- O gerenciamento de referências foi aprimorado com o uso de um tipo Ref simplificado baseado no backend refcount_t, que utiliza a API do kernel de mesmo nome para contagem de referências. O suporte para os tipos Arc e Rc fornecidos pela biblioteca alloc padrão foi removido e não está disponível no código em nível de kernel (opções para desabilitar esses tipos foram fornecidas para a própria biblioteca).
- Os patches incluem uma versão do driver GPIO PL061 reescrita em Rust. Uma característica única deste driver é que sua implementação é quase idêntica, linha por linha, ao driver GPIO existente em C. Para desenvolvedores interessados em aprender a criar drivers em Rust, uma comparação linha por linha está disponível para ajudá-los a entender as construções em Rust para as quais o código C foi convertido.
- O código-fonte principal do Rust adotou o rustc_codegen_gcc, um backend rustc para GCC que implementa a compilação antecipada (AOT) usando a biblioteca libgccjit. Com o desenvolvimento adequado, o backend permitirá que o código Rust usado no kernel seja compilado usando o GCC.
- Além da ARM, Google e Microsoft, existe interesse em usar a linguagem Rust no kernel. Linux A Red Hat afirmou. Como lembrete, o Google apoia diretamente o projeto Rust. LinuxA Microsoft está desenvolvendo uma nova implementação do mecanismo de comunicação interprocessos Binder em Rust e considera reescrever vários drivers em Rust. A Microsoft começou a implementar drivers para Hyper-V em Rust. A ARM está trabalhando para aprimorar o suporte a Rust em sistemas baseados em processadores ARM. A IBM implementou suporte a Rust no kernel para sistemas PowerPC.
Fonte: opennet.ru
