Micronucleul L4

L4 este un micronucleu de a doua generație proiectat de Jochen Liedtke  (ro) . Deoarece micronucleele de la începutul anilor 1990 erau extrem de lente în comparație cu concurenții lor monolitici , Liedtke a decis să-și dezvolte propriile sale micronuclei. Dezvoltă astfel micronuclei L3 și apoi L4. Numeroasele îmbunătățiri aduse acestora și succesorilor lor au făcut posibilă creșterea considerabilă a vitezei acestor nuclee vechi și apoi ajungerea la micronucleele actuale.

Ideea generală a L4 este astfel rezumată de Liedtke însuși: „un concept este tolerat în interiorul micronucleului numai dacă deplasarea acestuia în afara nucleului, adică permițând implementări alternative, ar împiedica implementarea. Implementarea unei funcționalități cerute de sistemul. "

Motivații

Microkernelurile reduc la minimum funcționalitatea oferită de nucleu: nucleul oferă un set de mecanisme generale în timp ce serverele în modul utilizator implementează servicii de sistem de operare. Sistemele de operare cu un nucleu monolitic și cele cu un microkernel au ambele un tip de operație diferit, ceea ce le face două sisteme de operare diferite. Sistemul de operare bazat pe un nucleu monolitic pune mai mult accent pe performanțe ridicate, în timp ce microcernelurile pun mai mult accent pe securitate și stabilitate. Cu toate acestea, primele sisteme de operare bazate pe micronucleu au fost lente, deci eficiența lor nu a fost la fel de mare.

Jochen Liedtke a început să dezvolte nucleele L3 și apoi L4 cu scopul de a îmbunătăți performanța sistemelor de operare bazate pe nuclee minimaliste . Principiul fundamental al acestor nuclee este pur și simplu: „un concept este permis în nucleu numai atunci când nu poate fi implementat în spațiul utilizatorului” . Acest tip de nucleu oferă astfel exclusiv funcțiile fundamentale, cum ar fi comunicațiile, cartarea  etc. De asemenea, impune politici. Un microkernel nu face nici o muncă reală (munca microkernelului este doar de a controla și gestiona sarcinile pe care le delegă proceselor în spațiul utilizatorului).

Istorie

În urmă cu douăzeci de ani, Jochen Liedtke a demonstrat cu nucleul său L4comunicațiile între procesele de micronuclei ar putea fi de 10 până la 20 de ori mai rapide decât ne-am putea aștepta la momentul respectiv. L4 a fost proiectat dintr-o versiune anterioară numită L3 și dezvoltat de John Liedtke la începutul anilor 1980 pe platformele i386. A fost desfășurat comercial pe câteva mii de instalații (în principal în școli). La fel ca toate micronucleele vremii, L3 suferea de un cost al comunicațiilor între procese de ordinul a 100 microsecunde.

Liedtke a folosit inițial L3 pentru a experimenta idei noi. Acesta a folosit pentru prima dată numele „L4” cu ABI  v2 deja prezent în comunitate din 1995 . Ulterior, va fi complet rescris în asamblare pentru computerele i486 și a fost portat rapid pentru Pentiums.

Această lucrare inițială a declanșat o evoluție de 20 de ani urmată de mai multe revizuiri ale ABI - urilor, precum și de noi implementări. Acest lucru a început cu reintroducerii de ABI Dresden și UNSWs pe 64 de biți pentru Alpha și procesoare MIPS , acestea din urmă au integrat mai lent operațiunile în limba C . Aceste două nuclee au reușit astfel să realizeze comunicații între procese de mai puțin de o microsecundă, ceea ce a fost facilitat de faptul că erau nuclee open source . Kernelul UNSW Alpha a fost primul nucleu L4 multiprocesor.

Liedtke, care a plecat GMD pentru IBM Watson , a adus experiența sa în timpul punerii în aplicare a unei TBI , care va fi cunoscut de rezultat ca versiunea X . GMD și IBM au impus o politică de proprietate intelectuală foarte restrictivă altor cercetători, ceea ce a determinat proiectul „  Dresda  ” să înceapă de la zero prin implementarea unei noi versiuni numite „Fiasco”, referindu-se la experiența lor proastă și încercând să se ocupe mai bine de problemele de proprietate intelectuală.

„Fiasco” este prima versiune a nucleului L4 care a fost complet scrisă într-un limbaj de nivel înalt ( C ++ ) și cea mai veche versiune a codului de bază al nucleelor ​​L4 încă menținută activ. A fost primul nucleu L4 comercializat într-un mod semnificativ (estimare: peste 100.000 de vânzări).

