Miguel Ojeda, autor projektu Rust-for-Linux, zaproponował programistom jądra Linux piątą wersję komponentów do tworzenia sterowników urządzeń w języku Rust. Wsparcie dla Rust traktowane jest jako eksperymentalne, ale już zostało włączone do gałęzi linux-next i jest wystarczająco rozwinięte, aby rozpocząć prace nad tworzeniem warstw abstrakcji nad subsystemami jądra oraz pisaniem sterowników i modułów. Rozwój jest finansowany przez firmę Google i organizację ISRG (Internet Security Research Group), która jest założycielem projektu Let’s Encrypt i wspiera promocję 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 poprawek kontynuowano usuwanie uwag zgłoszonych podczas dyskusji na temat pierwszej, drugiej, trzeciej i czwartej edycji poprawek. W nowej wersji:
- W systemie ciągłej integracji opartym na wspieranym przez firmę Intel bocie 0DAY/LKP dodano testowanie komponentów wspierających Rust, a także rozpoczęto publikację raportów z testów. Przygotowywana jest integracja wsparcia dla Rust w systemie automatycznych testów KernelCI. Testy bazujące na GitHub CI zostały przeprowadzone z wykorzystaniem kontenerów.
- Moduły jądra w Rust nie muszą już definiować atrybutów crate „#![no_std]” i „#![feature(…)]”.
- Dodano wsparcie dla pojedynczych celów budowania (.o, .s, .ll i .i).
- W zaleceniach dotyczących formatowania kodu określono zasady dotyczące rozdzielania komentarzy („//”) i dokumentowania kodu („///”).
- Przebudowano skrypt is_rust_module.sh.
- Dodano wsparcie dla statycznych (globalnych) wspólnych zmiennych, opartych na implementacji „CONFIG_CONSTRUCTORS”.
- Ułatwiono zarządzanie blokadami: Guard i GuardMut zostały połączone w jeden parametryzowany typ.
- Umożliwiono definiowanie dodatkowych parametrów podczas rejestracji urządzeń.
- Dodano abstrakcję „RwSemaphore”, działającą jako opakowanie nad strukturą C rw_semaphore.
- Dodano nowy moduł mm oraz abstrakcję VMA (opakowanie nad strukturą vm_area_struct) do użycia mmap.
- Sterownik GPIO PL061 został przekształcony w celu wykorzystania makra „dev_*!”.
- Przeprowadzono ogólną czyszczenie kodu.
Źródło: opennet.ru
