Miguel Ojeda, autor projektu Rust-for-Linux, zaproponował wydanie komponentów v8 do tworzenia sterowników urządzeń w języku Rust do rozważenia przez twórców jądra Linuksa. Jest to poprawiona wersja poprawek, uwzględniająca wersję pierwszą, opublikowana bez numeru wersji. Obsługa Rusta jest uważana za eksperymentalną, ale jest już uwzględniona w gałęzi Linux-next, rzekomo zintegrowana z jesienną wersją 5.20/6.0 i jest na tyle dojrzała, że można rozpocząć prace nad tworzeniem warstw abstrakcji na podsystemach jądra, a także pisać sterowniki i moduły. Rozwój jest finansowany przez Google i ISRG (Internet Security Research Group), która jest założycielem projektu Let's Encrypt i promuje HTTPS oraz rozwój technologii poprawiających bezpieczeństwo w Internecie.
W nowej wersji:
- Zestaw narzędzi i wariant biblioteki alloc, pozbawiony możliwości generowania stanu „paniki” w przypadku wystąpienia błędów, zostały zaktualizowane w wydaniu Rust 1.62. W porównaniu do poprzednio używanej wersji, pakiet narzędzi Rust ustabilizował obsługę funkcjonalności const_fn_trait_bound używanej w łatkach jądra.
- Kod wiązania jest podzielony na oddzielny pakiet skrzyniowy „bindings”, co upraszcza przebudowę, jeśli zmiany zostaną wprowadzone tylko w głównym pakiecie „jądro”.
- Implementacja makra „concat_idents!” przepisany w formie makra proceduralnego, które nie jest powiązane z funkcjonalnością concat_idents i pozwala na użycie odniesień do zmiennych lokalnych.
- Makro „static_assert!” zostało przepisane, umożliwiając użycie „core::assert!()” w dowolnym kontekście zamiast stałych.
- Makro „build_error!” przystosowany do pracy, gdy dla modułów ustawiony jest tryb „RUST_BUILD_ASSERT_{WARN,ALLOW}”.
- Dodano osobny plik z ustawieniami „kernel/configs/rust.config”.
- Nazwy plików „*.i” przetwarzanych w podstawieniach makr zostały zmienione na „*.rsi”.
- Zakończono wsparcie dla budowania komponentów Rusta z poziomami optymalizacji innymi niż te stosowane w kodzie C.
- Dodano moduł fs, który zapewnia powiązania do pracy z systemami plików. Podano przykład prostego systemu plików napisanego w języku Rust.
- Dodano moduł workqueue do pracy z kolejkami systemowymi (zapewnia powiązania ze strukturami jądra work_struct i workqueue_struct).
- Kontynuacją rozwoju modułu kasync było wdrożenie metod programowania asynchronicznego (async). Dodano przykład podstawowego serwera TCP napisanego w języku Rust.
- Dodano możliwość obsługi przerwań w języku Rust przy użyciu typów [Threaded]Handler i [Threaded]Registration.
- Dodano makro proceduralne „#[vtable]”, aby ułatwić pracę z tabelami wskaźników funkcji, takimi jak struktura operacji na plikach.
- Dodano implementację dwukierunkowych list połączonych „unsafe_list::List”.
- Dodano początkową obsługę RCU (aktualizacja-kopia-odczyt) i typu Guard, aby sprawdzić, czy blokada odczytu jest powiązana z bieżącym wątkiem.
- Dodano funkcję Task::spawn() do tworzenia i automatycznego uruchamiania wątków jądra. Dodano także metodę Task::wake_up().
- Dodano moduł opóźnienia, który pozwala na użycie opóźnień (opakowanie na msleep()).
Proponowane zmiany umożliwiają wykorzystanie Rusta jako drugiego języka do tworzenia sterowników i modułów jądra. Obsługa Rusta jest prezentowana jako opcja, która nie jest domyślnie włączona i nie powoduje uwzględnienia Rusta jako wymaganej zależności kompilacji jądra. Używanie Rusta do programowania sterowników umożliwi tworzenie bezpieczniejszych i lepszych sterowników przy minimalnym wysiłku, wolnych od problemów, takich jak dostęp do pamięci po zwolnieniu, wyłuskiwanie wskaźników zerowych i przepełnienie bufora.
Bezpieczna obsługa pamięci w Rust jest zapewniona w czasie kompilacji poprzez sprawdzanie referencji, śledzenie własności obiektu i czasu życia obiektu (zakres), a także poprzez ocenę poprawności dostępu do pamięci podczas wykonywania kodu. Rust zapewnia również ochronę przed przepełnieniami liczb całkowitych, wymaga obowiązkowej inicjalizacji wartości zmiennych przed użyciem, lepiej radzi sobie z błędami w standardowej bibliotece, domyślnie stosuje koncepcję niezmiennych odniesień i zmiennych, oferuje silne typowanie statyczne w celu zminimalizowania błędów logicznych.
Źródło: opennet.ru