Când Liedtke a sosit în Karlsruhe , Germania, el și elevul său adaptat într-o nouă versiune scrisă în C numită „  Hazelnut  ”, care a fost primul nucleu L4 portat către alte arhitecturi (de la Pentium  I la ARM ).

Experiența lui Karlsruhe cu ABI Versiunea X și cea a L4Ka :: Hazelnut a dus la o revizie majoră a ABI  V4 pentru a îmbunătăți portabilitatea nucleului. După moartea lui Liedtke în 2001 , studenții săi au implementat un nou nucleu gratuit  : L4Ka :: Fistic cu L4Ka . A fost scris în C ++ și portat mai întâi la x86 și PowerPC , apoi la UNSW / NICTA și la scurt timp după MIPS , Alpha ,  64-bit PowerPC și ARM .

În NICTA  (în) , ei și-au reorientat imediat instalarea pentru a fi utilizată în resurse constrânse de sisteme încorporate . Ca urmare, s-a născut o nouă versiune a nucleului dintr-o copie a codului „Fistic” și a fost numită NICTA :: Pistachio-embedded („L4-embedded”). A fost comercializat masiv atunci când Qualcomm a decis să-l folosească ca sistem de operare în firmware - ul modemurilor lor wireless. Filiala NICTA Open Kernel Labs  (ro) a  devenit suportul și dezvoltarea nucleului pe care l-a redenumit „  OKL4  ”. A fost lansată o altă versiune, PikeOS , o clonă comercializată de SYSGO  (in) și certificată pentru utilizare în sisteme critice pentru aerospațială și, de asemenea, în avioane și trenuri.

Câteva concepte de bază

Ideea principală a L4 este aceea de a îmbunătăți viteza micronuclei, mai ales cea a comunicațiilor inter-proces , păstrând în același timp conceptele de micronuclei, a fost necesară reajustarea unor concepte și introducerea altora. Mai jos vom prezenta conceptele care i-au permis lui Liedtke să-și facă față provocării.

Minim

Micronuclee L4 oferă un API simplu, minim și o abstracție care sprijină crearea, executarea si comunicarea interprocese (IPC) între firele în plus față de care să permită izolarea și gestionarea diferitelor sarcini .

Principalii factori de proiectare ai Liedtke s-au concentrat pe minimalism și performanța comunicațiilor între procese, cu o credință fermă în îmbunătățirea punctelor slabe ale L3. El a formulat principiul minimalității micronucleului după cum urmează: „Un concept este acceptat într-un micronucleu numai dacă mișcarea în afara nucleului ar împiedica implementarea unei funcționalități cerute de sistem. "

Acest principiu a stat la baza proiectării nucleelor ​​L4. Dar, potrivit lui Kevin Elphinstone și Gernot Heiser, niciun proiectant de micronucleu nu poate pretinde că a creat un micronucleu pur în strictă conformitate cu principiul minimalității. Drept dovadă, toți au un programator în nucleu care implementează o anumită politică de planificare. În acel moment, ei credeau că nimeni nu poate proiecta un microkernel în care toată politica de planificare să fie delegată spațiului utilizatorului fără a impune costuri uriașe.

Spații de adresă

La nivel hardware, un spațiu de adrese este o mapare care asociază fiecare pagină virtuală cu o pagină fizică sau, altfel, o marchează ca „neaccesibilă”. Maparea este implementat de TLB și tabela de pagini.

Este unitatea de gestionare a memoriei care asigură izolarea spațială. Conține toate datele accesibile direct de un fir . Spațiul de adrese din L4 poate fi construit recursiv. Un fir poate asocia părți comune ale spațiului său de adrese în cel al altui fir și astfel poate partaja date din acele părți ale spațiului său de memorie.

Conceptul de sarcină este echivalent cu cel al spațiului de adrese. În L4 , o sarcină este un set de fire care partajează un spațiu de adrese.

Fire și IPC

Mesageria interproces este una dintre paradigmele cele mai utilizate de micronuclei și alte aplicații client-server . Ajută la îmbunătățirea modularității, flexibilității, securității și scalabilității .

Pentru a comunica între fire cu spații de adrese diferite, metoda clasică constă în transmiterea mesajelor între fire prin intermediul nucleului. IPC implică întotdeauna un anumit acord între cele două părți: expeditorul decide să trimită informații și determină conținutul acestora, în timp ce receptorul stabilește dacă este dispus să primească informații și dacă este liber să interpreteze conținutul mesajului.

