PREEMPT_RT w Kernelu


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

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *