Miguel Ojeda, autorul proiectului Rust-for-Linux, a propus dezvoltatorilor nucleului Linux lansarea versiunii 6 a componentelor pentru dezvoltarea driverelor de dispozitive în limbajul Rust. Aceasta este a șaptea ediție a patch-urilor, ținând cont de prima variantă publicată fără numărul versiunii. Suportul pentru Rust este considerat experimental, dar este deja inclus în ramura linux-next și este suficient de avansat pentru a începe lucrările de creare a straturilor de abstractizare deasupra subsistemelor 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:
- Toolkit-ul și versiunea bibliotecii alloc, scăpate de potențialele generații de stare "panic" în cazul apariției erorilor, au fost actualizate la lansarea Rust 1.60, în care a fost stabilizată susținerea modului "maybe_uninit_extra", utilizat în patch-urile pentru nucleu.
- A fost adăugată posibilitatea de a rula teste din documentație (teste utilizate simultan ca exemple în documentație), prin transformarea în timpul compilării testelor legate de API-ul nucleului în teste KUnit care se execută în timpul încărcării nucleului.
- Au fost acceptate cerințele conform cărora testele nu trebuie să genereze avertizări din linterna Clippy, la fel ca și codul pentru nucleu în limbajul Rust.
- O implementare inițială a modulului „net” cu funcții de rețea a fost propusă. Codul scris în limbajul Rust are acces la structuri de rețea din nucleu, precum „Namespace” (bazată pe structura nucleului „struct net”), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) și echivalentele lor pentru IPv6.
- A fost implementat suport inițial pentru metode de programare asincronă (async), realizat sub formă de modul kasync. De exemplu, se poate crea cod care funcționează în mod asincron pentru manipularea TCP-socket-urilor: 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?; } }
- A fost adăugat modulul net::filter pentru manipularea filtrelor pachetelor de rețea. A fost adăugat un exemplu rust_netfilter.rs cu implementarea unui filtru în limbajul Rust.
- A fost adăugată implementarea unui mutex simplu smutex::Mutex, care nu necesită legare (pinning).
- A fost adăugată blocarea NoWaitLock, care nu va duce niciodată la așteptarea eliberării și, în cazul în care este ocupată de un alt fir, va returna o eroare la încercarea de obținere a blocării în loc să blocheze apelantul.
- A fost adăugată blocarea RawSpinLock, echivalentă cu raw_spinlock_t din nucleu, utilizată în secțiuni care nu pot fi în stare de așteptare.
- A fost adăugat tipul ARef pentru referințele la obiect, care aplică mecanismul de numărare a referințelor (always-refcounted).
- În backend-ul rustc_codegen_gcc, care permite utilizarea bibliotecii libgccjit de la proiectul GCC ca generator de cod în rustc pentru a asigura suportul pentru arhitecturile și optimizările disponibile în GCC, a fost implementată posibilitatea de bootstrap al compilatorului rustc. Bootstrap-ul compilatorului se referă la capacitatea de a utiliza un generator de cod bazat pe GCC pentru a construi însăși compilatorul rustc. În plus, în ultima versiune GCC 12.1 au fost incluse corecții în libgccjit necesare pentru funcționarea corectă a rustc_codegen_gcc. Se pregătește posibilitatea de instalare a rustc_codegen_gcc prin intermediul utilitarului rustup.
- Se observă progrese în dezvoltarea front-end-ului GCC gccrs, cu realizarea compilatorului pentru limbajul Rust bazat pe GCC. În prezent, doi dezvoltatori lucrează în mod activ la gccrs.
Reamintim că schimbările propuse permit utilizarea Rust ca a doua limbă pentru dezvoltarea driverelor și modulelor nucleului. Suportul pentru Rust este prezentat ca o opțiune, care nu este activată în mod implicit și nu duce la includerea Rust între dependențele obligatorii pentru compilarea nucleului. Utilizarea Rust pentru dezvoltarea driverelor va permite, cu eforturi minime, crearea de drivere sigure și de calitate superioară, lipsite de probleme precum accesarea memoriei după eliberare, dereferențierea pointerilor nuli și depășirea limitelor buffer-ului.
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
