Mtundu wachisanu ndi chimodzi wa zigamba za Linux kernel mothandizidwa ndi chilankhulo cha Rust

Miguel Ojeda, wolemba pulojekiti ya Rust-for-Linux, akufuna kutulutsidwa kwa zida za v6 kuti apange madalaivala a zida mu chilankhulo cha Rust kuti aganizidwe ndi opanga ma Linux kernel. Ili ndi kope lachisanu ndi chiwiri la zigamba, potengera mtundu woyamba, wosindikizidwa wopanda nambala yamtunduwu. Thandizo la dzimbiri limaonedwa ngati loyesera, koma likuphatikizidwa kale mu linux-nthambi yotsatila ndipo limapangidwa mokwanira kuti liyambe ntchito yopanga zigawo zowonongeka pamagulu a kernel, komanso kulemba madalaivala ndi ma modules. Ntchitoyi imathandizidwa ndi Google ndi ISRG (Internet Security Research Group), yomwe ndi amene anayambitsa pulojekiti ya Let's Encrypt ndipo imalimbikitsa HTTPS ndi chitukuko cha matekinoloje opititsa patsogolo chitetezo cha intaneti.

Mu mtundu watsopano:

  • Chida chothandizira ndi chosiyana cha library ya alloc, chomasulidwa ku mbadwo wa "mantha" pakachitika zolakwika, zasinthidwa mpaka kutulutsidwa kwa Rust 1.60, yomwe imakhazikitsa kuthandizira kwa "mwina_uninit_extra" mawonekedwe omwe amagwiritsidwa ntchito pazigamba za kernel.
  • Anawonjezera kuthekera koyesa mayeso kuchokera pazolembedwa (mayesero omwe amagwiritsidwanso ntchito ngati zitsanzo pazolembedwa), kudzera pakuphatikiza kutembenuka kwanthawi zoyeserera kumangirizidwa ku kernel API kukhala mayeso a KUnit omwe amachitidwa pakukweza kernel.
  • Zofunikira zavomerezedwa kuti mayeso asakhale ndi chenjezo la Clippy, monga Rust kernel code.
  • Kukhazikitsa koyambirira kwa gawo la "net" yokhala ndi maukonde kumakonzedwa. Rust code ili ndi mwayi wogwiritsa ntchito maukonde a kernel monga Namespace (kutengera kapangidwe ka kernel), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in equints) .
  • Pali chithandizo choyambirira cha njira zamapulogalamu asynchronous (async), zomwe zimakhazikitsidwa ngati gawo la kasync. Mwachitsanzo, mukhoza kulemba code asynchronous kuti muwononge zitsulo za TCP: async fn echo_server(mtsinje: TcpStream) -> Zotsatira {let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; ngati n == 0 {kubwerera Ok(()); } stream.write_ all(&buf[..n]).await?; }}
  • Ukonde wowonjezera :: gawo losefera pakuwongolera zosefera zapaketi za netiweki. Chitsanzo chowonjezera rust_netfilter.rs chokhala ndi zosefera muchilankhulo cha Rust.
  • Kukhazikitsa kowonjezera kosavuta kwa mutex smutex ::Mutex, komwe sikufuna kupinidwa.
  • Yowonjezera NoWaitLock, yomwe siyimadikirira loko, ndipo ngati imakhala ndi ulusi wina, imayambitsa cholakwika poyesa kupeza loko m'malo moyimitsa woyimbirayo.
  • Yowonjezera RawSpinLock, yodziwika ndi raw_spinlock_t mu kernel, kuti igwiritse ntchito zigawo zomwe sizingakhale zopanda ntchito.
  • Mtundu wowonjezera wa ARef wolozera ku chinthu chomwe chimagwiritsidwa ntchito powerengera (zofotokozedwanso nthawi zonse).
  • Rustc_codegen_gcc backend, yomwe imakulolani kuti mugwiritse ntchito laibulale ya libgccjit kuchokera ku polojekiti ya GCC monga jenereta ya code mu rustc kuti ipereke rustc ndi chithandizo cha zomangamanga ndi kukhathamiritsa komwe kulipo ku GCC, yakhazikitsa luso loyambitsa rustc compiler. Kukwezeleza kwa compiler kumatanthauza kutha kugwiritsa ntchito jenereta ya GCC yochokera ku rustc kuti apange rustc compiler yokha. Kuphatikiza apo, kutulutsidwa kwaposachedwa kwa GCC 12.1 kumaphatikizapo kukonza kwa libgccjit kofunikira kuti rustc_codegen_gcc igwire bwino ntchito. Kukonzekera kuli mkati kuti muthe kukhazikitsa rustc_codegen_gcc pogwiritsa ntchito rustup utility.
  • Kupita patsogolo kwa chitukuko cha GCC frontend gccrs ndi kukhazikitsa kwa Rust language compiler yochokera ku GCC kumadziwika. Pakali pano pali opanga awiri anthawi zonse akugwira ntchito pa gccrs.

Kumbukirani kuti zosintha zomwe zasinthidwa zimapangitsa kuti zitheke kugwiritsa ntchito Rust ngati chilankhulo chachiwiri popanga madalaivala ndi ma module a kernel. Thandizo la dzimbiri limaperekedwa ngati njira yomwe siyimathandizidwa mwachisawawa ndipo sizipangitsa kuti Dzimbiri liphatikizidwe ngati kudalira kofunikira kwa kernel. Kugwiritsa ntchito Rust pakukula kwa madalaivala kumakupatsani mwayi wopanga madalaivala otetezeka komanso abwinoko molimbika pang'ono, opanda mavuto monga kukumbukira kukumbukira mutatha kumasula, kuchotsedwa kwa null pointer, ndi buffer overruns.

Chitetezo cha Memory chimaperekedwa mu Rust panthawi yophatikiza kudzera pakuwunika, kuyang'anira umwini wa chinthu ndi nthawi ya moyo wa chinthu (kukula), komanso kuwunika kulondola kwa kukumbukira kukumbukira panthawi yopanga ma code. Dzimbiri limaperekanso chitetezo ku kusefukira kwazinthu zonse, kumafuna kukhazikitsidwa kovomerezeka kwa zinthu zosinthika musanagwiritse ntchito, kuwongolera zolakwika bwino mulaibulale yokhazikika, kumagwiritsa ntchito lingaliro la maumboni osasinthika ndi zosintha mwachisawawa, kumapereka zilembo zolimba kuti muchepetse zolakwika zomveka.

Source: opennet.ru

Kuwonjezera ndemanga