A sexta versión de parches para o núcleo de Linux con soporte para a linguaxe Rust

Miguel Ojeda, autor do proxecto Rust-for-Linux, propuxo o lanzamento de compoñentes v6 para desenvolver controladores de dispositivos na linguaxe Rust para a súa consideración polos desenvolvedores do núcleo de Linux. Esta é a sétima edición dos parches, tendo en conta a primeira versión, publicada sen número de versión. O soporte de Rust considérase experimental, pero xa está incluído na rama linux-next e está suficientemente desenvolvido para comezar a traballar na creación de capas de abstracción sobre subsistemas do núcleo, así como a escritura de controladores e módulos. O desenvolvemento está financiado por Google e o ISRG (Internet Security Research Group), que é o fundador do proxecto Let's Encrypt e promove o HTTPS e o desenvolvemento de tecnoloxías para mellorar a seguridade de Internet.

Na nova versión:

  • O conxunto de ferramentas e unha variante da biblioteca alloc, liberada da posible xeración dun estado de "pánico" cando se producen erros, actualizáronse á versión de Rust 1.60, que estabiliza o soporte para o modo "maybe_uninit_extra" usado nos parches do núcleo.
  • Engadida a posibilidade de executar probas desde a documentación (probas que tamén se usan como exemplos na documentación), mediante a conversión en tempo de compilación de probas vinculadas á API do núcleo en probas KUnit executadas durante a carga do núcleo.
  • Adoptáronse os requisitos de que as probas non deberían dar lugar a unha advertencia de Clippy linter, igual que o código do núcleo de Rust.
  • Proponse unha implantación inicial do módulo "net" con funcións de rede. O código Rust ten acceso a estruturas de rede do núcleo, como o espazo de nomes (baseado na estrutura do núcleo struct net), SkBuff (struct sk_buff), TcpListener, TcpStream (socket struct), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) e os seus equivalentes IPv6. .
  • Hai soporte inicial para técnicas de programación asíncrona (async), implementadas en forma de módulo kasync. Por exemplo, pode escribir código asíncrono para manipular sockets TCP: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).esperar?; se n == 0 { devolver Ok(()); } stream.write_all(&buf[..n]).esperar?; } }
  • Engadiuse o módulo net::filter para manipular filtros de paquetes de rede. Engadiuse un exemplo de rust_netfilter.rs cunha implementación de filtro na linguaxe Rust.
  • Engadida a implementación dun simple mutex smutex::Mutex, que non require fixación.
  • Engadiuse NoWaitLock, que nunca espera por un bloqueo e, se está ocupado por outro fío, fai que se informe dun erro ao tentar adquirir o bloqueo en lugar de deter a persoa que chama.
  • Engadiuse RawSpinLock, identificado por raw_spinlock_t no núcleo, para aplicalo ás seccións que non poden estar inactivas.
  • Engadiuse o tipo ARef para referencias a un obxecto ao que se aplica o mecanismo de conta de referencias (sempre-refcounted).
  • O backend rustc_codegen_gcc, que che permite usar a biblioteca libgccjit do proxecto GCC como xerador de código en rustc para proporcionar a Rustc soporte para arquitecturas e optimizacións dispoñibles en GCC, implementou a capacidade de arrancar o compilador de Rustc. A promoción do compilador significa a posibilidade de usar un xerador de código baseado en GCC en rustc para construír o propio compilador de rustc. Ademais, a recente versión de GCC 12.1 inclúe correccións para libgccjit necesarias para que rustc_codegen_gcc funcione correctamente. Están en marcha os preparativos para ofrecer a posibilidade de instalar rustc_codegen_gcc mediante a utilidade rustup.
  • Obsérvase o progreso no desenvolvemento do GCC frontend gccrs coa implementación do compilador da linguaxe Rust baseado en GCC. Actualmente hai dous desenvolvedores a tempo completo traballando en gccrs.

Lembre que os cambios propostos permiten utilizar Rust como segunda linguaxe para desenvolver controladores e módulos do núcleo. O soporte de Rust preséntase como unha opción que non está activada por defecto e non fai que Rust se inclúa como unha dependencia de compilación necesaria para o núcleo. Usar Rust para o desenvolvemento de controladores permitirache crear controladores máis seguros e mellores cun mínimo esforzo, libre de problemas como o acceso á memoria despois da liberación, desreferencias de punteiro nulo e desbordamentos do búfer.

O manexo seguro para a memoria ofrécese en Rust no momento da compilación mediante a comprobación de referencias, o seguimento da propiedade do obxecto e a súa vida útil (alcance), así como a través da avaliación da corrección do acceso á memoria durante a execución do código. Rust tamén ofrece protección contra desbordamentos de enteiros, require a inicialización obrigatoria dos valores variables antes do seu uso, manexa mellor os erros na biblioteca estándar, aplica o concepto de referencias e variables inmutables por defecto, ofrece unha forte escritura estática para minimizar os erros lóxicos.

Fonte: opennet.ru

Engadir un comentario