Potrivit lui Liedtke, „performanța comunicațiilor între procese este mai importantă” . Există două tipuri de IPC-uri  : IPC-uri sincrone și asincrone. Micronuclei din prima generație au folosit IPC-uri asincrone (de exemplu, Mach ). Nucleul păstrează mesajul într-o memorie tampon până când receptorul este gata să primească mesajul; acest lucru are ca rezultat o copie dublă a mesajului și acest lucru l-a făcut pe Mach să piardă multă performanță. Micronuclei de a doua generație (cum ar fi L4) au adoptat IPC-uri sincrone pentru comunicarea între fire . În aceste comunicări, primul comunicator așteaptă până când celălalt este gata: mesajul poate fi apoi copiat direct între aceste fire , evitând o copie temporară inutilă în nucleu. IPC-urile sincrone satisfac astfel o implementare eficientă și necesară.

Întreruperi

Abstracția naturală a întreruperilor este comunicarea între procese . Hardware-ul este considerat a fi o colecție de fire care au ID-uri speciale și trimit mesaje care conțin doar ID-ul expeditorului către firele software asociate acestora. Cei care primesc fire verifică identificatorul expeditorului mesajului și dacă mesajul este o întrerupere hardware - ul, atunci se întrerupe imediat. Transformarea întreruperii într-un mesaj se face de către nucleu, dar nucleul nu este implicat în procesarea întreruperii. În realitate, nucleul ignoră complet semantica manipulării întreruperilor.

Piloți în spațiul utilizatorului

Un driver de dispozitiv este un proces care are acces direct la porturile I / O mapate direct în spațiul său de adrese și primește mesaje (întreruperi) de la hardware prin mecanisme IPC standard. În filosofia micronuclei L4 , acestea nu ar trebui niciodată integrate în micronucleiu. Întreruperile primite sunt transformate în mesaje în fire asociate. Aceasta este baza pentru implementarea driverelor de dispozitiv ca servere de spațiu utilizator.

Familia micronucleilor L4

Deoarece dezvoltarea L4 Liedtke lui, mai multe implementări au urmat , inclusiv Fiasco , L4Ka :: Fistic , P4 , L4 pentru PowerPC , L4Ka :: alună , L4 / MIPS , L4 / Alpha , L4 / x86 ,  etc.

Fiasco

Fiasco a fost dezvoltat de echipa Fiasco de la Universitatea Tehnică din Dresda în 1999 și este inițiatorul sistemului DROPS ( Dresden Real-Time Operating System Project ). Spunem adesea „L4 / Fiasco” pentru a vorbi despre Fiasco , ceea ce evidențiază relația sa cu L4 .

Un microkernel oferă mecanismele care sunt indispensabile, dar nu aplică politicile care sunt în mare parte implementate în spațiul utilizatorului . În sistemul L4 / Fiasco, există un mediu L4 ( L4Env ), care este un mediu de programare pentru aplicații care va trebui să ruleze deasupra unui kernel L4 / Fiasco .

Modelul de programare „L4 / Fiasco” se bazează pe arhitectura client-server . Planificatorul este preventiv, cu prioritate redusă și planificare de tip rotație între sarcini cu același proprietar.

L4Ka :: Fistic

Pistachio este dezvoltat de echipa System Architecture Group de la Karlsruhe Institute of Technology (Germania) în colaborare cu grupul DiSy de la Universitatea din New South Wales (Australia). Este distribuit sub licență BSD .

A fost portat la următoarele arhitecturi: Alpha (21164 și 21264), AMD64 ( Opteron 242 , Simics ), ARM (SA1100, XScale, ARM925T), IA32 (Pentium și compatibil), IA-64 (Itanium1, Itanium2, Ski), MIPS pe 64 de biți ( R4000 , R5000  (en) ),  32-bit PowerPC ( IBM 750 ) și 64-bit ( Power3 , POWER4 ). Suportă sisteme multiprocesor.

Cea mai recentă versiune, X.2, a fost lansată în Mai 2009.

seL4

Micronucleul seL4 este un membru al familiei de micronuclei L4 conceput pentru a oferi mecanisme de securitate puternice, păstrând în același timp performanțele ridicate, obișnuite în familia L4 și considerate esențiale pentru utilizări reale. Este un micronucleu de a treia generație care se bazează complet pe un nucleu de tip L4 . La fel ca acesta din urmă, folosește abstracții pentru spații de adrese virtuale, fire , comunicări între procese ...

