Czy kiedykolwiek zastanawiałeś się, jak Linux może obsługiwać aplikacje działające w czasie rzeczywistym? Jest to możliwe za pomocą tzw. PREEMPT_RT, czyli zestawu patchy, który przekształca jądro Linuksa w kluczowy element składający się na prawdziwego RTOSa.
Przyjrzyjmy się, czym jest PREEMPT_RT, jakie są jego praktyczne zastosowania, jak zbudować jądro Linuksa z PREEMPT_RT i kiedy zostanie w końcu zmergowany do głównego drzewa kernela.
Czym jest PREEMPT_RT?
PREEMPT_RT jest zestawem poprawek (pod postacią patchy) dla jądra Linux, które zwiększają jego możliwości obsługi zadań w czasie rzeczywistym. Jednym z głównych celów jest umożliwienie kernelowi efektywnego przerywania zadań czyli tzw. preemption.
To sformuowanie oznacza, że zadania o wyższym priorytecie mogą przerywać wykonywanie zadania o niższym priorytecie, nawet podczas sekcji krytycznych. Sekcja krytyczna w systemie operacyjnym czasu rzeczywistego to sekcja kodu, która uzyskuje dostęp do współdzielonego zasobu i musi być wykonywana natychmiastowo (z punktu widzenia reszty systemu), aby zapewnić integralność danych. Ma to kluczowe znaczenie dla aplikacji wymagających deterministycznego zachowania, np. system kontroli lotu w satelicie.
W przeciwieństwie do innych metod, które często opierają się na uruchamianiu „co-kernela” wraz z jądrem Linux, PREEMPT_RT modyfikuje samo jądro. Jest to zdecydowanie wygodniejsze i łatwiejsze do integracji rozwiązanie.
Przykład co-kernela, który jest uruchamiany razem z „normalnym” kernelem: https://www.cs.ru.nl/lab/xenomai/api3/group__cobalt__core.html
RTOS są powszechnie stosowanie między innymi w branżach takich jak:
- Urządzenia medyczne
- Automatyka przemysłowa
- Produkcja audio
- Telekomunikacja
Budowanie real-time kernela – źródła
Obecnie odpowiednie patche dla kernela można ściągnąć z oficjalnych źródeł:
https://cdn.kernel.org/pub/linux/kernel/projects/rt
Ich integracja nie jest zbyt wygodna – na szczęście zostały stworzone drzewa projektu kernela, w których te zmiany zostały już zaaplikowane i są gotowe do zbudowania:
https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git
Budowanie dla Raspberry Pi
Poświęciłem sporo czasu, żeby znaleźć jak najprostszy sposób na zintegrowanie ficzerów real-time z kernelem skonfigurowanym dla Raspberry Pi. Najlepsze źródło, jakie udało mi się znaleźć to repozytorium użytkownika remusmp: https://github.com/remusmp/rpi-rt-kernel
Jest to świetny przykład, jak można elegancko zintegrować PREEMPT_RT, tak by budowanie z perspektywy użytkownika było jak najprostsze.
Budowanie jest bardzo proste, wystarczy ściągnąć repozytorium i wywołać polecenie make. Następnie za pomocą konterera Dockera zbuduje nam się kernel wraz z całą resztą potrzebnych bibliotek, w tym z patchami real-time. Potem wystarczy rozpakować wygenerowany obraz, wrzucić na kartę SD i podłączyć RPi do zasilania. Jedyna zmiana jaką wprowadziłem to zamienienie budowania w Makefile z domyślnego Raspberry Pi 5 na Raspberry Pi 4.
Poniżej lista poleceń:
git clone https://github.com/remusmp/rpi-rt-kernel.git
cd rpi-rt-kernel/
### Zmiana Makefile ###
make
### Rozpakowanie i wgranie
cd build/
unzip raspios_lite_arm64-Pi4.zip
sudo dd if=raspios_lite_arm64 of=/dev/<KARTA_SD> status=progress && sync
Na koniec jedna uwaga: wg. readme projektu SSH jest domyślnie skonfigurowane i da się przez nie połączyć od razu po wgraniu i włączeniu zasilania. W moim przypadku tak nie było, sprawdziłem poprawność budowania i instalacji podłączając kabel HDMI oraz klawiaturę do Raspberry.
Sprawdzić wersję kernela możemy przez polecenie uname (pojawi się w nim człon PREEMPT_RT):
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.10.95-rt61-rc1-v8+ #1 SMP PREEMPT_RT
Przyszłość
W najbliższym czasie wsparcie dla PREEMPT_RT najprawdopodobniej zostanie wprowadzone do głównego drzewa kernela. To będzie oznaczać prostszą konfigurację i lepsze wsparcie całego projektu. Z pewnością przyczyni się to również do zwiększenia popularności Linux Kernela w zastosowaniach real-time. Choć należy pamiętać, że najbardziej zaawansowane systemy wymagające certyfikacji raczej będą korzystały z innych rozwiązań.
Dodatkowe materiały
Dyskusję o tym czego brakuje w obecnej implementacji PREEMPT_RT znajdziesz tutaj: https://lore.kernel.org/lkml/20240906111841.562402-1-bigeasy@linutronix.de/
Świetna prezentacja o funkcjonalnościach RT w kernelu stworzona przez bootlin: https://bootlin.com/doc/training/preempt-rt/preempt-rt-slides.pdf
Krótkie i treściwe wprowadzenie do RTOSów po polsku: https://students.mimuw.edu.pl/SO/Projekt03-04/temat4-g7/intro.html
Dodaj komentarz