Miguel Ojeda, autor do projeto Rust-for-Linux, propôs aos desenvolvedores do kernel Linux a quarta versão dos componentes para o desenvolvimento de drivers de dispositivos na linguagem Rust. O suporte ao Rust é considerado experimental, mas já foi acordado para inclusão na branch linux-next e está suficientemente desenvolvido para iniciar o trabalho na criação de camadas de abstração sobre subsistemas do kernel, além de permitir 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 promove o avanço do HTTPS e o desenvolvimento de tecnologias para aumentar a segurança da internet.
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.
Na nova versão dos patches, continuamos a resolver as observações feitas durante a discussão das primeiras, segunda e terceira edições dos patches. Na nova versão:
- Foi feita a transição para o uso do compilador estável Rust 1.58.0 como referência. Entre as mudanças necessárias para o projeto que ainda não foram incluídas no conjunto principal de ferramentas do Rust, destacam-se a flag "-Zsymbol-mangling-version=v0" (esperada na Rust 1.59.0) e o modo "maybe_uninit_extra" (esperado na Rust 1.60.0).
- Foram adicionadas verificações automáticas para a presença de ferramentas Rust adequadas e ampliadas as capacidades de teste de suporte ao Rust no sistema.
- Novas abstrações foram propostas para o acesso a tabelas de identificação de dispositivos a partir do código na linguagem Rust (“IdArray” e “IdTable”).
- Foram adicionadas camadas para acessar funções relacionadas ao timer (framework de clock).
- Os drivers para plataformas agora são definidos por meio da implementação de traits.
- Um novo macro foi adicionado para simplificar o registro de drivers de plataformas, além de um novo template de driver.
- Foram adicionados macros para as estruturas “dev_*”.
- Foram adicionados métodos “{read,write}*_relaxed” para o tipo IoMem.
- A propriedade FileOpener foi removida para simplificar as operações com arquivos.
- Adicionou-se o parâmetro “ThisModule” aos argumentos passados durante o registro do driver.
- Um modelo de template foi proposto para a criação de módulos do kernel na linguagem Rust.
Fonte: opennet.ru
