XIP

XIP ( ing.  execute-in-place - execution in place ) este o tehnologie care oferă posibilitatea de a executa cod de program direct de pe dispozitivul de stocare persistent pe care se află, fără încărcare mai întâi în RAM . Este utilizat pe scară largă pentru încărcarea inițială a calculatoarelor, în sistemele încorporate datorită necesității de a economisi resurse RAM, în unele cazuri este folosit și pentru sisteme mari . Începând cu anii 2010, pentru utilizarea în sistemele server Linux cu memorie nevolatilă adresabilă pe octeți , a fost înlocuită cu o tehnologie mai generală - DAX .

Pentru ca tehnologia să funcționeze, suportul acesteia trebuie implementat la trei niveluri: stocare , în sistemul de operare , și programele executabile în sine .

Dispozitive de stocare

Pentru prima dată, suportul explicit pentru tehnologia din partea dispozitivului de stocare, precum și abrevierea și decodarea acesteia, sunt descrise în specificația PCMCIA din 1990 și sunt destinate mai mult utilizării cu dispozitive care nu pot fi scrise [1] . Inițial, tehnologia a fost asociată doar cu PCMCIA și specificația sa specială, care definea regulile de plasare a unui cod binar și ordinea în care a fost citit și executat [2] , dar ca atare tehnică a fost implementată pentru alte interfețe și unități, a devenit mai puternic pentru toate dispozitivele de stocare.

Pentru ca modul XIP să funcționeze pe unitatea pe care se află programul, trebuie implementată o interfață similară cu cea folosită de procesorul central pentru a accesa RAM. Suportul pentru aceasta este implementat fie la nivel de middleware, fie prin intermediul sistemului de fișiere . Printre instrumentele intermediare care asigură lucru în modul XIP se numără subsistemul MTD ( Memory Technology Device ) ,  respectiv, sistemele de fișiere care lucrează pe MTD peste nivelul de bloc trebuie să accepte apelurile corespunzătoare pentru ca XIP să funcționeze. În același timp, nu toate sistemele de fișiere care funcționează prin MTD acceptă XIP, deoarece multe dintre ele, concentrate inițial pe tehnologia portabilă, au implementat compresie , în acest sens, implementarea XIP în ele nu este banală, astfel de sisteme de fișiere includ JFFS2 , YAFFS2 , LogFS , UBIFS [ 3] . Cu toate acestea, există sisteme de fișiere de compresie activate XIP care lucrează pe MTD, cum ar fi AXFS , care evidențiază funcționarea modului XIP ca o caracteristică definitorie ( sistem de fișiere XIP avansat ) [3] . Principalele sisteme de fișiere de compresie la nivel de bloc pentru stocare persistentă, cramfs și squashfs  , nu acceptă XIP, dar există un patch pentru cramfs pentru a suporta XIP necomprimat, iar majoritatea telefoanelor mobile bazate pe Linux au folosit această variantă de cramfs [3] .  

Printre sistemele de fișiere de uz general care rulează peste nivelul blocului, suportul este oferit în Ext2 și Ext3 ; Ext4 a început portarea suportului XIP, dar în 2014 a fost înlocuit cu metode mai generale de acces direct - DAX [ [4] .

Sisteme de operare

În ciuda faptului că tehnologia a fost utilizată în sistemele încorporate, firmware și o serie de sisteme de operare în timp real cu mult înainte de anii 2000 [5] , pe partea sistemelor de operare de uz general, suportul a fost implementat pentru prima dată în versiunea 2.6 a nucleului Linux. în 2005 [6] .

În 2006, tehnologia a fost acceptată pentru mainframe -urile IBM zSeries , unde era nevoie de a rula multe instanțe diferite de z/Linux dintr-un mediu z/VM cu un nucleu comun și biblioteci partajate , dar cu regiuni de date diferite [7] ] . Dacă o caracteristică similară pentru z/OS a existat înainte, atunci implementarea sa directă pentru Linux ar necesita modificări semnificative în codul nucleului al sistemului de operare, astfel încât suportul XIP a fost mutat în ramura kernel pentru arhitectura s390 și o serie de caracteristici suplimentare. au fost susținute, inclusiv suport pentru pe partea Ext2 [8] . Mai mult, se crede că nevoia IBM de a sprijini tehnologia mainframe-ului a fost forța motrice din spatele implementării XIP pe Linux [9] .

În 2010, tehnologia a fost susținută în NetBSD [5] , unde implementarea s-a dovedit a fi relativ simplă datorită caracteristicilor subsistemului de gestionare a memoriei virtuale și cache-ului tampon, în plus, este transparentă pentru sistemele de fișiere (adică este nu necesită sprijin special din partea lor).

Compilare

Pentru ca programul să funcționeze în modul XIP, este necesar să se informeze în etapa de compilare despre posibilitatea de separare a zonelor pentru segmentele de date și segmentul de cod (deoarece segmentul de date trebuie creat în RAM, și segmentul de cod trebuie să rămână în sistemul de fișiere) . GCC folosește opțiunea -msep-data pentru aceasta și , în plus, programele XIP necesită de obicei opțiunea -mid-shared-library pentru a genera cod care permite apelarea bibliotecilor prin identificator [10] . Setarea oricăreia dintre aceste opțiuni face ca steag-ul -fPIC  , care înseamnă compilare independentă de poziție , să fie setat.

