Miguel Ojeda, autor projektu Rust-for-Linux, zaproponował deweloperom jądra Linux czwarty zestaw komponentów do tworzenia sterowników urządzeń w języku Rust. Wsparcie dla Rust jest traktowane jako eksperymentalne, ale zostało już zatwierdzone do włączenia do gałęzi linux-next i jest wystarczająco rozwinięte, aby rozpocząć prace nad tworzeniem warstw abstrakcji nad subsystemami jądra, a także do pisania sterowników i modułów. Rozwój jest finansowany przez firmę Google oraz organizację ISRG (Internet Security Research Group), która jest założycielem projektu Let's Encrypt i wspiera promowanie HTTPS oraz rozwój technologii zwiększających bezpieczeństwo internetu.
Przypomnijmy, że proponowane zmiany umożliwiają użycie Rust jako drugiego języka do tworzenia sterowników i modułów jądra. Obsługa Rust jest przedstawiana jako opcja, nieaktywna domyślnie i nie prowadząca do włączenia Rust do obowiązkowych zależności kompilacyjnych jądra. Użycie Rust do tworzenia sterowników pozwoli na minimalnym wysiłku tworzyć bezpieczne i lepszej jakości sterowniki, wolne od problemów takich jak odwołania do zwolnionej pamięci, dereferencja wskaźników null oraz przekroczenia granic bufora.
Bezpieczna praca z pamięcią w języku Rust jest zapewniana w czasie kompilacji poprzez sprawdzanie referencji, śledzenie własności obiektów oraz uwzględnianie czasu życia obiektów (zakresu widoczności), a także poprzez ocenę poprawności dostępu do pamięci w czasie wykonywania kodu. Rust zapewnia również środki ochrony przed przepełnieniami wartości całkowitych, wymaga obowiązkowego inicjowania wartości zmiennych przed ich użyciem, lepiej obsługuje błędy w standardowej bibliotece, stosuje koncepcję niezmienności (immutable) referencji i zmiennych domyślnie oraz oferuje silną statyczną typizację w celu minimalizacji błędów logicznych.
W nowej wersji łat wciąż kontynuowane są poprawki uwag zgłoszonych w trakcie dyskusji nad pierwszą, drugą i trzecią wersją łatek. W nowej wersji:
- Dokonano przejścia na stosowanie stabilnej wersji kompilatora Rust 1.58.0 jako wersji referencyjnej. Wśród niezbędnych zmian w projekcie, które jeszcze nie zostały włączone do głównego zestawu narzędzi Rust, wyróżnione są flaga „-Zsymbol-mangling-version=v0” (oczekiwana w Rust 1.59.0) oraz tryb „maybe_uninit_extra” (oczekiwany w Rust 1.60.0).
- Dodano automatyczne sprawdzanie dostępności odpowiednich narzędzi Rust oraz rozszerzono możliwości testowania wsparcia Rust w systemie.
- Proponowane są nowe abstrakcje do dostępu z kodu w języku Rust do tabel identyfikatorów urządzeń („IdArray” i „IdTable”).
- Dodano warstwy do wywoływania funkcji związanych z zegarem (clok framework).
- Sterowniki dla platform są teraz definiowane poprzez realizację typów.
- Dodano nowy makro do uproszczenia rejestracji sterowników platform oraz zaproponowano nowy szablon typowego sterownika.
- Dodano makra dla struktur „dev_*”.
- Dodano metody „{read,write}*_relaxed” dla typu IoMem.
- Usunięto właściwość FileOpener dla uproszczenia operacji na plikach.
- Do argumentów przekazywanych podczas rejestracji sterownika dodano parametr „ThisModule”.
- Proponowany jest typowy szablon do tworzenia modułów jądra w języku Rust.
Źródło: opennet.ru
