Trzecia edycja łatek dla jądra Linuksa z obsługą języka Rust

Miguel Ojeda, autor projektu Rust-for-Linux, zaproponował trzecią opcję komponentu do tworzenia sterowników urządzeń w języku Rust do rozważenia przez programistów jądra Linuksa. Obsługa Rusta jest uważana za eksperymentalną, ale została już uzgodniona w celu włączenia jej do gałęzi Linux-next. 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.

Przypomnijmy, że 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 dla 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.

Nowa wersja łatek w dalszym ciągu eliminuje komentarze powstałe podczas dyskusji na temat pierwszej i drugiej wersji łatek. Najbardziej zauważalne zmiany:

  • Dokonano przejścia na używanie stabilnej wersji Rusta 1.57 jako kompilatora referencyjnego i udostępniono link do ustabilizowanej edycji języka Rust 2021. Wcześniej poprawki były powiązane z gałęzią beta Rusta i wykorzystywały pewne funkcje językowe, które zostały sklasyfikowane jako niestabilne. Przejście na specyfikację Rust 2021 pozwoliło nam rozpocząć prace nad uniknięciem stosowania w łatkach takich niestabilnych funkcji jak const_fn_transmute, const_panic, const_unavailable_unchecked oraz core_panic i try_reserve.
  • Kontynuowano rozwój wersji alloc biblioteki Rust zawartej w łatkach, zmodyfikowanej w celu wyeliminowania funkcji alokacji pamięci z możliwego generowania stanu „paniki” w przypadku wystąpienia błędów, takich jak brak pamięci. Nowa wersja implementuje opcje „no_rc” i „no_sync”, aby wyłączyć funkcje nieużywane w kodzie Rusta jądra, czyniąc bibliotekę bardziej modułową. Trwają prace z głównymi programistami alloc, mające na celu przeniesienie niezbędnych zmian w jądrze do biblioteki głównej. Opcja „no_fp_fmt_parse”, wymagana do działania biblioteki na poziomie jądra, została przeniesiona do podstawowej biblioteki Rust (core).
  • Kod został oczyszczony, aby pozbyć się możliwych ostrzeżeń kompilatora podczas budowania jądra w trybie CONFIG_WERROR. Podczas budowania kodu w Rust włączane są dodatkowe tryby diagnostyczne kompilatora i ostrzeżenia o lintrze Clippy.
  • Proponuje się abstrakcje do wykorzystania w kodzie Rusta dla seqlocków (blokad sekwencyjnych), wywołań zwrotnych do zarządzania energią, pamięci we/wy (readX/writeX), obsługi przerwań i wątków, GPIO, dostępu do urządzeń, sterowników i poświadczeń.
  • Narzędzia do tworzenia sterowników zostały rozszerzone o relokowalne muteksy, iteratory bitowe, uproszczone wiązania wskaźników, ulepszoną diagnostykę błędów i infrastrukturę niezależną od magistrali danych.
  • Usprawniona praca z linkami wykorzystującymi uproszczony typ Ref, bazująca na backendie refcount_t, który do zliczania referencji wykorzystuje API jądra o tej samej nazwie. Obsługa typów Arc i Rc udostępniona w standardowej bibliotece alloc została usunięta i nie jest dostępna w kodzie wykonywanym na poziomie jądra (dla samej biblioteki przygotowano opcje wyłączające te typy).
  • Łatki zawierają wersję sterownika GPIO PL061, przepisaną w języku Rust. Cechą szczególną sterownika jest to, że jego implementacja niemal linia po linii powtarza istniejący sterownik GPIO w języku C. Dla programistów chcących zapoznać się z tworzeniem sterowników w Ruście przygotowano porównanie linijka po linijce, które pozwala zrozumieć, na jakie konstrukcje w Ruście konwertowany jest kod C.
  • Główna baza kodu Rusta przyjęła rustc_codegen_gcc, backend rustc dla GCC, który implementuje kompilację z wyprzedzeniem (AOT) przy użyciu biblioteki libgccjit. Przy odpowiednim rozwoju backendu, pozwoli Ci to na zebranie kodu Rusta związanego z jądrem za pomocą GCC.
  • Oprócz ARM, Google i Microsoft, Red Hat wyraził zainteresowanie użyciem języka Rust w jądrze Linuksa. Przypomnijmy, że Google bezpośrednio zapewnia wsparcie dla projektu Rust for Linux, opracowuje nową implementację mechanizmu komunikacji międzyprocesowej Binder w Rust i rozważa możliwość przerobienia różnych sterowników w Rust. Microsoft rozpoczął wdrażanie sterowników dla Hyper-V w Rust. ARM pracuje nad ulepszeniem obsługi Rusta dla systemów opartych na ARM. IBM zaimplementował obsługę Rusta w jądrze systemów PowerPC.

Źródło: opennet.ru

Dodaj komentarz