Versioni i gjashtë i arnimeve për kernelin Linux me mbështetje për gjuhën Rust

Miguel Ojeda, autor i projektit Rust-for-Linux, propozoi lëshimin e komponentëve v6 për zhvillimin e drejtuesve të pajisjeve në gjuhën Rust për t'u marrë në konsideratë nga zhvilluesit e kernelit Linux. Ky është edicioni i shtatë i arnimeve, duke marrë parasysh versionin e parë, të publikuar pa një numër versioni. Mbështetja e Rust konsiderohet eksperimentale, por tashmë është përfshirë në degën e linux-next dhe është zhvilluar mjaftueshëm për të filluar punën për krijimin e shtresave abstraksioni mbi nënsistemet e kernelit, si dhe shkrimin e drejtuesve dhe moduleve. Zhvillimi financohet nga Google dhe ISRG (Internet Security Research Group), i cili është themeluesi i projektit Let's Encrypt dhe promovon HTTPS dhe zhvillimin e teknologjive për të përmirësuar sigurinë në internet.

Në versionin e ri:

  • Paketa e veglave dhe një variant i bibliotekës alloc, i çliruar nga gjenerimi i mundshëm i një gjendjeje "paniku" kur ndodhin gabime, janë përditësuar në lëshimin e Rust 1.60, i cili stabilizon mbështetjen për modalitetin "maybe_uninit_extra" të përdorur në arna të kernelit.
  • U shtua aftësia për të ekzekutuar teste nga dokumentacioni (teste që përdoren gjithashtu si shembuj në dokumentacion), përmes konvertimit në kohë të përpilimit të testeve të lidhura me API-në e kernelit në teste KUnit të ekzekutuara gjatë ngarkimit të kernelit.
  • Janë miratuar kërkesat që testet nuk duhet të rezultojnë në një paralajmërim të linterit Clippy, ashtu si kodi i bërthamës Rust.
  • Propozohet një zbatim fillestar i modulit “net” me funksionet e rrjetit. Kodi Rust ka qasje në strukturat e rrjetit të kernelit si Hapësira e emrave (bazuar në strukturën e kernelit të rrjetit të strukturës), SkBuff (struct sk_buff), TcpListener, TcpStream (strukt fole), Ipv4Addr (struct in_addr), SocketAddrV4 (struct_in equinv6) dhe IPVXNUMX. .
  • Ekziston mbështetje fillestare për teknikat e programimit asinkron (async), të zbatuara në formën e modulit kasync. Për shembull, mund të shkruani kod asinkron për të manipuluar prizat TCP: async fn echo_server(stream: TcpStream) -> Rezultati { let mut buf = [0u8; 1024]; loop { le n = stream.read(&mut buf).prit?; nëse n == 0 { return Ok(()); } stream.write_all(&buf[..n]).prit?; } }
  • Moduli i shtuar net::filter për manipulimin e filtrave të paketave të rrjetit. U shtua shembull rust_netfilter.rs me një implementim filtri në gjuhën Rust.
  • U shtua zbatimi i një mutex smutex::Mutex të thjeshtë, i cili nuk kërkon fiksim.
  • U shtua NoWaitLock, i cili nuk pret kurrë për një bllokim, dhe nëse është i zënë nga një fije tjetër, shkakton raportimin e një gabimi kur përpiqeni të merrni bllokimin në vend që të ndaloni telefonuesin.
  • U shtua RawSpinLock, i identifikuar nga raw_spinlock_t në kernel, për t'u aplikuar në seksione që nuk mund të jenë boshe.
  • U shtua tipi ARef për referenca ndaj një objekti në të cilin është aplikuar mekanizmi i numërimit të referencës (gjithmonë-rillogaritur).
  • Mbështetja rustc_codegen_gcc, e cila ju lejon të përdorni bibliotekën libgccjit nga projekti GCC si një gjenerues kodesh në rustc për t'i ofruar rustc mbështetje për arkitekturat dhe optimizimet e disponueshme në GCC, ka zbatuar aftësinë për të bootstrapping përpiluesin rustc. Promovimi i përpiluesit nënkupton aftësinë për të përdorur një gjenerator kodi të bazuar në GCC në rustc për të ndërtuar vetë përpiluesin rustc. Përveç kësaj, lëshimi i fundit i GCC 12.1 përfshin rregullime për libgccjit të nevojshme që rustc_codegen_gcc të funksionojë siç duhet. Përgatitjet janë duke u zhvilluar për të ofruar mundësinë për të instaluar rustc_codegen_gcc duke përdorur programin rustup.
  • Është vërejtur përparimi në zhvillimin e gccrs frontend të GCC me zbatimin e përpiluesit të gjuhës Rust bazuar në GCC. Aktualisht janë dy zhvillues me kohë të plotë që punojnë në gccrs.

Kujtojmë se ndryshimet e propozuara bëjnë të mundur përdorimin e Rust si gjuhë të dytë për zhvillimin e drejtuesve dhe moduleve të kernelit. Mbështetja e Rust paraqitet si një opsion që nuk është aktivizuar si parazgjedhje dhe nuk rezulton që Rust të përfshihet si një varësi e nevojshme ndërtimi për kernelin. Përdorimi i Rust për zhvillimin e drejtuesve do t'ju lejojë të krijoni drejtues më të sigurt dhe më të mirë me përpjekje minimale, pa probleme të tilla si qasja në kujtesë pas çlirimit, çreferencat e treguesit null dhe tejkalimet e buferit.

Siguria e memories sigurohet në Rust në kohën e përpilimit përmes kontrollit të referencës, mbajtjes së gjurmëve të pronësisë së objektit dhe jetëgjatësisë së objektit (fushëveprimit), si dhe përmes vlerësimit të korrektësisë së aksesit në kujtesë gjatë ekzekutimit të kodit. Rust siguron gjithashtu mbrojtje kundër tejmbushjeve të numrave të plotë, kërkon inicializimin e detyrueshëm të vlerave të variablave përpara përdorimit, trajton më mirë gabimet në bibliotekën standarde, zbaton konceptin e referencave dhe variablave të pandryshueshme si parazgjedhje, ofron shtypje të fortë statike për të minimizuar gabimet logjike.

Burimi: opennet.ru

Shto një koment