Ang ikaanim na bersyon ng mga patch para sa Linux kernel na may suporta para sa Rust na wika

Iminungkahi ni Miguel Ojeda, may-akda ng proyektong Rust-for-Linux, ang pagpapalabas ng mga bahagi ng v6 para sa pagbuo ng mga driver ng device sa wikang Rust para sa pagsasaalang-alang ng mga developer ng Linux kernel. Ito ang ikapitong edisyon ng mga patch, na isinasaalang-alang ang unang bersyon, na inilathala nang walang numero ng bersyon. Ang suporta sa kalawang ay itinuturing na pang-eksperimento, ngunit kasama na sa linux-next branch at sapat na itong binuo upang simulan ang paggawa ng abstraction layer sa mga kernel subsystem, pati na rin ang pagsulat ng mga driver at module. Ang pagpapaunlad ay pinondohan ng Google at ng ISRG (Internet Security Research Group), na siyang nagtatag ng proyektong Let's Encrypt at nagpo-promote ng HTTPS at ang pagbuo ng mga teknolohiya upang mapabuti ang seguridad sa Internet.

Sa bagong bersyon:

  • Ang toolkit at isang variant ng alloc library, na napalaya mula sa posibleng pagbuo ng isang "panic" na estado kapag naganap ang mga error, ay na-update sa paglabas ng Rust 1.60, na nagpapatatag ng suporta para sa "maybe_uninit_extra" mode na ginagamit sa mga kernel patch.
  • Nagdagdag ng kakayahang magpatakbo ng mga pagsubok mula sa dokumentasyon (mga pagsubok na ginagamit din bilang mga halimbawa sa dokumentasyon), sa pamamagitan ng compile-time na conversion ng mga pagsubok na nakatali sa kernel API sa mga pagsusulit na KUnit na isinagawa habang naglo-load ng kernel.
  • Ang mga kinakailangan ay pinagtibay na ang mga pagsubok ay hindi dapat magresulta sa isang Clippy linter na babala, tulad ng Rust kernel code.
  • Ang isang paunang pagpapatupad ng "net" na module na may mga function ng network ay iminungkahi. Ang Rust code ay may access sa mga istruktura ng kernel network tulad ng Namespace (batay sa struct net kernel structure), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 ( struct sockaddr_in) at kanilang mga katumbas na IPv6 .
  • Mayroong paunang suporta para sa asynchronous programming techniques (async), na ipinatupad sa anyo ng kasync module. Halimbawa, maaari kang magsulat ng asynchronous code upang manipulahin ang mga TCP socket: async fn echo_server(stream: TcpStream) -> Resulta { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).wait?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).wait?; } }
  • Nagdagdag ng net::filter module para sa pagmamanipula ng network packet filters. Nagdagdag ng halimbawang rust_netfilter.rs na may pagpapatupad ng filter sa wikang Rust.
  • Idinagdag ang pagpapatupad ng isang simpleng mutex smutex::Mutex, na hindi nangangailangan ng pag-pin.
  • Idinagdag ang NoWaitLock, na hindi kailanman naghihintay ng lock, at kung inookupahan ng isa pang thread, ay nagdudulot ng error na maiulat kapag sinusubukang kunin ang lock sa halip na ihinto ang tumatawag.
  • Idinagdag ang RawSpinLock, na kinilala ng raw_spinlock_t sa kernel, para ilapat sa mga seksyong hindi maaaring idle.
  • Idinagdag ang uri ng ARef para sa mga sanggunian sa isang bagay kung saan inilalapat ang mekanismo ng pagbibilang ng sanggunian (palaging muling binibilang).
  • Ang rustc_codegen_gcc backend, na nagbibigay-daan sa iyong gamitin ang library ng libgccjit mula sa proyekto ng GCC bilang isang generator ng code sa rustc upang magbigay ng suporta sa rustc para sa mga arkitektura at pag-optimize na magagamit sa GCC, ay nagpatupad ng kakayahang mag-bootstrap ng rustc compiler. Ang pag-promote ng compiler ay nangangahulugang ang kakayahang gumamit ng GCC-based na code generator sa rustc upang buuin ang rustc compiler mismo. Bilang karagdagan, ang kamakailang paglabas ng GCC 12.1 ay may kasamang mga pag-aayos sa libgccjit na kinakailangan para gumana nang tama ang rustc_codegen_gcc. Ang mga paghahanda ay isinasagawa upang magbigay ng kakayahang mag-install ng rustc_codegen_gcc gamit ang rustup utility.
  • Ang pag-unlad sa pagbuo ng GCC frontend gccrs sa pagpapatupad ng Rust language compiler batay sa GCC ay nabanggit. Kasalukuyang may dalawang full-time na developer na nagtatrabaho sa gccrs.

Alalahanin na ang mga iminungkahing pagbabago ay ginagawang posible na gamitin ang Rust bilang pangalawang wika para sa pagbuo ng mga driver at kernel module. Ang suporta sa kalawang ay ipinakita bilang isang opsyon na hindi pinagana bilang default at hindi nagreresulta sa pagsasama ng Rust bilang isang kinakailangang build dependency para sa kernel. Ang paggamit ng Rust para sa pag-develop ng driver ay magbibigay-daan sa iyo na lumikha ng mas ligtas at mas mahusay na mga driver na may kaunting pagsisikap, walang mga problema tulad ng pag-access sa memorya pagkatapos ng pagbabakante, mga hindi pagtukoy sa null pointer, at mga buffer overrun.

Ang kaligtasan ng memorya ay ibinibigay sa Rust sa oras ng pag-compile sa pamamagitan ng pagsuri sa sanggunian, pagsubaybay sa pagmamay-ari ng bagay at panghabambuhay ng bagay (saklaw), gayundin sa pamamagitan ng pagsusuri ng kawastuhan ng pag-access sa memorya sa panahon ng pagpapatupad ng code. Nagbibigay din ang kalawang ng proteksyon laban sa mga overflow ng integer, nangangailangan ng mandatoryong pagsisimula ng mga variable na halaga bago gamitin, mas mahusay na pinangangasiwaan ang mga error sa karaniwang library, inilalapat ang konsepto ng hindi nababagong mga sanggunian at mga variable bilang default, nag-aalok ng malakas na static na pag-type upang mabawasan ang mga lohikal na error.

Pinagmulan: opennet.ru

Magdagdag ng komento