Efecte

Scopul principal al tehnologiei este de a salva memoria RAM a dispozitivului. Efectul cel mai semnificativ al economisirii RAM este atins atunci când este necesar să rulați mai multe instanțe ale programului, caz în care același spațiu pe dispozitivul de memorie numai în citire este utilizat pentru a deservi toate lansările, în loc să aloce o zonă în RAM pentru fiecare. instanță. Un alt efect este reducerea consumului de energie al dispozitivului prin reducerea numărului de accesări la RAM volatilă [11] .

Un alt efect folosit frecvent este un boot rapid din stocarea persistentă, în special pentru un nucleu Linux monolitic suficient de mare, care în modurile tradiționale trebuie inițial copiat în RAM, în XIP poate fi executat direct de pe unitate.

Când se utilizează unități flash , cel mai mare efect al XIP este obținut cu dispozitive cu adresa de octeți, cum ar fi flash-ul NOR [5] (în timp ce flash- ul NAND , precum hard disk-urile , sunt adresate bloc , iar accesarea unei singure instrucțiuni înseamnă citirea de obicei 4 KB, la cel puțin 512 octeți). Acest lucru explică, de asemenea, utilizarea flash-ului NOR pentru memoriile cu doar citire de pornire și sistemele încorporate, în ciuda costului mai mare și a densității mai mici de înregistrare (în condițiile anilor 2010).

Un alt efect este capacitatea de a utiliza dispozitive de stocare persistente ca memorie partajată pentru executarea programelor fără a utiliza resursele de memorie principală ale gazdei și a separă programele și segmentele de date, așa cum este implementat în mainframe .

DAX

În 2014, pe baza codului XIP din nucleul Linux (începând cu versiunea 3.14), a fost implementată o tehnologie mai generală - DAX ( acces direct  ), care combină atât capabilitățile XIP și oferă apelurile necesare pentru accesul direct la date ocolind memoria cache a paginii [9] . Dintre sistemele de fișiere, tehnologia a fost implementată mai întâi pentru Ext4 , ulterior a apărut suportul pentru XFS .

Motivul principal pentru o astfel de generalizare a fost apariția, la mijlocul anilor 2010, a dispozitivelor NVDIMM nevolatile și 3D XPoint pentru sistemele de servere, adresabile pe octeți încăpătoare, în legătură cu care relevanța ambelor coduri de program care rulează fără a fi transferate în principal. memorie și acces direct la date fără copiere intermediară pe RAM. În sistemele de fișiere concentrate pe astfel de dispozitive, precum NOVA , PMFS , SCMFS , Aerie [12] , suportul DAX este implementat de la bun început și această caracteristică este considerată una dintre caracteristicile lor cheie.

Note

  1. Mark Brownstein. PCMCIA susține specificațiile cardului  PC  // InfoWorld . - 1990. - Vol. 12 , nr. 36 .
  2. Winn Rosh. PCMCIA: Sistemul de expansiune al viitorului  // PC Mag  . - 1993. - Vol. 12 , nr. 2 . - P. 321-326 . „XIP este specificația proprie a PCMCIA, care permite executarea codului programului din memoria read-only fără a fi încărcat mai întâi în sistemul principal... Standardul XIP definește modul în care programele codificate pe mașinile ROM trebuie să citească și să fie executate”
  3. 1 2 3 Hulbert, 2008 .
  4. Jonathan Corbet. Suport sisteme de fișiere în memoria persistentă (link indisponibil) . LWN.net (2 septembrie 2014). Preluat la 26 mai 2018. Arhivat din original la 21 decembrie 2018. 
  5. 1 2 3 Uebayashi, 2010 .
  6. Corbet, 2005 .
  7. ↑ Cum se utilizează Tehnologia Execute -in -Place cu Linux pe z/VM  . SC34-2594-01 . IBM (1 martie 2010). Preluat la 26 mai 2018. Arhivat din original la 20 ianuarie 2022.
  8. Executare pe loc pentru mapările fișierelor . documentație Linux. Sisteme de fișiere (13 noiembrie 2008). Preluat la 26 mai 2018. Arhivat din original la 15 aprilie 2022.
  9. 12 Jake Edge. Memoria persistentă  . LWN.net (26 martie 2014). Preluat la 26 mai 2018. Arhivat din original la 27 mai 2018.
  10. Richard Stallman . Folosind colecția de compilatori GNU. Pentru versiunea GCC 4.1.2. - Boston: GNU Press, 2005. - S. 153. - 470 p.
  11. Benavides et al., 2008 .
  12. Jian Xu, Steven Swanson. NOVA: A Log-structured File System for Hybrid Volatile/Non-volatile Main Memories  //  Proceedigns of the 14th USENIX Conference on File and Storage Technologies (FAST '16). - Santa Clara, CA : USENIX , 2016. - P. 323-328 . - ISBN 978-1-931971-28-7 .

Literatură

Link -uri