RTLinux - RTLinux

RTLinux
Původní autoři Victor Yodaiken, Michael Barabanov
Vývojáři FSMLabs, Wind River Systems
Napsáno C
Operační systém Linux
K dispozici v Angličtina
Typ Jádro
Licence GPL2

RTLinux je patentovaný mikrokernel s pevným operačním systémem v reálném čase (RTOS), který spouští celý operační systém Linux jako plně preventivní proces. Tvrdá vlastnost v reálném čase umožňuje ovládat roboty, systémy sběru dat, výrobní závody a další časově citlivé nástroje a stroje z aplikací RTLinux. I přes podobný název nesouvisí s projektem Linux Real-Time Linux Foundation Linux .

RTLinux byl vyvinut Victorem Yodaikenem, Michaelem Barabanovem, Cortem Douganem a dalšími na New Mexico Institute of Mining and Technology a poté jako komerční produkt ve FSMLabs. Společnost Wind River Systems získala v únoru 2007 vestavěnou technologii FSMLabs a zpřístupnila verzi jako Wind River Real-Time Core pro Wind River Linux . V srpnu 2011 společnost Wind River ukončila produktovou řadu Wind River Real-Time Core, čímž účinně ukončila komerční podporu produktu RTLinux.

Pozadí

Klíčovým cílem návrhu RTLinuxu bylo přidání tvrdých schopností v reálném čase do komoditního operačního systému, aby se usnadnil vývoj komplexních řídicích programů s oběma schopnostmi. Někdo by například mohl chtít vyvinout řadič motoru v reálném čase, který by používal komoditní databázi a exportoval rozhraní webového operátora. Místo pokusu o vytvoření jediného operačního systému, který by mohl podporovat funkce v reálném čase i mimo něj, byl RTLinux navržen tak, aby sdílel výpočetní zařízení mezi operačním systémem v reálném čase a mimo real-time, aby (1) spuštění operačního systému v reálném čase nemohlo být nikdy zablokováno spuštěním operačního systému, který není v reálném čase, a (2) komponenty běžící ve dvou různých prostředích mohly snadno sdílet data. Jak název napovídá, RTLinux byl původně navržen tak, aby používal Linux jako systém, který není v reálném čase, ale nakonec se vyvinul tak, aby jádro RTCore v reálném čase mohlo běžet s Linuxem nebo BSD UNIX .

Multi-Environment Real-Time (MERT) byl prvním příkladem operačního systému v reálném čase, který koexistuje se systémem UNIX. MERT spoléhal na tradiční virtualizační techniky: jádro v reálném čase byl hostitelský operační systém (nebo hypervisor ) a Bell Systems UNIX byl hostem . RTLinux byl pokus aktualizovat koncept MERT na počítačovou éru a komoditní hardware. Byl to také pokus překonat výkonnostní limity MERT, zejména režii zavedenou virtualizací.

Tato technika byla použita pouze k virtualizaci řízení přerušení hosta. Tato metoda umožnila jádru v reálném čase převést hostující operační systém na systém, který byl zcela předvídatelný, ale který mohl stále přímo ovládat například úložná zařízení. Zejména standardní ovladače pro hosta fungovaly bez úpravy zdroje, i když je bylo třeba znovu zkompilovat, aby používaly „háčky“ virtualizace. Viz také paravirtualizace . UNIP „potrubí“ bylo upraveno tak, aby umožňovalo komunikaci programů v reálném čase i mimo něj, i když byly přidány i jiné metody, jako je sdílená paměť.

Z pohledu programátora RTLinux původně vypadal jako malé vláknové prostředí pro úlohy v reálném čase plus standardní prostředí Linux pro všechno ostatní. Operační systém v reálném čase byl implementován jako zaváděcí modul jádra, který začínal virtualizací řízení přerušení hosta a poté spustil plánovač v reálném čase. Úkolům byly přiřazeny statické priority a plánování bylo původně čistě prioritní. Hostující operační systém byl začleněn jako úkol s nejnižší prioritou a v podstatě fungoval jako nečinný úkol pro systém v reálném čase. Úkoly v reálném čase běžely v režimu jádra. Pozdější vývoj RTLinuxu přijal rozhraní API pro programování vláken POSIX a poté povolil vytváření vláken v uživatelském režimu, přičemž vlákna v reálném čase běží uvnitř hostujících procesů. V prostředích s více procesory byla vlákna uzamčena k procesorovým jádrům a bylo možné zabránit tomu, aby hostující vlákno běželo na určeném jádru (efektivně rezervovalo jádra pouze pro zpracování v reálném čase).

Implementace

RTLinux poskytuje možnost spouštění speciálních úloh v reálném čase a obsluhy přerušení na stejném počítači jako standardní Linux. Tyto úkoly a obslužné rutiny se provádějí, když je je třeba provést, bez ohledu na to, co Linux dělá. Čas nejhoršího případu mezi okamžikem, kdy procesor detekuje hardwarové přerušení, a okamžikem, kdy obsluha přerušení začne vykonávat, je pod 15 mikrosekund na RTLinuxu běžícím na generickém x86 (přibližně 2000). Periodický úkol RTLinux běží na stejném hardwaru do 35 mikrosekund od naplánovaného času. Tyto časy jsou omezené hardwarem a jak se hardware zlepšuje, zlepší se také RTLinux. Standardní Linux má vynikající průměrný výkon a může dokonce poskytovat přesnost plánování milisekundové úrovně pro úkoly pomocí funkcí POSIX soft v reálném čase. Standardní Linux však není navržen tak, aby poskytoval přesnost na milisekundy a spolehlivé načasování. RTLinux byl založen na lehkém virtuálním stroji, kde Linuxový „host“ dostal virtualizovaný řadič přerušení a časovač a veškerý další hardware měl přímý přístup. Z pohledu „hostitele“ v reálném čase je linuxové jádro vlákno. Přerušení potřebná pro deterministické zpracování zpracovává jádro v reálném čase, zatímco ostatní přerušení jsou předávána Linuxu, který běží s nižší prioritou než vlákna v reálném čase. Linuxové ovladače zvládly téměř všechny I/O . Ke sdílení dat mezi operačním systémem a RTLinuxem lze použít roury First-In-First-Out ( FIFO ) nebo sdílenou paměť.