Spațiile de adrese virtuale sunt formate prin manipulare explicită a obiectelor de bază: calea paginii, tabelul paginilor  etc. Nu au o structură de bază definită (în afară de cele rezervate nucleului seL4 în sine).

Cele firele sunt entități active , SEL4 . Prin asocierea unui nod discutabile  și a unui spațiu de adrese virtuale cu un fir , politicile gestionate de utilizator creează o abstractizare la nivel înalt, cum ar fi procesele sau mașinile virtuale .

Comunicațiile interproces  sunt suportate în două moduri: prin utilizarea de mesaje sincrone prin trecerea parametrilor (port, deci destinație fără utilizarea tamponului în nucleu) și notificări asincrone prin parametri asincroni ( numiri de obiecte constă dintr-un singur cuvânt în nucleu ).

Driverele de dispozitiv sunt rulate ca aplicații în modul utilizator care au acces la registrele și memoria dispozitivelor, fie prin maparea dispozitivului în spațiul de adrese virtuale al procesului, fie prin controlul accesului la dispozitiv (de exemplu, este în special cazul arhitecturilor x86) ). „  Sel4  ” oferă mecanismele de gestionare a recepției notificărilor de întrerupere (prin IPC asincrone) și pentru confirmări.

Nucleele SEL4 funcționează pe procesoarele ARM  și x86 , dar versiunile certificate ale SEL4 care există în prezent sunt pentru ARMv6  (in)  și ARMv7 . Portarea pe platforme  x86  nu este în prezent oficial acceptată , Dar există încă o versiune experimentală multicore a seL4 pentru x86.

Proiecte folosind L4

Note și referințe

  1. (în) Jochen Liedtke (decembrie 1995). „  On µ -Kernel Construction  ” (pdf) Proc. Al 15-lea Simpozion ACM privind principiile sistemelor de operare (SOSP) : 237-250 p .. Accesat la 28 septembrie 2017. 
  2. Kevi Elphinstone, Gernot Heiser 2013 , p.  133.
  3. Qingguo ZHOU, Canyu LI, Ying DING, Ganghui CHENG, Hu BIN 1996 , p.  133.
  4. kevin Elphinstone, Gernot Heiser 2013 , p.  133.
  5. kevin Elphinstone, Gernot Heiser 2013 , p.  134.
  6. Lucyantie Mazalan, Raja Mariam Ruzila, Raja Ahmed Sufian, Ahmad Kamal Abdul Aziz, Mohd Saufy Rohmad, D r  Jamalul-lail Ab. Manan 2008 , p.  1.
  7. Kevin Elphinstone, Gernot Heiser 2013 , p.  136.
  8. Jochen Liedtke 1995 , p.  238.
  9. Qingguo ZHOU, Canyu LI, Ying DING, Ganghui CHENG, Hu BIN, Nicholas McGuire 2009 , p.  134.
  10. Jochen Liedtke 1993 , p.  175.
  11. Jochen Liedtke 1995 , p.  239.
  12. Jochen Liedtke 1995 , p.  240.
  13. Dong-Guen Kim, Sang-Min Lee, Dong-Ryeol Shim 2008 , p.  307.
  14. Qingguo ZHOU, Canyu LI, Ying DING, Ganghui CHENG, Hu BIN, Nicholas McGuire 2009 , p.  133.
  15. Qingguo ZHOU, Canyu LI, Ying DING, Ganghui CHENG, Hu BIN, Nicholas McGuire 2009 , p.  135.
  16. (în) „  site-ul oficial proiect L4Ka  ” pe l4ka.org ,12 iulie 2013(accesat la 28 septembrie 2017 ) .
  17. Gerwin Klein, Kevin Elphinstone, Gernot Heiser, June Andronick, Tobby Murray, Dhammika Elkaduwe, Kolanski Rafal, Thomas Sewell , p.  1.
  18. Gerwin Klein, Kevin Elphinstone, Gernot Heiser, June Andronick, Tobby Murray, Dhammika Elkaduwe, Kolanski Rafal, Thomas Sewell , p.  4.
  19. Gerwin Klein, Kevin Elphinstone, Gernot Heiser, June Andronick, Tobby Murray, Dhammika Elkaduwe, Kolanski Rafal, Thomas Sewell , p.  2.
  20. Gerwin Klein, Kevin Elphinstone, Gernot Heiser, June Andronick, Tobby Murray, Dhammika Elkaduwe, Kolanski Rafal, Thomas Sewell , p.  5.

Bibliografie

Document utilizat pentru scrierea articolului : document utilizat ca sursă pentru acest articol.

linkuri externe