Real-Time Linux
Real-Time Linux (RTL, myös Linux-rt, PREEMPT_RT) on reaaliaikainen (RTOS) versio Linux-ytimestä, joka tunnetaan Linux Foundationin projektina.[1]
Reaaliaikaista Linuxia on käytetty mm. robotiikassa, pörssipalveluissa ja tietokoneissa, joiden pitää olla yhteydessä ”kovan” reaaliaikajärjestelmän kanssa.[2]
Vaatimukset
Kovan reaaliaikajärjestelmän vaatimuksille on neljä määrittelyä ja on tiedettävä mitä käyttäjä tarkoittaa:[3]
- järjestelmän on aina kohdattava aikarajat
- tämä määritelmä on epäreilu ohjelmalle mikäli laitteisto vikaantuu
- järjestelmän on aina kohdattava aikarajat, mutta vain laitteistovian puuttuessa
- tämä määritelmä yksinkertaistaa asioita, mutta ei ole riittävä järjestelmätasolla
- ”timantinkova” reaaliaikajärjestelmä voi suorittaa kytkemällä pois laitteistokeskeytykset
- järjestelmä saa ohittaa aikarajan, mutta vain jos se ilmoittaa siitä
- esimerkiksi korkean tarkuuden anturitietojen keruussa ennakoimattomien kuormien ollessa läsnä järjestelmässä
- järjestelmä määritellään testijoukon läpäisyllä
- eräät vaativat tämän sijaan formaalia (matemaattista) todistetta eivätkä kelpuuta tätä määrittelyä
Reaaliaikaisuus ei tarkoita nopeutta vaan latenssia ja deterministisyyttä.[4] Reaaliaikaisessa käsittelyssä 99 %:n todennäköisyys ei ole riittävä ja painopiste on pahimpien tapauksien (engl. worst case) käsittely siten, että tulos on ennakoitava ja toistettava: suorituskykyä painottava käsittely optimoi keskivertotapausta.[5] Turvakriittinen ja reaaliaikainen eivät ole sama asia, mutta voivat liittyä toisiinsa.[5]
Historia
Linuxia käytettiin tutkimusalustana jo varhain ja tutkijat alkoivat muuttaa Linuxia reaaliaikaiseksi käyttöjärjestelmäksi vaihtelevalla menestyksellä, mutta eivät tähdänneet pääsarjan ytimen muuttamiseen.[6] Vuonna 2004 eri tahot aloittivat koordinoimattomia yrityksiä saada avaintekniikoita ytimeen, mutta ne olivat vielä puutteellisia.[6] Red Hatille työskennellyt Ingo Molnar alkoi koota ja muokata kehitystä muutossarjaksi nimeltä PREEMPT_RT ja samaan aikaan Thomas Gleixner työskenteli Doug Niehausin kanssa oman ratkaisun siirtämiseksi.[6] Molnarin ja Gleixnerin työ oli sekä toisiaan täydentävää että ristiriidassa keskenään joten he yhdistivät voimavaransa.[6] Muita tahoja kuten Steven Rostedt liittyi mukaan tuoden omia ideoita ja kokemusta reaaliaikaisuuden tutkimuksesta.[6] Ryhmä sai nopeasti aikaan ratkaisun, joka oli vielä kaukana ylläpidettävästä ja tuotantovalmiista.[6] Pääsarjan ytimeen liittämiseksi on tarvittu vielä paljon valmistelevaa työtä ja integraatio ei ole voinut olla haittana muulle Linux-ytimen käytölle ja kehitykselle: muutossarja koskee keskeisiä osia ytimestä.[6]
Reaaliaikaisten järjestelmien käyttöalue on laaja ja useissa tapauksissa hyvin erikoistunut sekä voi olla aluekohtaisten standardien ja lakien säätelemä.[6] Real-Time Linux projekti ei tähtää näihin erikoistuneisiin tapauksiin vaan on suunnattu kattamaan 99% käyttötapauksista.[6] Validointia varten on käynnistetty Linux Foundationin ELISA-projekti.[6][7] Moniprosessointi on yleistynyt myös sulaututetuissa järjestelmissä ja järjestelmän osiointi (suorittimien eristäminen tiettyyn tehtävään) on yksi käyttötapaus.[3][8][9]
RTL:stä on myös käytetty nimiä -rt, RT-Patch ja RT PREEMPT sekä PREEMPT_RT. Pääsarjan ydintä on vaiheittain muokattu yhteensopivaksi.[10] Linux-ytimen versiossa 5.3 on CONFIG_PREEMPT_RT on liitetty osaksi pääsarjan ydintä.[11] Muutoksilla ytimen omat toiminnot ovat keskeytettäviä.[12][13][3] Lukitukseen liittyvä koodi on yhdistetty pääsarjaan versiossa 5.15.[14] SLUB-muistivaraus on tehty yhteensopivaksi PREEMPT_RT:n kanssa versiossa 5.15.[15] Reaaliaikakäyttöön konfiguroidussa ytimessä on siihen tarkoitetut versiot mutexeista, wait/wound mutexeista, luku/kirjoitus semaforeista, spinlockeista ja read/write lukoista.[16] Aiemmin SCHED_DEADLINE-vuoronnus on lisätty ytimeen versiossa 3.14.[17] Muita käytäntöjä ovat SCHED_FIFO ja SCHED_RR.[18] Keskeytyksien käsittely säikeissä on ollut ytimessä jo pitkään.[4][13]
Toteutus
Linux-ytimen reaaliaikatuki voidaan konfiguroida useasta eri vaihtoehdosta:[4]
- ei pakotettua keskeytystä - CONFIG_PREEMPT_NONE
- vapaaehtoinen keskeytys - CONFIG_PREEMPT_VOLUNTARY
- keskeytettävä ydin (alhaisen latenssin työpöytä) - CONFIG_PREEMPT_LL
- keskeytettävä ydin (perustason reaaliaikaisuus) - CONFIG_PREEMPT_RTB
- täysin keskeytettävä ydin - CONFIG_PREEMPT_RT_FULL
Prioriteettien inversio-ongelman välttämiseksi reaaliaikainen ydin tukee prioriteettien perintää.[4] Prioriteettien perintä nostaa lukon varanneen prioriteettia vähintään samalle tasolle kuin lukkoa odottavalla kunnes lukko vapautuu, jotta lukon varannut saa riittävästi ajoaikaa.[19][20] Reaaliaikaisessa ytimessä spin lock -lukituksista tulee mutex-lukituksia.[4]
Normaali Linux-ydin käyttää tasavertaista (engl. fair) vuoronnusta, mutta reaaliaikaisessa ytimessä korkeimmalla prioriteetilla oleva saa aina ensin vuoron.[21] Tasavertaisessa lukkoa ensin odottava saa ensin vuoron mutta reaaliaikaisessa korkeammalla prioriteetilla oleva saa sen ensin.[21] Levylle sivuttaminen on mahdollista estää.[21]
Ytimessä on käytetty local_lock
-alueita merkitsemään paikkoja, jotka tavallisessa ytimessä voivat hetkellisesti kytkeä moniajon pois tai estää keskeytykset.[22] PREEMPT_RT-ytimessä nämä eivät estä ytimen moniajoa eivätkä kytke pois keskeytyksiä ja lisäksi PREEMPT_RT-ytimessä eräät primitiivit käyttävät eri tyyppiä jotta moniajoa ei estetä.[22][23][24]
Ytimessä on Lockdep-niminen työkalu lukitusmallin oikeellisuuden validointiin.[25][26]
Suoritintuki
Reaaliaikaversio on saatavilla mm. seuraaville suoritinarkkitehtuureille:[27]
Jäsenjärjestöt ja tukijat
Projektin tukijoina ovat:[1]
- National Instruments
- OSADL
- Texas Instruments
- Altera
- ARM
- Intel
- IBM
OSADL jäseniä ovat:[28]
- BMW
- Homag GmbH
- Intel
- KEBA AG
- Komax
- Phoenix Contact
- Roche
- Trumpf
- WAGO
OSADL-projekti Safety Critical Linux pyrkii sertifioimaan reaaliaikaisen Linuxin.[29]
Muut projektit
Lisäksi on olemassa RTLinux, RTAI-laajennus Linux-ytimeen, Xenomai, Linux/RK, LITMUS-RT sekä LibeRTOS.
Katso myös
Lähteet
- The Linux Foundation Announces Project to Advance Real-Time Linux 5.10.2015. Linux Foundation. Arkistoitu . Viitattu 29.1.2017. (englanniksi)
- Intro to Real-Time Linux for Embedded Developers Linux.com. Viitattu 29.1.2017.
- Paul E. McKenney: SMP and Embedded Real Time 1.1.2007. Linux Journal. Viitattu 25.10.2019. (englanniksi)
- Steven Rostedt: Real-Time is coming to Linux (PDF) events19.linuxfoundation.org. 24.10.2018. Viitattu 26.10.2019. (englanniksi)
- Jonathan Corbet: Safety-critical realtime with Linux 25.9.2017. Lwn.net. Viitattu 27.10.2019. (englanniksi)
- In the trenches with Thomas Gleixner, real-time Linux kernel patch set linux.com. 20.4.2021. Viitattu 18.2.2022. (englanniksi)
- The Linux Foundation Launches ELISA Project Enabling Linux In Safety-Critical Systems linuxfoundation.org. 21.2.2019. Arkistoitu 4.11.2020. Viitattu 1.11.2020. (englanniksi)
- 2.13. System Partitioning Red Hat Enterprise Linux for Real Time access.redhat.com. Viitattu 18.2.2022. (englanniksi)
- CPU Partitioning wiki.linuxfoundation.org. Viitattu 18.2.2022. (englanniksi)
- Thomas Gleixner: [patch 0/1 Kconfig: Introduce CONFIG_PREEMPT_RT] lwn.net. 15.7.2019. Viitattu 25.10.2019. (englanniksi)
- Linux_5.3 kernelnewbies.org. Viitattu 25.10.2019. (englanniksi)
- Robert Love: Lowering Latency in Linux: Introducing a Preemptible Kernel 1.5.2002. Linux Journal. Viitattu 25.10.2019. (englanniksi)
- Paul McKenney: A realtime preemption overview 10.8.2005. Lwn.net. Viitattu 25.10.2019. (englanniksi)
- https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e5e726f7bb9f
- https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cc09ee80c3b18ae1a897a30a17fe710b2b2f620a
- Jonathan Corbet: Short subjects: Realtime, Futexes, and ntfs3 lwn.net. 16.8.2021. Viitattu 1.11.2021. (englanniksi)
- SCHED_DEADLINE To Be Added To Linux 3.14 Kernel phoronix.com. Viitattu 25.10.2019. (englanniksi)
- John Ogness: A Checklist for Writing Linux Real-Time Applications (PDF) ogness.net. lokakuu 2020. Viitattu 17.11.2020. (englanniksi)
- Priority inheritance in the kernel 3.4.2006. Lwn.net. Viitattu 28.10.2019. (englanniksi)
- PI-futex: -V1 lwn.net. 25.3.2006. Viitattu 28.10.2019. (englanniksi)
- Klaas van Gend: Using Real-Time Linux (PDF) elinux.org. Viitattu 26.10.2019. (englanniksi)
- Lock types and their rules kernel.org. Viitattu 18.2.2022. (englanniksi)
- RT-mutex implementation design kernel.org. Viitattu 18.2.2022. (englanniksi)
- RT-mutex subsystem with PI support kernel.org. Viitattu 18.2.2022. (englanniksi)
- Jonathan Corbet: Interrupts, threads, and lockdep lwn.net. 3.3.2009. Viitattu 18.2.2022. (englanniksi)
- Runtime locking correctness validator kernel.org. Viitattu 18.2.2022. (englanniksi)
- OSADL Project: Realtime Linux
- OSADL Regular Members osadl.org. Viitattu 29.1.2017.
- OSADL Project: Safety Critical Linux osadl.org. Viitattu 29.1.2017.