Treće izdanje zakrpa za Linux kernel sa podrškom za Rust jezik

Miguel Ojeda, autor projekta Rust-for-Linux, predložio je opciju treće komponente za razvoj drajvera uređaja na jeziku Rust za programere Linux kernela koje treba da razmotre. Podrška za Rust se smatra eksperimentalnom, ali je već dogovorena za uključivanje u linux-next granu. Razvoj finansiraju Google i ISRG (Internet Security Research Group), koji je osnivač projekta Let's Encrypt i promoviše HTTPS i razvoj tehnologija za poboljšanje internet sigurnosti.

Podsjetimo da predložene izmjene omogućavaju korištenje Rusta kao drugog jezika za razvoj drajvera i modula kernela. Podrška za Rust je predstavljena kao opcija koja nije omogućena prema zadanim postavkama i ne dovodi do uključivanja Rusta među potrebne ovisnosti o izgradnji za kernel. Korišćenje Rusta za razvoj drajvera omogućiće vam da kreirate sigurnije i bolje drajvere uz minimalan napor, bez problema kao što je pristup memorijskom području nakon što se oslobodi, dereferenciranje nul pokazivača i prekoračenje bafera.

Sigurnost memorije je obezbeđena u Rustu u vreme kompajliranja kroz proveru referenci, praćenje vlasništva nad objektom i životnog veka objekta (opsega), kao i kroz procenu ispravnosti pristupa memoriji tokom izvršavanja koda. Rust također pruža zaštitu od prekoračenja cijelih brojeva, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije upotrebe, bolje obrađuje greške u standardnoj biblioteci, primjenjuje koncept nepromjenjivih referenci i varijabli po defaultu, nudi snažno statičko kucanje kako bi se minimizirale logičke greške.

Nova verzija zakrpa nastavlja eliminirati komentare date tokom rasprave o prvoj i drugoj verziji zakrpa. Najuočljivije promjene:

  • Napravljen je prelazak na korištenje stabilnog izdanja Rusta 1.57 kao referentnog kompajlera i pružena je veza sa stabilizovanim izdanjem jezika Rust 2021. Ranije su zakrpe bile vezane za beta granu Rusta i koristile su neke jezičke karakteristike koje klasifikovani su kao nestabilni. Prelazak na Rust 2021 specifikaciju omogućio nam je da započnemo rad na izbjegavanju korištenja takvih nestabilnih funkcija u zakrpama kao što su const_fn_transmute, const_panic, const_unavailable_unchecked i core_panic i try_reserve.
  • Nastavljen je razvoj alloc verzije Rust biblioteke uključene u zakrpe, modificirane kako bi se funkcije dodjele memorije oslobodile mogućeg generiranja “paničnog” stanja kada se pojave greške, kao što je nedostatak memorije. Nova verzija implementira opcije “no_rc” i “no_sync” za onemogućavanje funkcionalnosti koja se ne koristi u Rust kodu kernela, čineći biblioteku modularnijom. Nastavlja se rad sa glavnim programerima alloc-a, s ciljem prenošenja promjena potrebnih za kernel u glavnu biblioteku. Opcija “no_fp_fmt_parse”, potrebna da bi biblioteka radila na nivou kernela, premještena je u Rust osnovnu biblioteku (jezgro).
  • Kôd je očišćen da bi se riješio mogućih upozorenja kompajlera prilikom izgradnje kernela u CONFIG_WERROR modu. Prilikom izrade koda u Rustu, omogućeni su dodatni dijagnostički načini kompajlera i Clippy linter upozorenja.
  • Apstrakcije su predložene za upotrebu u Rust kodu za seqlocks (zaključavanja sekvenci), povratni pozivi za upravljanje napajanjem, I/O memorija (readX/writeX), rukovaoci prekida i niti, GPIO, pristup uređajima, drajverima i vjerodajnicama.
  • Alati za razvoj drajvera su prošireni tako da uključuju mutekse koji se mogu premeštati, iteratore bitova, pojednostavljeno povezivanje pokazivača, poboljšanu dijagnostiku grešaka i infrastrukturu nezavisnu od magistrale podataka.
  • Poboljšan rad sa vezama pomoću pojednostavljenog tipa Ref, zasnovanog na backendu refcount_t, koji koristi istoimeni API kernela za brojanje referenci. Podrška za tipove Arc i Rc obezbeđena u standardnoj alok biblioteci je uklonjena i nije dostupna u kodu koji se izvršava na nivou kernela (pripremljene su opcije za samu biblioteku koje onemogućavaju ove tipove).
  • Zakrpe uključuju verziju PL061 GPIO drajvera, prepisanu u Rustu. Posebna karakteristika drajvera je da njegova implementacija skoro red po red ponavlja postojeći GPIO drajver u C jeziku. Za programere koji žele da se upoznaju sa kreiranjem drajvera u Rustu, pripremljeno je poređenje red po red koje im omogućava da razumeju u koje konstrukcije u Rustu je konvertovan C kod.
  • Glavna Rust kodna baza je usvojila rustc_codegen_gcc, rustc backend za GCC koji implementira kompilaciju unaprijed (AOT) koristeći libgccjit biblioteku. Uz pravilan razvoj pozadine, omogućit će vam da prikupite Rust kod koji je uključen u kernel koristeći GCC.
  • Pored ARM-a, Google-a i Microsoft-a, Red Hat je izrazio interesovanje za korištenje Rust jezika u Linux kernelu. Podsjetimo, Google direktno pruža podršku projektu Rust for Linux, razvija novu implementaciju Binder međuprocesnog komunikacijskog mehanizma u Rustu, te razmatra mogućnost prerade različitih drajvera u Rustu. Microsoft je započeo implementaciju drajvera za Hyper-V u Rust. ARM radi na poboljšanju Rust podrške za ARM bazirane sisteme. IBM je implementirao Rust podršku u kernel za PowerPC sisteme.

izvor: opennet.ru

Dodajte komentar