Miguel Ojeda, autor projektu Rust-for-Linux, zaproponował do rozważenia przez twórców jądra Linuksa piątą wersję komponentów do tworzenia sterowników urządzeń w języku Rust. Obsługa Rusta jest uważana za eksperymentalną, ale jest już zawarta w gałęzi Linux-next i jest wystarczająco rozwinięta, aby 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.
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, drugiej, trzeciej i czwartej edycji łatek. W nowej wersji:
- Do systemu ciągłej integracji opartego na wspieranym przez firmę Intel bocie 0DAY/LKP dodano testowanie komponentów pod kątem obsługi Rusta i rozpoczęto publikację raportów z testów. Przygotowujemy się do integracji obsługi Rusta z systemem automatycznego testowania KernelCI. Testowanie w oparciu o GitHub CI zostało przeniesione na wykorzystanie kontenerów.
- Moduły jądra Rust są wolne od konieczności definiowania atrybutów skrzynek „#![no_std]” i „#![feature(…)]”.
- Dodano obsługę pojedynczych obiektów docelowych zestawu (.o, .s, .ll i .i).
- Wytyczne dotyczące kodu definiują zasady oddzielania komentarzy („//”) i dokumentowania kodu („///”).
- Skrypt is_rust_module.sh został przerobiony.
- Dodano obsługę prymitywów synchronizacji statycznej (globalna zmienna współdzielona) w oparciu o implementację „CONFIG_CONSTRUCTORS”.
- Zarządzanie zamkami jest uproszczone: Guard i GuardMut są połączone i mają jeden sparametryzowany typ.
- Podczas rejestracji urządzeń istnieje możliwość zdefiniowania dodatkowych parametrów.
- Dodano abstrakcję „RwSemaphore”, która działa jak opakowanie na strukturę rw_semaphore C.
- Aby móc korzystać z mmap, dodano nowy moduł mm i abstrakcję VMA (opakowanie na strukturę vm_area_struct).
- Sterownik GPIO PL061 został przekonwertowany do obsługi makra „dev_*!”.
- Przeprowadzono ogólne porządkowanie kodu.
Źródło: opennet.ru