Google rescrie Binder-ul Android în Rust cu rezultate promițătoare

Inginerii Google au postat miercuri un set inițial de patch-uri „request for comments” care reimplementează codul Binder al Android în cadrul nucleului Linux în limbajul de programare Rust și nu în C.

Binder rămâne o piesă critică a pachetului de software al Android și, pentru a crește robustețea și securitatea, Google urmărește o rescriere a codului C în Rust. Binder este responsabil de comunicarea între procese (IPC) și de alte sarcini pe Android, iar înlocuirea acestuia cu codul Rust, sigur pentru memorie, ar trebui să reprezinte un mare pas înainte pentru securitatea sistemului.

Binder a devenit incredibil de complex de întreținut și de dezvoltat în continuare și este esențial pentru strategia de sandboxing a Android.
„Este #1 (complexitatea ridicată) care a făcut ca evoluția continuă a Binder și rezolvarea #2 („tech debt”) să fie excepțional de dificilă fără a cauza #3 (probleme de securitate). Pentru ca Binder să continue să satisfacă nevoile Android, avem nevoie de modalități mai bune de a gestiona (și de a reduce!) complexitatea fără a crește riscul.

Cea mai mare schimbare este, evident, alegerea limbajului de programare. Am decis să folosim Rust deoarece abordează direct o serie de provocări din cadrul Binder cu care ne-am confruntat în ultimii ani. Acesta previne greșelile de numărare a ref, de blocare, de verificare a limitelor și, de asemenea, face multe pentru a reduce complexitatea gestionării erorilor. În plus, am reușit să folosim un sistem de tipuri mai expresiv pentru a codifica semantica proprietății diverselor structuri și pointeri, ceea ce ia din mâinile programatorului complexitatea gestionării duratei de viață a obiectelor, reducând riscul de utilizare după ce se eliberează și alte probleme similare.

Rust are multe tipuri diferite de pointeri pe care le folosește pentru a codifica semantica proprietății în sistemul de tipuri, iar acesta este probabil unul dintre cele mai importante aspecte ale modului în care ajută în Binder. Driverul Binder are o mulțime de obiecte diferite care au o semantică complexă a proprietății; unii pointeri dețin un refcount, unii pointeri au proprietate exclusivă, iar unii pointeri doar fac referire la obiect și acesta este menținut în viață într-un alt mod. Cu Rust, putem utiliza un tip de pointer diferit pentru fiecare tip de pointer, ceea ce permite compilatorului să impună faptul că semantica proprietății este implementată corect.

O altă caracteristică utilă este gestionarea erorilor în Rust. Rust permite o gestionare mai simplificată a erorilor cu caracteristici precum destructori, iar în cazul în care erorile nu sunt gestionate corespunzător, se produc erori de compilare. Acest lucru înseamnă că, deși Rust vă cere să cheltuiți mai multe linii de cod decât C pentru lucruri precum scrierea invarianților care sunt lăsate implicite în C, driverul Rust este totuși puțin mai mic decât liantul C: Rust este de 5,5kLOC, iar C este de 5,8kLOC. (Aceste cifre exclud liniile goale, comentariile, binderfs și orice facilități de depanare din C care nu sunt încă implementate în driverul Rust. Numerele includ abstracțiunile din rust/kernel/ care este puțin probabil să fie utilizate de alte drivere decât Binder).

Deși această rescriere regândește complet modul în care este structurat codul și modul în care sunt aplicate ipotezele, nu schimbăm în mod fundamental *modul* în care driverul face lucrurile pe care le face. O mulțime de gânduri atente au fost puse în proiectarea existentă. Rescrierea vizează mai degrabă îmbunătățirea sănătății codului, a structurii, a lizibilității, a robusteții, a securității, a mentenanței și a extensibilității. De asemenea, includem mai multă documentație în linie și îmbunătățim modul în care sunt puse în aplicare ipotezele din cod. În plus, tot codul nesigur este adnotat cu un comentariu SAFETY care explică de ce este corect.

Am lăsat componenta de sistem de fișiere binderfs în C. Rescrierea acesteia în Rust ar necesita o cantitate mare de muncă și o mulțime de legături cu interfețele sistemului de fișiere. Binderfs nu a avut în mod istoric aceleași provocări cu securitatea și complexitatea, astfel încât rescrierea binderfs pare să aibă o valoare mai mică decât restul Binder.”

Aflați mai multe despre implementarea Rust’ed Binder prin intermediul acestui anunț RFC de pe lista de discuții a kernelului Linux.

Binder scris în Rust trece toate testele de corectitudine a Binder în contextul proiectului Android Open-Source. Codul Rust poate produce un dispozitiv care pornește și funcționează. Cu excepția unor caracteristici de depanare, versiunea Rust implementează toate caracteristicile implementării Binder în C.

Testele de referință IPC ale Rust Binder arată rezultate promițătoare în comparație cu implementarea C Binder, dar mai trebuie să se efectueze teste suplimentare cu sarcini de lucru din lumea reală. Cel puțin în cadrul unui criteriu de referință privind randamentul Binder, versiunea Rust se situează la +/- 2% față de versiunea C.

Via: phoronix.com

Translated with www.DeepL.com/Translator (free version)