A treia ediție de patch-uri pentru nucleul Linux cu suport pentru limbajul Rust

Miguel Ojeda, autorul proiectului Rust-for-Linux, a propus o a treia opțiune de componentă pentru dezvoltarea driverelor de dispozitiv în limbajul Rust pentru ca dezvoltatorii de kernel Linux să ia în considerare. Suportul Rust este considerat experimental, dar a fost deja convenit pentru includerea în ramura linux-next. Dezvoltarea este finanțată de Google și de ISRG (Internet Security Research Group), care este fondatorul proiectului Let's Encrypt și promovează HTTPS și dezvoltarea tehnologiilor pentru îmbunătățirea securității pe Internet.

Amintiți-vă că modificările propuse fac posibilă utilizarea Rust ca a doua limbă pentru dezvoltarea driverelor și modulelor kernelului. Suportul Rust este prezentat ca o opțiune care nu este activată implicit și nu are ca rezultat includerea Rust ca dependență de construcție necesară pentru nucleu. Folosirea Rust pentru dezvoltarea driverelor vă va permite să creați drivere mai sigure și mai bune cu un efort minim, fără probleme precum accesul la memorie după eliberare, dereferențele pointerului nul și depășirile de buffer.

Siguranța memoriei este asigurată în Rust în timpul compilării prin verificarea referințelor, urmărirea proprietății obiectului și a duratei de viață a obiectului (sfera de aplicare), precum și prin evaluarea corectitudinii accesului la memorie în timpul execuției codului. Rust oferă, de asemenea, protecție împotriva depășirilor de numere întregi, necesită inițializarea obligatorie a valorilor variabilelor înainte de utilizare, gestionează mai bine erorile în biblioteca standard, aplică implicit conceptul de referințe imuabile și variabile, oferă tastare statică puternică pentru a minimiza erorile logice.

Noua versiune a patch-urilor continuă să elimine comentariile făcute în timpul discuției despre prima și a doua versiune a patch-urilor. Cele mai vizibile schimbări:

  • S-a făcut o tranziție către utilizarea versiunii stabile a Rust 1.57 ca compilator de referință și a fost furnizat un link către ediția stabilizată a limbajului Rust 2021. Anterior, patch-urile erau legate de ramura beta a Rust și foloseau unele caracteristici ale limbajului care au fost clasificate drept instabile. Tranziția la specificația Rust 2021 ne-a permis să inițiem lucrări pentru a evita utilizarea unor astfel de caracteristici instabile în patch-uri precum const_fn_transmute, const_panic, const_unavailable_unchecked și core_panic și try_reserve.
  • Dezvoltarea versiunii aloc a bibliotecii Rust inclusă în patch-uri a continuat, modificată pentru a elimina funcțiile de alocare a memoriei de posibila generare a stării de „panică” atunci când apar erori, cum ar fi lipsa memoriei. Noua versiune implementează opțiunile „no_rc” și „no_sync” pentru a dezactiva funcționalitatea care nu este utilizată în codul Rust al nucleului, făcând biblioteca mai modulară. Lucrările continuă cu dezvoltatorii principali alloc, menite să transfere modificările necesare pentru kernel în biblioteca principală. Opțiunea „no_fp_fmt_parse”, necesară pentru ca biblioteca să funcționeze la nivel de kernel, a fost mutată în biblioteca de bază Rust (core).
  • Codul a fost curățat pentru a scăpa de posibilele avertismente ale compilatorului la construirea nucleului în modul CONFIG_WERROR. Când se construiește codul în Rust, sunt activate moduri suplimentare de diagnosticare a compilatorului și avertismente Clippy linter.
  • Abstracțiile sunt propuse pentru utilizare în codul Rust pentru seqlocks (sequence locks), apeluri inverse pentru gestionarea energiei, I/O Memory (readX/writeX), întreruperi și handlere de fire, GPIO, acces la dispozitive, drivere și acreditări.
  • Instrumentele pentru dezvoltarea driverelor au fost extinse pentru a include mutexuri relocabile, iteratoare de biți, legături simplificate de pointere, diagnosticare îmbunătățită a erorilor și infrastructură independentă de magistrala de date.
  • Lucru îmbunătățit cu link-uri folosind un tip Ref simplificat, bazat pe backend-ul refcount_t, care utilizează API-ul kernel cu același nume pentru numărarea referințelor. Suportul pentru tipurile Arc și Rc furnizate în biblioteca standard alloc a fost eliminat și nu este disponibil în codul executat la nivel de kernel (au fost pregătite opțiuni pentru biblioteca în sine care dezactivează aceste tipuri).
  • Patch-urile includ o versiune a driverului PL061 GPIO, rescrisă în Rust. O caracteristică specială a driverului este că implementarea sa aproape linie cu linie repetă driverul GPIO existent în limbajul C. Pentru dezvoltatorii care doresc să se familiarizeze cu crearea de drivere în Rust, a fost pregătită o comparație linie cu linie care le permite să înțeleagă în ce constructe din Rust este convertit codul C.
  • Principala bază de cod Rust a adoptat rustc_codegen_gcc, un backend rustc pentru GCC care implementează compilarea anticipată (AOT) folosind biblioteca libgccjit. Cu o dezvoltare adecvată a backend-ului, acesta vă va permite să colectați codul Rust implicat în nucleu folosind GCC.
  • Pe lângă ARM, Google și Microsoft, Red Hat și-a exprimat interesul pentru utilizarea limbajului Rust în nucleul Linux. Să reamintim că Google oferă în mod direct suport pentru proiectul Rust pentru Linux, dezvoltă o nouă implementare a mecanismului de comunicare interproces Binder în Rust și ia în considerare posibilitatea de a reelabora diverse drivere în Rust. Microsoft a început să implementeze drivere pentru Hyper-V în Rust. ARM lucrează pentru a îmbunătăți suportul Rust pentru sistemele bazate pe ARM. IBM a implementat suportul Rust în nucleu pentru sistemele PowerPC.

Sursa: opennet.ru

Adauga un comentariu