Miguel Ojeda, autor projektu Rust-for-Linux, zaproponował deweloperom jądra Linux wydanie v8 komponentów do rozwoju sterowników urządzeń w języku Rust. To jest poprawiona wersja poprawek, uwzględniająca pierwszą wersję opublikowaną bez numeru wersji. Wsparcie dla Rust jest traktowane jako eksperymentalne, ale już zostało włączone do gałęzi linux-next, ma szansę na integrację w jesiennym wydaniu 5.20/6.0 i jest wystarczająco rozwinięte, aby rozpocząć prace nad tworzeniem warstw abstrakcji nad podsystemami jądra, a także nad pisaniem 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 poprawiających bezpieczeństwo internetu.
W nowej wersji:
- Narzędzia oraz wersja biblioteki alloc, pozbawiona możliwości generowania stanu „panic” w przypadku błędów, zostały zaktualizowane do wydania Rust 1.62. W porównaniu do wcześniej używanej wersji, w narzędziach Rust ustabilizowano wsparcie dla funkcjonalności const_fn_trait_bound, używanej w łatkach do jądra.
- Kod powiązań został wydzielony do osobnego pakietu crate „bindings”, co ułatwia ponowną kompilację w przypadku wprowadzenia zmian tylko w głównym pakiecie „kernel”.
- Implementacja makra „concat_idents!” została przepisana w formie makra proceduralnego, niezwiązanego z funkcjonalnością concat_idents i dopuszczającego użycie odniesień do lokalnych zmiennych.
- Makro „static_assert!” zostało przepisane, co pozwoliło na użycie „core::assert!()” w dowolnym kontekście zamiast stałych.
- Makro „build_error!” zostało dostosowane do pracy przy ustawianiu dla modułów trybu „RUST_BUILD_ASSERT_{WARN,ALLOW}”.
- Dodano osobny plik konfiguracyjny „kernel/configs/rust.config”.
- Pliki „*.i” przetwarzane w podstawieniach makropodstawowych zostały przemianowane na „*.rsi”.
- Wsparcie dla kompilacji komponentów Rust z poziomami optymalizacji innymi niż te stosowane dla kodu w języku C zostało zakończone.
- Dodano moduł fs, który udostępnia obudowy do pracy z systemami plików. Zaproponowano przykład prostej systemu plików, napisanego w języku Rust.
- Dodano moduł workqueue do pracy z systemami kolejkowymi (udostępnia obudowy nad strukturami jądra work_struct i workqueue_struct).
- Kontynuacja rozwoju modułu kasync z implementacją metod programowania asynchronicznego (async). Dodano przykład działającego na poziomie jądra serwera TCP napisanego w Rust.
- Dodano możliwość obsługi przerwań w języku Rust za pomocą typów [Threaded]Handler i [Threaded]Registration.
- Dodano makro proceduralne «#[vtable]», które upraszcza pracę z tabelami wskaźników na funkcje, takimi jak struktura file_operations.
- Dodano implementację dwukierunkowych list powiązanych «unsafe_list::List».
- Dodano początkowe wsparcie RCU (Read-copy-update) oraz typ Guard do weryfikacji związania blokady na odczyt z bieżącym wątkiem.
- Dodano funkcję Task::spawn() do tworzenia i automatycznego uruchamiania wątków jądra. Dodano również metodę Task::wake_up().
- Dodano moduł delay, umożliwiający wykorzystanie opóźnień (owijka nad msleep()).
Proponowane zmiany umożliwiają korzystanie z Rust jako drugiego języka do opracowywania sterowników i modułów jądra. Wsparcie dla Rust jest prezentowane jako opcja, nieaktywna domyślnie i nie prowadząca do włączenia Rust do obowiązkowych zależności kompilacji jądra. Użycie Rust do opracowywania sterowników pozwoli przy minimalnym wysiłku tworzyć bezpieczne i lepszej jakości sterowniki, pozbawione problemów takich jak dostęp do obszaru pamięci po jej zwolnieniu, dereferencja wskaźników zerowych oraz wyjście poza granice 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.
Źródło: opennet.ru