Objektivní

Klíčovým cílem návrhu RTLinuxu je, aby byl systém transparentní, modulární a rozšiřitelný. Transparentnost znamená, že neexistují neotevíratelné černé skříňky a náklady na jakoukoli operaci by měly být stanovitelné. Modularita znamená, že je možné vynechat funkčnost a náklady na tuto funkčnost, pokud to není potřeba. A rozšiřitelnost znamená, že programátoři by měli být schopni přidávat moduly a přizpůsobovat systém jejich požadavkům. Základní systém RTLinux podporuje vysokorychlostní zpracování přerušení a nic víc. Má jednoduchý prioritní plánovač, který lze snadno nahradit plánovači vhodnějšími pro potřeby určité konkrétní aplikace. Při vývoji RTLinuxu byl navržen tak, aby maximalizoval výhodu, kterou máme z toho, že máme k dispozici Linux a jeho výkonné funkce.

Základní komponenty

RTLinux je strukturován jako malá základní součást a sada volitelných komponent. Základní komponenta umožňuje instalaci obslužných rutin přerušení s velmi nízkou latencí, které nemohou být zpožděny nebo předjímány samotným Linuxem, a některé rutiny synchronizace a řízení přerušení na nízké úrovni. Tato základní komponenta byla rozšířena o podporu SMP a zároveň byla zjednodušena odstraněním některých funkcí, které mohou být poskytovány mimo jádro.

Funkčnost

Většina funkcí RTLinuxu je ve sbírce zaváděcích modulů jádra, které poskytují volitelné služby a úrovně abstrakce. Tyto moduly zahrnují:

  1. rtl sched - prioritní plánovač, který podporuje jak "lite POSIX" rozhraní popsané níže, tak původní V1 RTLinux API.
  2. rtl time - který řídí hodiny procesoru a exportuje abstraktní rozhraní pro připojení obsluh k hodinám.
  3. rtl posixio - podporuje čtení/zápis/otevřené rozhraní POSIX ve stylu ovladačů zařízení.
  4. rtl fifo - spojuje úlohy RT a obsluhy přerušení s procesy Linux prostřednictvím vrstvy zařízení, aby procesy Linux mohly číst/zapisovat do komponent RT.
  5. semafor - balíček od Jerryho Epplina, který poskytuje úkoly RT blokující semafory.
  6. Plánuje se, že podpora POSIX mutex bude k dispozici v příští aktualizaci menší verze RTLinuxu.
  7. mbuff je přispívající balíček napsaný Tomaszem Motylewskim pro poskytování sdílené paměti mezi komponenty RT a procesy Linux.

Úkoly v reálném čase

Úkoly RTLinux v reálném čase se implementují jako moduly jádra podobné typu modulu, který Linux používá pro ovladače, souborové systémy atd. Úkoly v reálném čase mají přímý přístup k hardwaru a nevyužívají virtuální paměť. Při inicializaci úkol (modul) v reálném čase informuje jádro RTLinux o omezení termínu, období a času vydání.

Vlákna

RT-Linux implementuje POSIX API pro manipulaci s vláknem. Vlákno se vytvoří voláním pthread_createfunkce. Třetím parametrem pthread_createje funkce, která obsahuje kód spuštěný vláknem.

V RTLinuxu je nutné nastavit priority vláken. Vlákna s vyššími prioritami mohou předcházet vláknům s nižšími prioritami. Můžeme mít například vlákno ovládající krokový motor. Aby bylo možné pohybovat motorem plynule, je nutné toto vlákno spouštět v přísně pravidelných intervalech. To lze zaručit přiřazením vysoké priority tomuto vláknu. Příklad threads2.c nastavuje různé priority vláken. Nastavení priority vlákna se provádí pomocí níže uvedeného kódu:

int init_module(void)
{
pthread_attr_t attr;
struct sched_param param;
pthread_attr_init(&attr);
param.sched_priority = 1;
pthread_attr_setschedparam(&attr, &param);
pthread_create(&t1, &attr, &thread_code, "this is thread 1");
rtl_printf("Thread 1 started\n");
...
}

Výstup programu je následující.

Thread 1 started
Thread 2 started
Thread 3 started
Message: this is thread 1
Message: this is thread 2
Message: this is thread 2
Message: this is thread 2
Message: this is thread 1
Message: this is thread 1
Message: this is thread 3
Message: this is thread 3
Message: this is thread 3

Vlákno 2 má nejvyšší prioritu a vlákno 3 má nejnižší prioritu. První zpráva je vytištěna vláknem 1 střední priority, protože je spuštěna krátce před vláknem 2.

Viz také

Reference

Prameny

externí odkazy