O Kernel Linux se Prepara para a Atualização para Rust 1.77
A mudança do Linux para toolchains Rust mais novas, incluindo a atualização planejada para Rust 1.77, está gerando debate sobre o quanto o kernel deve depender de recursos instáveis do compilador e o que isso significa para a manutenibilidade de longo prazo. Os comentaristas ponderam os benefícios do Rust — segurança de memória, abstrações modernas e suporte de alocador em evolução — contra preocupações práticas como bootstrap do compilador, tamanho binário e a proporção ainda minúscula do código do kernel escrito em Rust. Há amplo consenso de que o Rust continuará opcional e incremental no kernel por enquanto, servindo como um campo de testes para moldar tanto a linguagem quanto suas ferramentas para trabalho de sistemas de baixo nível.
Versionamento do Rust e uso de recursos instáveis no kernel
- Para projetos comuns que usam Rust estável, as atualizações do compilador são em grande parte compatíveis com versões anteriores; ferramentas como
clippyecargo fmtajudam a acompanhar mudanças de estilo e lint. - O Rust-for-Linux usa deliberadamente recursos nightly/instáveis, então as atualizações podem exigir correções não triviais.
- Isso é visto como necessário para exercitar recursos ausentes (por exemplo,
offset_of, APIs de alocador) e ajudar a empurrá-los em direção à estabilização. - Estimativa citada: ~0,5 horas por milhão de linhas de Rust para atualizar compiladores em bases de código grandes; o Rust-for-Linux tem sobrecarga maior devido ao uso de nightly.
Alocadores e manipulação de memória
- O kernel precisa de alocação granular, falível e por tipo de objeto, o que o empurra para as APIs instáveis de
Allocatorem vez de apenasGlobalAlloc. allocator_apifornece construção falível (por exemplo,try_new) e flexibilidade que as APIs estáveis não têm.- A biblioteca padrão sozinha pode usar recursos instáveis; crates de terceiros não podem fazê-lo no estável.
Tamanho binário e dependências
- Muitas reclamações sobre o tamanho binário do Rust estão ligadas a:
- Máquinas de debug/panic (por exemplo, backtrace, formatação sensível a Unicode).
- Linkagem estática de std.
- Árvores de dependências pesadas e monomorfização.
- Em contextos no-std (microcontroladores, kernel), os binários podem ser muito menores.
- Strip/divisão de debug e os próximos padrões do Cargo reduzirão os tamanhos; mas o “hello world” em Rust ainda tem uma sobrecarga constante relativamente grande em relação ao C.
- Alguns argumentam que grandes árvores de build e caches (centenas de MB) são problemáticos; outros observam que isso é comparável a toolchains modernas e que o Rust no kernel não trará grandes grafos de dependências.
Extensão e estrutura do Rust no kernel
- O código Rust atualmente é uma fração minúscula do kernel (na ordem de ~0,03–0,05% das linhas).
- A maior parte é infraestrutura; drivers em Rust ainda são “erros de arredondamento”, com exemplos como uma reescrita do binder do Android.
- O kernel usa
coree umallocpersonalizado, mas nãostd.
Bootstrap, LFS e toolchains
- Preocupação: a história de bootstrap do Rust é “feia” e pode ameaçar o Linux From Scratch (LFS).
- Contraponto: o LFS já assume um compilador C no host; da mesma forma, poderia assumir um compilador Rust no host e usar apenas
rustcpara produzir arquivos objeto. - Em comparação com o bootstrap de outros compiladores complexos (por exemplo, GHC), a situação do Rust é criticada, mas não única.
Segurança de baixo nível, ponteiros e escolha da linguagem
- A discussão sobre operações inseguras com ponteiros e macros versus aritmética de ponteiros segura destaca sutilezas de UB e trade-offs de desempenho.
- Esclarecimento sobre as camadas da biblioteca do Rust:
core(primitivas da linguagem),alloc(tipos de heap),std(recursos dependentes do SO). - Alguns querem não apenas uma reescrita da linguagem, mas verificação formal semelhante à do seL4.
- Pergunta levantada: “Por que Rust em vez de Zig?”
- Um lado valoriza as fortes garantias de segurança de memória do Rust.
- Outro afirma que bugs de memória podem ser tratados com testes e que a segurança do Rust tem seus próprios trade-offs; não houve consenso.