Miguel Ojeda, Rust-for-Linux projekti autor, on ette pannud Linuxi tuumaarendajatele kaaluda v6 seadme draiverite arenduse komponente Rusti keeles. See on seitsmes versioon patches'itest, mis põhineb esimesel variandil, mis avaldati ilma versiooninumbrita. Rusti tuge peetakse eksperimentaalseks, kuid see on juba lisatud linux-next harusse ja on piisavalt välja arendatud, et alustada abstraktsioonitasandite loomist tuumaaluste üle, samuti draiverite ja plokkide kirjutamist. Arengut rahastavad Google ja ISRG (Internet Security Research Group), mis on Let's Encrypt projekti asutaja ja toetab HTTPS-i edendamist ning tehnoloogiate arendamist interneti turvalisuse suurendamiseks.
Uues versioonis:
- Tööriistakomplekt ja alloc'i raamatukogu versioon, mis on vaba võimalike 'panic' seisundite genereerimisest vigade korral, on värskendatud Rust 1.60 väljaandele, kus stabiliseeriti 'maybe_uninit_extra' režiimi tugi, mida kasutatakse tuumale suunatud patšides.
- Dokumentatsioonist testide läbiviimise võimalus on lisatud (testid, mida kasutatakse samal ajal dokumentatsiooni näidetena), muundades testid API tuuma jaoks KUnit testideks, mis viiakse läbi tuuma laadimisel.
- Sanktsioneeritud nõuded, mille kohaselt ei tohi testid põhjustada Clippy lintimise tööriista hoiatuste väljastamist, samuti kodeerimise nõuded Rust keeles tuuma jaoks.
- Esialgne rakendus moodulile „net” on välja pakutud, mis sisaldab võrgufunktsioone. Rust keeles on juurdepääs selliste tuuma võrgustruktuuride nagu „Namespace” (tuuma struktuuri „struct net” põhjal), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) ja nende ekvivalendid IPv6 jaoks.
- Esialgne tugi asünkroonse programmeerimise meetoditele (async) on rakendatud kasync mooduli vormis. Näiteks saab luua asünkroonselt toimivat koodi TCP-sokettide manipuleerimiseks: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
- Lisatud net::filter moodul võrgu paketifiltrite manipuleerimiseks. Lisatud näidis rust_netfilter.rs, mis sisaldab filtrite rakendust Rusti keeles.
- Lisatud lihtsa mütseksi smutex::Mutex rakendus, mis ei nõua sidumist (pinning).
- Lisatud NoWaitLock lukustus, mis ei põhjusta kunagi ooteperioodi vabastamisel ja teise lõime poolt kasutamise korral toob esile vea lukustuse hankimise proovimisel, selle asemel et peatada kutsuja.
- Lisatud RawSpinLock lukustus, mis on identne raw_spinlock_t-ga tuumas ja mida kasutatakse sektsioonides, mis ei saa olla ooteolekus.
- Lisatud ARef tüüp objektile, millele rakendatakse viidemehhanismi (always-refcounted).
- Rusti koodigeneratsiooni GCC teeki libgccjit kasutav rustc_codegen_gcc tagab koos GCC toetatavate arhitektuuride ja optimeerimisega rustcis koodi genereerimise võimaluse. Rusti kompilaatori (rustc) 'bootstrapping' võimalus lubab GCC baasil põhineva koodigeneratsiooni kasutamist rustci enda kokkupanemiseks. Samuti on GCC uusimas versioonis 12.1 tehtud vajalikud parandused libgccjit, et tagada rustc_codegen_gcc nõuetekohane töö. Valmistatakse ette rustc_codegen_gcc paigaldamise võimalust rustupi utiliidi kaudu.
- GCC-fronteeri gccrs arengus on märgata edusamme Rusti keele kompilatori rakendamisel GCC baasil. Praegu töötab gccrs kohaliku töörežiimi all kaks arendajat.
Tulet meelde, et pakutud muudatused võimaldavad kasutada Rust'i teise keelena draiverite ja tuumamoodulite arendamiseks. Rust'i toetamist tutvustatakse valikuna, mis ei ole vaikimisi aktiivne ja ei too kaasa Rust'i lisamist tuuma kohustuslikesse kogumise sõltuvustesse. Rust'i kasutamine draiverite arendamiseks võimaldab minimaalsete pingutustega luua turvalisemaid ja kvaliteetsemaid draivereid, vabastades need probleemidest nagu mälu kasutamine pärast selle vabastamist, nullviidete dereferenseerimine ja puhverserverist välja minemine.
Rust tagab mälutöö turvalisust kompileerimise ajal viidatud linkide kontrollimise, objektide omaniku jälgimise ja objektide eluea arvestamise (nähtavuse) kaudu, samuti pärast koodi käitamise ajal mälu juurdepääsu õigsuse hindamise kaudu. Rust pakub ka vahendeid täisarvude ülevoolude eest kaitsmiseks, nõuab muutuja väärtuste kohustuslikku initsialiseerimist enne kasutamist, haldab vigu paremini standardraamatukogus, rakendab muutumatuse (immutable) kontseptsiooni linkide ja muutujate puhul vaikimisi ning pakub tugevat staatilist tüüpimist loogiliste vigade minimeerimiseks.
Allikas: opennet.ru
