Trzecia edycja poprawek dla jądra Linux z wsparciem dla języka Rust.

Miguel Ojeda, autor projektu Rust-for-Linux, zaproponował dla programistów jądra Linux trzecią wersję komponentów do tworzenia sterowników urządzeń w języku Rust. Wsparcie dla Rust jest traktowane jako eksperymentalne, ale już zatwierdzone do włączenia do gałęzi linux-next. 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 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 kontynuowane jest usuwanie uwag przekazanych podczas dyskusji o pierwszej i drugiej wersji poprawek. Najważniejsze zmiany to:

  • Dokonano przejścia na użycie stabilnego wydania kompilatora Rust 1.57 jako wzoru, a także zapewnionowiązanie do ustabilizowanej wersji języka Rust 2021. Wcześniej poprawki były związane z wersją beta Rust i wykorzystywały niektóre funkcje języka, które zaliczają się do kategorii niestabilnych. Przejście na specyfikację Rust 2021 umożliwiło zainicjowanie pracy nad eliminacją z poprawek takich niestabilnych możliwości, jak const_fn_transmute, const_panic, const_unreachable_unchecked oraz core_panic i try_reserve.
  • Kontynuowane są prace nad wersją biblioteki Rust alloc wchodzącą w skład poprawek, zmodyfikowanej w celu wyeliminowania funkcji alokacji pamięci, które mogłyby generować stany 'panic' w przypadku wystąpienia błędów, takich jak brak pamięci. W nowej wersji wprowadzone zostały opcje 'no_rc' i 'no_sync' w celu wyłączenia funkcjonalności, które nie są używane w kodzie Rust dla jądra, co czyni bibliotekę bardziej modułową. Prace toczą się z głównymi programistami alloc, mające na celu przeniesienie niezbędnych zmian dla jądra do głównej wersji biblioteki. Do podstawowej biblioteki Rust (core) dodana została opcja 'no_fp_fmt_parse', niezbędna do działania biblioteki na poziomie jądra.
  • Przeprowadzono czyszczenie kodu w celu eliminacji możliwych ostrzeżeń kompilatora podczas kompilacji jądra w trybie CONFIG_WERROR. Podczas kompilacji kodu w języku Rust włączono dodatkowe tryby diagnostyczne kompilatora oraz ostrzeżenia linterna Clippy.
  • Zaproponowano abstrakcje do wykorzystania w kodzie w języku Rust dla blokad seqlock (blokady sekwencyjne), wywołań zwrotnych do zarządzania zasilaniem, pamięci I/O (readX/writeX), obsługi przerwań i wątków, GPIO, dostępu do urządzeń, sterowników i danych uwierzytelniających.
  • Rozszerzono narzędzia do tworzenia sterowników z wykorzystaniem przenośnych mutexów, bitowych iteratorów, uproszczonych opakowań dla wskaźników, ulepszonej diagnostyki awarii oraz infrastruktury niezależnej od magistrali danych.
  • Udoskonalono pracę z odniesieniami dzięki uproszczonemu typowi Ref, opartemu na backendzie refcount_t, korzystającemu z identycznego API jądra do zliczania odniesień. Wsparcie dla typów Arc i Rc, dostarczanych w standardowej bibliotece alloc, zostało usunięte i nie jest dostępne w kodzie działającym na poziomie jądra (dla samej biblioteki przygotowano opcje wyłączające te typy).
  • Do zestawu patchy dodano wersję sterownika PL061 GPIO, przepisany na Rust. Cechą wyróżniającą sterownika jest to, że jego implementacja praktycznie linijka po linijce powtarza istniejący sterownik GPIO w języku C. Dla programistów, którzy chcą zapoznać się z tworzeniem sterowników w Rust, przygotowano porównanie linijne, które pozwala zrozumieć, w jakie konstrukcje w Rust przekształcono kod w C.
  • Do głównej bazy kodu Rust włączono rustc_codegen_gcc, backend rustc dla GCC, który realizuje możliwość kompilacji wstępnej (AOT) z wykorzystaniem biblioteki libgccjit. Przy odpowiednim rozwoju backendu będzie on umożliwiał kompilację kodu Rust używanego w jądrze za pomocą GCC.
  • Oprócz firm ARM, Google i Microsoft, zainteresowanie wykorzystaniem języka Rust w jądrze Linux wyraziła firma Red Hat. Przypomnijmy, że Google bezpośrednio wspiera projekt Rust for Linux, rozwija nową implementację mechanizmu międzyprocesowej komunikacji Binder w Rust oraz rozważa przerobienie różnych sterowników na Rust. Firma Microsoft rozpoczęła realizację sterowników dla Hyper-V w Rust. Firma ARM pracuje nad poprawą wsparcia dla Rust w systemach opartych na procesorach ARM. Firma IBM zrealizowała wsparcie Rust w jądrze dla systemów PowerPC.

Ź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