A opta versiune de patch-uri pentru nucleul Linux cu suport pentru limbajul Rust

Miguel Ojeda, autorul proiectului Rust-for-Linux, a propus spre examinare de către dezvoltatorii nucleului Linux lansarea v8 de componente pentru dezvoltarea driverelor de dispozitive în limbajul Rust. Aceasta este a șaptea revizie a patch-urilor, având în vedere prima variantă, publicată fără număr de versiune. Suportul pentru Rust este considerat experimental, dar este deja inclus în ramura linux-next, aspirând la integrarea în lansarea din toamnă 5.20/6.0 și este suficient de dezvoltat pentru a începe lucrul la crearea unor straturi de abstractizare peste subsistemele nucleului, precum și pentru scrierea driverelor și modulelor. Dezvoltarea este finanțată de Google și organizația ISRG (Internet Security Research Group), care este fondatoarea proiectului Let’s Encrypt și contribuie la promovarea HTTPS și dezvoltarea tehnologiilor pentru îmbunătățirea securității internetului.

În noua versiune:

  • Instrumentarul și varianta bibliotecii alloc, eliminată de posibilele generații de stare „panic” în cazul erorilor, au fost actualizate la lansarea Rust 1.62. Comparativ cu versiunea utilizată anterior, în instrumentarul Rust a fost stabilizată suportul funcționalității const_fn_trait_bound, utilizată în patch-urile pentru nucleu.
  • Codul de legături a fost separat într-un pachet crate «bindings», ceea ce simplifică reconstruirea în cazul modificărilor aduse doar pachetului principal «kernel».
  • Implementarea macro-ului «concat_idents!» a fost rescrisă sub forma unui macro procedural, fără a fi legată de funcționalitatea concat_idents și permițând utilizarea referințelor la variabile locale.
  • Macro-ul «static_assert!» a fost rescris, ceea ce a permis utilizarea «core::assert!()» în orice context, în loc de constante.
  • Macro-ul «build_error!» a fost adaptat pentru a funcționa atunci când se setează pentru module modul „RUST_BUILD_ASSERT_{WARN,ALLOW}”.
  • A fost adăugat un fișier separat cu setările „kernel/configs/rust.config”.
  • Fișierele procesate în macro-substituții «*.i» au fost redenumite în «*.rsi».
  • Suportul pentru construirea componentelor Rust cu niveluri de optimizare diferite de cele aplicate pentru codul în limbajul C a fost oprit.
  • A fost adăugat un modul fs, care oferă legături pentru lucrul cu sistemele de fișiere. A fost propus un exemplu de sistem de fișiere simplu, scris în limbajul Rust.
  • A fost adăugat modulul workqueue pentru a lucra cu cozile de sistem (oferă legături asupra structurilor nucleului work_struct și workqueue_struct).
  • Continuarea dezvoltării modulului kasync cu implementarea metodelor de programare asincronă (async). A fost adăugat un exemplu de server TCP funcționând la nivel de nucleu, scris în Rust.
  • A fost adăugată posibilitatea de a gestiona întreruperi în limbajul Rust prin intermediul trăsăturilor [Threaded]Handler și tipurilor [Threaded]Registration.
  • A fost adăugat macro-ul procedural «#[vtable]», care simplifică lucrul cu tabelele de pointeri la funcții, precum structura file_operations.
  • A fost adăugată implementarea listelor legate bidirecționale «unsafe_list::List».
  • A fost adăugat suport inițial pentru RCU (Read-copy-update) și tipul Guard pentru a verifica legătura blocării pe citire cu firul de execuție curent.
  • A fost adăugată funcția Task::spawn() pentru a crea și a porni automat firele de execuție ale nucleului. De asemenea, a fost adăugat metoda Task::wake_up().
  • A fost adăugat modulul delay, care permite utilizarea întârzierilor (o învelire peste msleep()).

Modificările propuse permit utilizarea Rust ca a doua limbă pentru dezvoltarea driverelor și modulelor de nucleu. Suportul pentru Rust este prezentat ca o opțiune, neactivată în mod implicit și care nu conduce la includerea Rust în lista dependențelor de construire obligatorii ale nucleului. Utilizarea Rust pentru dezvoltarea driverelor va permite crearea, cu eforturi minime, de drivere sigure și de calitate superioară, fără probleme precum accesarea memoriei după eliberare, dereferirea pointerilor nuli și depășirea limitelor bufferului.

Funcționarea sigură a memoriei este asigurată în Rust în timpul compilării prin verificarea referințelor, urmărirea deținerii obiectelor și gestionarea duratei de viață a obiectelor (zona de vizibilitate), precum și prin evaluarea corectitudinii accesului la memorie în timpul execuției codului. Rust oferă, de asemenea, instrumente pentru protecția împotriva depășirilor de numere întregi, necesită inițializarea obligatorie a valorilor variabilelor înainte de utilizare, gestionează mai bine erorile în biblioteca standard, aplică conceptul de referințe și variabile imutabile (immutable) în mod implicit și oferă o tipizare statică puternică pentru a minimiza erorile logice.

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster