Framework do pisania bezpiecznych sterowników dla jądra Linuksa w Rust

Josh Triplett, który pracuje w firmie Intel i jest członkiem komisji nadzorującej rozwój Crates.io, przemawia na szczycie technologii Open Source wprowadzono grupa robocza mająca na celu zrównanie języka Rust z językiem C w dziedzinie programowania systemów.

W grupie roboczej, która jest w trakcie tworzenia, programiści Rusta wraz z inżynierami z Intela przygotują specyfikacje określające funkcjonalność, którą należy zaimplementować w Rust do programowania systemów. Programowanie systemu często wymaga manipulacji na niskim poziomie, takich jak wykonywanie instrukcji procesora uprzywilejowanego i uzyskiwanie szczegółowych informacji o stanie procesora. Spośród podobnych funkcji już opracowanych dla Rusta zauważono obsługę nienazwanych struktur, unii, wstawek w języku asemblera (makro „asm!”) i formatu liczb zmiennoprzecinkowych BFLOAT16.

Josh uważa, że ​​przyszłość programowania systemowego należy do Rusta, a język C we współczesnych realiach zajmuje miejsce, które w ubiegłych latach zajmował Assembly. Rdza
nie tylko uwalnia programistów od problemów właściwych językowi C, które powstają w wyniku pracy na niskim poziomie z pamięcią, ale także zapewnia możliwość wykorzystania jej w rozwoju nowoczesnych paradygmatów programowania.

Podczas dyskusje występy
Josh wpadł na pomysł dodania możliwości rozwijania sterowników w jądrze Linuksa w języku Rust, co umożliwiłoby tworzenie bezpieczniejszych i lepszych sterowników przy minimalnym wysiłku, wolnych od problemów takich jak dostęp do pamięci po zwolnieniu, null dereferencje wskaźników i przepełnienia bufora.

Greg Kroah-Hartman odpowiedzialny za utrzymanie stabilnej gałęzi jądra Linuksa wyraził gotowość dodania do jądra frameworku do tworzenia sterowników w języku Rust, jeśli będzie on miał realną przewagę nad C, np. zapewni bezpieczne powiązania przez API jądra. Ponadto Greg uważa ten framework jedynie za opcję, domyślnie nieaktywną, aby nie uwzględniać Rusta jako zależności kompilacji od jądra.

Okazało się, że w tym kierunku pracuje już kilka zespołów. Na przykład programiści z firmy „Fish in a Barrel” przygotowany zestaw narzędzi do pisania ładowalnych modułów dla jądra Linuksa w języku Rust, wykorzystujący zestaw abstrakcyjnych warstw na interfejsach i strukturach jądra w celu zwiększenia bezpieczeństwa. Warstwy są generowane automatycznie na podstawie istniejących plików nagłówkowych jądra za pomocą narzędzia wiązać. Clang służy do budowania warstw. Oprócz warstw pośrednich zmontowane moduły korzystają z pakietu staticlib.

Równoległy rozwija się Kolejny projekt skupiał się na opracowaniu sterowników dla systemów wbudowanych i urządzeń IoT, który wykorzystuje również bindgen do generowania warstw w oparciu o pliki nagłówkowe jądra. Framework pozwala na poprawę bezpieczeństwa sterowników bez dokonywania zmian w jądrze - zamiast tworzyć dodatkowe poziomy izolacji sterowników w jądrze, zaproponowano blokowanie problemów na etapie kompilacji, wykorzystując bezpieczniejszy język Rust. Zakłada się, że takie podejście może być pożądane przez producentów sprzętu opracowujących w pośpiechu autorskie sterowniki bez przeprowadzenia odpowiedniego audytu.

Nie cała zamierzona funkcjonalność została jeszcze zaimplementowana, ale framework już w miarę nadaje się do pracy i posłużył do napisania działającego sterownika dla kontrolera LAN9512 USB Ethernet znajdującego się na płytce Raspberry Pi 3. Istniejący sterownik smsc95xx, napisany przez inż. Język C. Należy zauważyć, że rozmiar modułu i narzut związany z komponentami wykonawczymi podczas opracowywania sterownika w Rust są nieznaczne, co pozwala na użycie frameworka dla urządzeń o ograniczonych zasobach.

Źródło: opennet.ru

Dodaj komentarz