Iyo yechitanhatu vhezheni yezvigamba zveLinux kernel nerutsigiro rweRust mutauro

Miguel Ojeda, munyori wepurojekiti yeRust-for-Linux, akakurudzira kuburitswa kwezvikamu zvev6 zvekugadzira madhiraivha emidziyo mumutauro weRust kuti atariswe nevagadziri veLinux kernel. Iyi ndiyo yechinomwe edition yezvigamba, tichifunga nezvekutanga vhezheni, yakabudiswa pasina nhamba yeshanduro. Rutsigiro rutsigiro rwunoonekwa sekuyedza, asi rwakatoverengerwa mulinux-rinotevera bazi uye rakagadzirwa zvakakwana kuti ritange basa rekugadzira abstraction layers pamusoro pekernel subsystems, pamwe nekunyora madhiraivha nemamodule. Kuvandudza uku kunotsigirwa neGoogle neISRG (Internet Security Research Group), inova muvambi weLet Encrypt project uye inosimudzira HTTPS nekuvandudzwa kwetekinoroji yekuvandudza kuchengetedzwa kweInternet.

Mushanduro itsva:

  • Iyo Toolkit uye musiyano wealloc raibhurari, yakasunungurwa kubva kune inokwanisika chizvarwa che "kuvhunduka" mamiriro kana kukanganisa kukaitika, yakagadziridzwa kuburitswa kweRust 1.60, iyo inodzikamisa rutsigiro rwe "pamwe_uninit_yakawedzera" modhi inoshandiswa mukernel patches.
  • Yakawedzera kugona kumhanyisa bvunzo kubva muzvinyorwa (bvunzo dzinoshandiswawo semienzaniso muzvinyorwa), kuburikidza nekubatanidza-nguva shanduko yebvunzo yakasungirirwa kune kernel API kuita KUnit bvunzo dzinoitwa panguva yekurodha kernel.
  • Zvinodikanwa zvakagamuchirwa kuti bvunzo hadzifanire kukonzeresa Clippy linter yambiro, senge Rust kernel kodhi.
  • Kuitwa kwekutanga kwe "net" module ine network mabasa inokurudzirwa. Rust kodhi inokwanisa kuwana kernel network zvimiro zvakaita seNamespace (zvichibva pane struct net kernel chimiro), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in equints) uye yavo .
  • Iko kune yekutanga kutsigirwa kweasynchronous programming matekiniki (async), inoshandiswa nenzira yekasync module. Semuenzaniso, unogona kunyora asynchronous kodhi kuti ushandise TCP zvigadziko: async fn echo_server(rukova: TcpStream) -> Mhedzisiro {rega mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf). await?; kana n == 0 {dzokera Ok(()); } stream.write_all(&buf[..n]).wait?; }}
  • Yakawedzerwa mambure ::sefa module yekubata network packet mafirita. Yakawedzerwa muenzaniso rust_netfilter.rs ine sefa yekushandisa mumutauro weRust.
  • Yakawedzera kuisirwa kweyakapusa mutex smutex ::Mutex, iyo isingade pinning.
  • Yakawedzerwa NoWaitLock, iyo isingambomirira kukiyiwa, uye kana yakagarwa neimwe shinda, inokonzeresa kukanganisa kutaurwa paunenge uchiedza kutora kiyi pane kumisa anofona.
  • Yakawedzera RawSpinLock, yakaonekwa ne raw_spinlock_t mu kernel, kuisa kune zvikamu zvisingaite.
  • Yakawedzerwa ARef mhando yezvirevo kune chimwe chinhu chinoshandiswa mareferensi ekuverengera (nguva dzose-yakadzokororwa).
  • Iyo rustc_codegen_gcc backend, iyo inokutendera kuti ushandise libgccjit raibhurari kubva kuGCC purojekiti sekodhi jenareta murustc kupa rustc nerutsigiro rwezvivakwa uye optimizations inowanikwa muGCC, yaita kugona bootstrapping iyo rustc compiler. Kukwidziridzwa kunoreva kugona kushandisa GCC-based code generator mu rustc kuvaka iyo rustc compiler pachayo. Pamusoro pezvo, kuburitswa kwazvino kweGCC 12.1 kunosanganisira zvigadziriso kune libgccjit zvinodiwa kuti rustc_codegen_gcc ishande nemazvo. Gadziriro dziri kuitika kupa kugona kuisa rustc_codegen_gcc uchishandisa rustup utility.
  • Kufambira mberi mukugadzirwa kweGCC frontend gccrs nekushandiswa kweRust mutauro compiler yakavakirwa paGCC inocherechedzwa. Parizvino kune vaviri venguva yakazara vagadziri vanoshanda pagccrs.

Rangarira kuti shanduko dzakarongwa dzinoita kuti zvikwanise kushandisa Rust semutauro wechipiri pakuvandudza vatyairi uye kernel module. Rutsigiro rutsigiro runounzwa sechisarudzo chisingagoneswe nekukasira uye hachikonzereri kuti Rust ibatanidzwe sechinhu chinodiwa kuvaka kutsamira kune kernel. Kushandisa Rust yekusimudzira mutyairi kuchakubvumidza kuti ugadzire vatyairi vakachengeteka uye vari nani nekuedza kushoma, vasina matambudziko akadai sekuwana ndangariro mushure mekusunungura, null pointer dereferences, uye buffer overruns.

Memory-yakachengeteka kubata inopihwa muRust panguva yekuunganidza kuburikidza nekutarisa referensi, kuchengeta track yemuridzi wechinhu uye chinhu hupenyu hwese (chiyero), pamwe nekuongororwa kwekururama kwekuyeuka kwekuwana panguva yekodhi kodhi. Ngura inopawo dziviriro kubva pahuwandu hwekufashukira, inoda kusungirirwa kwekutanga kwemhando dzakasiyana usati washandiswa, inobata zvikanganiso zviri nani muraibhurari yakajairwa, inoshandisa iyo pfungwa yezvisingachinjiki mareferensi uye zvinosiyana nekusarudzika, inopa yakasimba static typing kuderedza zvikanganiso zvine musoro.

Source: opennet.ru

Voeg