Ósma wersja łatek dla jądra Linux z obsługą języka Rust

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

Dodaj komentarz