Terceira edição de patches para o kernel Linux com suporte para a linguagem Rust

Miguel Ojeda, autor do projeto Rust-for-Linux, propôs uma terceira opção de componente para o desenvolvimento de drivers de dispositivo na linguagem Rust para os desenvolvedores do kernel Linux considerarem. O suporte ao Rust é considerado experimental, mas já foi acordado para inclusão no branch linux-next. 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.

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 versão dos patches continua eliminando os comentários feitos durante a discussão da primeira e segunda versões dos patches. As mudanças mais visíveis:

  • Foi feita uma transição para o uso da versão estável do Rust 1.57 como compilador de referência e foi fornecido um link para a edição estabilizada da linguagem Rust 2021. Anteriormente, os patches eram vinculados ao ramo beta do Rust e usavam alguns recursos da linguagem que foram classificados como instáveis. A transição para a especificação Rust 2021 nos permitiu iniciar o trabalho para evitar o uso de recursos instáveis ​​em patches como const_fn_transmute, const_panic, const_unavailable_unchecked e core_panic e try_reserve.
  • O desenvolvimento da versão alloc da biblioteca Rust incluída nos patches continuou, modificada para livrar as funções de alocação de memória da possível geração do estado de “pânico” quando ocorrem erros, como falta de memória. A nova versão implementa as opções “no_rc” e “no_sync” para desabilitar funcionalidades não utilizadas no código Rust do kernel, tornando a biblioteca mais modular. O trabalho continua com os principais desenvolvedores do alloc, visando transferir as alterações necessárias do kernel para a biblioteca principal. A opção “no_fp_fmt_parse”, necessária para que a biblioteca funcione no nível do kernel, foi movida para a biblioteca base do Rust (núcleo).
  • O código foi limpo para eliminar possíveis avisos do compilador ao construir o kernel no modo CONFIG_WERROR. Ao construir código em Rust, modos adicionais de diagnóstico do compilador e avisos de linter Clippy são habilitados.
  • Abstrações são propostas para uso em código Rust para seqlocks (bloqueios de sequência), chamadas de retorno para gerenciamento de energia, memória de E/S (readX/writeX), manipuladores de interrupções e threads, GPIO, acesso a dispositivos, drivers e credenciais.
  • As ferramentas para desenvolvimento de drivers foram expandidas para incluir mutexes relocáveis, iteradores de bits, ligações simplificadas de ponteiros, diagnósticos de falhas aprimorados e infraestrutura independente de barramento de dados.
  • Trabalho aprimorado com links usando um tipo Ref simplificado, baseado no backend refcount_t, que usa a API do kernel de mesmo nome para contar referências. O suporte para os tipos Arc e Rc fornecidos na biblioteca alloc padrão foi removido e não está disponível no código executado no nível do kernel (foram preparadas opções para a própria biblioteca que desabilitam esses tipos).
  • Os patches incluem uma versão do driver GPIO PL061, reescrito em Rust. Uma característica especial do driver é que sua implementação quase linha por linha repete o driver GPIO existente na linguagem C. Para desenvolvedores que desejam se familiarizar com a criação de drivers em Rust, foi preparada uma comparação linha por linha que permite entender em quais construções em Rust o código C é convertido.
  • A base de código principal do Rust adotou o rustc_codegen_gcc, um backend do Rustc para GCC que implementa compilação antecipada (AOT) usando a biblioteca libgccjit. Com o desenvolvimento adequado do backend, permitirá coletar o código Rust envolvido no kernel usando GCC.
  • Além da ARM, Google e Microsoft, a Red Hat manifestou interesse em usar a linguagem Rust no kernel Linux. Lembramos que o Google fornece suporte direto para o projeto Rust for Linux, está desenvolvendo uma nova implementação do mecanismo de comunicação interprocessos Binder em Rust e está considerando a possibilidade de retrabalhar vários drivers em Rust. A Microsoft começou a implementar drivers para Hyper-V em Rust. ARM está trabalhando para melhorar o suporte Rust para sistemas baseados em ARM. A IBM implementou suporte Rust no kernel para sistemas PowerPC.

Fonte: opennet.ru

Adicionar um comentário