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

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

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster