Masini Virtuale - Andreea HONCIUC - Ingineria Sistemelor de calcul
Masini Virtuale - Andreea HONCIUC - Ingineria Sistemelor de calcul
Masini Virtuale - Andreea HONCIUC - Ingineria Sistemelor de calcul
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Universitatea Politehnica Bucureşti<br />
Facultatea <strong>de</strong> Electronică, Telecomunicaţii şi Tehnologia Informaţiei<br />
Master <strong>Ingineria</strong> Informaţiei şi a <strong>Sistemelor</strong> <strong>de</strong> Calcul<br />
Disciplina: Sisteme <strong>de</strong> operare avansate<br />
Masterand IISC: <strong>Andreea</strong> <strong>HONCIUC</strong><br />
Maşini virtuale
Cuprins<br />
INTRODUCERE ....................................................................................................................... 3<br />
HAL (HARDWARE ABSTRACTION LAYER) ..................................................................... 4<br />
CUM FUNCłIONEAZĂ HAL ? ..................................................................................................... 4<br />
COMPONENTELE HAL ............................................................................................................... 4<br />
MAŞINA VIRTUALĂ JAVA ................................................................................................... 5<br />
COMPONENłA MAŞINII VIRTUALE JAVA ................................................................................... 5<br />
CARACTERISTICI ....................................................................................................................... 6<br />
ARHITECTURA MAŞINII VIRTUALE JAVA ................................................................................... 7<br />
MEDIUL DE EXECUłIE................................................................................................................ 8<br />
FORMATUL BYTECODE .............................................................................................................. 8<br />
FIŞIERE DE TIP „.CLASS” .......................................................................................................... 10<br />
CONSTRÂNGERI ALE CODULUI UTILIZAT DE JVM .................................................................. 10<br />
VMWARE ............................................................................................................................... 12<br />
APLICAłIILE VMWARE ........................................................................................................... 12<br />
DISPOZITIVELE VMWARE ....................................................................................................... 13<br />
VMWARE ESX SERVER ........................................................................................................... 16<br />
VMWARE CONVERTER ............................................................................................................ 18<br />
ÎMBUNĂTĂłIREA PERFORMANłELOR VMWARE ..................................................................... 18<br />
X86 VIRTUALIZATION ........................................................................................................ 19<br />
VIRTUOZZO .......................................................................................................................... 20<br />
CARACTERISTICI ..................................................................................................................... 20<br />
OPENVZ ................................................................................................................................... 21<br />
COMPARAłIE ........................................................................................................................... 22<br />
Z-MACHINE ........................................................................................................................... 22<br />
O PRIVIRE ASUPRA STRUCTURII MAŞINII Z ............................................................................. 23<br />
MAPAREA MEMORIEI ............................................................................................................... 25<br />
BIBLIOGRAFIE ..................................................................................................................... 26<br />
CĂRłI: ...................................................................................................................................... 26<br />
SITE-URI DE INTERNET: .............................................................................................................. 26
Introducere<br />
Maşina virtuală este un <strong>calcul</strong>ator imaginar, dotat cu un set <strong>de</strong> instrucţiuni ce constituie limbajul (codul)<br />
virtual.<br />
Lucrul cu cod virtual <strong>de</strong>curge astfel: textul sursă este tradus <strong>de</strong> către compilator în limbaj virtual;<br />
programul rezultat constituie intrare pentru o procedură numită executiv, care este <strong>de</strong> fapt un interpretor al<br />
limbajului virtual. Executivul este scris într-un limbaj recunoscut <strong>de</strong> <strong>calcul</strong>atorul ţintă (cel pe care urmează să<br />
ruleze programul compilat). Rolul executivului este acela <strong>de</strong> a parcurge codul virtual obţinut <strong>de</strong> la compilator şi<br />
<strong>de</strong> a executa fiecare instrucţiune, în termenii limbajului maşina al <strong>calcul</strong>atorului ţintă .<br />
Avantajul acestui mod <strong>de</strong> lucru este acela că dacă un limbaj sursă trebuie tradus în mai multe limbaje<br />
obiect, compilatorul propriu-zis se scrie o singură dată (el generează doar cod virtual), iar pentru fiecare limbaj<br />
obiect se construieşte câte un executiv. A scrie un executiv este un lucru mult mai uşor <strong>de</strong>cât a scrie un<br />
compilator. Pe <strong>de</strong> altă parte, programul generat în cod virtual poate fi transportat pe orice maşină dotată cu<br />
interpretorul codului respectiv, <strong>de</strong>ci programul are o portabilitate crescută.<br />
Un <strong>de</strong>zavantaj al lucrului cu cod virtual este acela că viteza <strong>de</strong> execuţie a programelor respective este<br />
mai mică, <strong>de</strong>oarece ele sunt executate "software" (prin intermediul interpretorului) şi nu "hardware" (direct <strong>de</strong><br />
către procesor).<br />
Limbajul virtual şi structura maşinii virtuale sunt stabilite în principiu <strong>de</strong> către proiectantul<br />
compilatorului, după următoarele criterii:<br />
• Comenzile virtuale să fie suficiente pentru a permite transpunerea corectă a instrucţiunilor limbajului<br />
sursă;<br />
• funcţionarea maşinii virtuale să poată fi cât mai uşor <strong>de</strong> simulat cu ajutorul executivelor, pentru fiecare<br />
limbaj obiect.<br />
În general, limbajul virtual este inspirat din limbajele <strong>de</strong> asamblare existente la un moment dat, având<br />
însa un grad ceva mai mare <strong>de</strong> abstractizare.<br />
Virtualizarea este un termen larg ce se referă la abstractizarea resurselor unui <strong>calcul</strong>ator. Este o tehnică<br />
<strong>de</strong> ascun<strong>de</strong>re a caracteristicilor resurselor unui <strong>calcul</strong>ator prin felul în care alte sisteme <strong>de</strong> operare, aplicaţii şi<br />
utilizatorii interacţionează cu aceste resurse. Virtualizarea inclu<strong>de</strong> crearea unei singure resurse fizice (server,<br />
sistem <strong>de</strong> operare, hard disk), pentru a funcţiona ca multiple resurse logice sau invers (mai multe maşini fizice<br />
formând una singură, o maşina virtuală).<br />
Virtualizarea permite multiple maşini virtuale, cu sisteme <strong>de</strong> operare heterogene, să ruleze separat, una<br />
lângă alta, pe aceeaşi maşina fizică. Fiecare maşină virtuală are propriul ei set <strong>de</strong> hardwere (RAM, CPU, NIC, etc)<br />
pe care este încărcat un sistem <strong>de</strong> operare cu tot cu aplicaţii. Maşinile virtuale sunt încapsulate în fişiere, făcând<br />
posibilă copierea şi salvarea rapidă a maşinii. Întregul sistem poate fi mutat în câteva secun<strong>de</strong> (sistemul <strong>de</strong><br />
operare, aplicaţiile, Bios-ul virtual, hardware-ul virtual).<br />
Există două categorii <strong>de</strong> virtualizare: virtualizare pe platformă (implică simularea maşinilor virtuale) şi<br />
virtualizare pe resurse (implică simularea combinării, simplificării sau fragmentării resurselor. Termenul <strong>de</strong><br />
virtualizare este o creaţie a maşinii virtuale, folosind o combinaţie între hardware şi software. Virtualizarea pe<br />
platformă conţine o platformă hard şi un program <strong>de</strong> control.[2]
HAL (Hardware Abstraction Layer)<br />
La nivelul superior, HAL este doar o cale <strong>de</strong> a permite unui număr <strong>de</strong> „blocuri <strong>de</strong> construcţie” să fie<br />
încărcate si interconectate pentru a reuni un sistem complex. Partea „Hardware” este pentru că HAL a fost iniţial<br />
conceput să uşureze configurarea EMC-ului pentru o plajă largă <strong>de</strong> echipamente hardware. Multe dintre<br />
blocurile <strong>de</strong> construcţie sunt drivere pentru echipamentele hardware. Totuşi, HAL poate face mai mult <strong>de</strong>cât<br />
doar configurarea unor drivere <strong>de</strong> echipamente.<br />
HAL se bazează pe aceleaşi principii care sunt folosite în proiectarea circuitelor şi sistemelor hardware,<br />
<strong>de</strong>ci se recomandă studierea acelor principii înainte. Orice sistem (incluzând un echipament CNC = computer<br />
numerical control), constă în componentele interconectate. Pentru echipamentul CNC, acele componente pot fi<br />
controller-ul principal, amplificatoare servo, motoare, codificatoare. Constructorul maşină trebuie să aleagă, sa<br />
monteze şi să cableze aceste părţi pentru a realiza întregul sistem.<br />
Cum funcŃionează HAL ?<br />
Constructorul maşină nu trebuie să aibă grijă <strong>de</strong> fiecare componentă, luând-o ca atare. La nivelul <strong>de</strong><br />
proiectare, el <strong>de</strong>ci<strong>de</strong> ce componente va folosi. Decizile sunt luate în funcţie <strong>de</strong> ce face fiecare componentă şi <strong>de</strong><br />
specificaţiile furnizate <strong>de</strong> producător.<br />
Proiectantul unui sistem hardware nu numai că alege componentele, dar şi <strong>de</strong>ci<strong>de</strong> cum vor fi<br />
interconectectate acestea cu ajutorul unei schiţe ce arată toate legăturile.<br />
De îndată ce schiţa este gata, se trece la constuirea maşinii. HAL posedă mai multe utilitare să ajute la<br />
construirea sistemului. Unele dintre acestea permit conectarea/<strong>de</strong>conectarea unui singur fir, iar altele păstrarea<br />
listei complete <strong>de</strong> componente, fire şi alte informaţii <strong>de</strong>spre sistem, astfel încât să poată fi „reconstruit” printr-o<br />
singură comandă.<br />
Foarte puţine maşini funcţionează cum trebuie <strong>de</strong> prima dată. Pe durata testării, constructorul poate<br />
folosi diverse aparate <strong>de</strong> măsura pentru a verifica parametrii <strong>de</strong> funcţionare. Este posibil să gaseasca o problema<br />
care poate duce la schimbarea schiţei. HAL furnizează echivalente software pentru voltmetru, osciloscop,<br />
generator <strong>de</strong> semnal şi alte utilitare pentru a testa si calibra un sistem.<br />
Componentele HAL<br />
1.3.1 Programe externe<br />
- motion - un modul în timp real ce acceptă comenzi <strong>de</strong> mişcare NML şi interacţionează cu HAL.<br />
- iocontrol - un modul <strong>de</strong> spaţiu al utilizatorului ce acceptă comenzi <strong>de</strong> I/O NML şi interacţionează cu HAL<br />
- classiclad<strong>de</strong>r - un PLC (Programmable logic controller) care foloseşte HAL pentru toate I/O (intrări/ieşiri)<br />
- halui - un program <strong>de</strong> spaţiu al utilizatorului ce interacţionează cu HAL şi trimite comenzi NML.[1]
1.3.2 Componente interne<br />
- stepgen - generator <strong>de</strong> puls<br />
- enco<strong>de</strong>r - numărător codificator bazat pe software<br />
- pid - bucle <strong>de</strong> control proporţionale/integratoare/<strong>de</strong>rivatoare<br />
- siggen - generator <strong>de</strong> testare a un<strong>de</strong>lor sinusoidale / cosinusoidale / triunghiulare / pătratice<br />
- supply - o simplă sursă <strong>de</strong> testare<br />
- blocks - combinaţii <strong>de</strong> componente uzuale (mux, <strong>de</strong>mux, or, and, integ, ddt, limit, wcomp)<br />
1.3.3 Utilitare<br />
- halcmd - utilitar cu linie <strong>de</strong> comandă pentru configurare si ajustare<br />
- halgui - utilitar GUI (Graphical user interface) pentru configurare si ajustare (neimplementat incă)<br />
- halmeter - un multimetru <strong>de</strong> mână pentru semnale HAL<br />
- halscope - un osciloscop cu stocare digitală pentru semnale HAL [1]<br />
Maşina virtuală JAVA<br />
Limbajul Java reprezintă un limbaj <strong>de</strong> programare orientat pe obiecte, <strong>de</strong>zvoltat la origine <strong>de</strong> firma SUN<br />
Microsystems şi <strong>de</strong>venit public în 1995 ca parte componentă a platformei Java <strong>de</strong>zvoltată <strong>de</strong> Sun. Sintaxa acestui<br />
limbaj este asemănătoare cu a limbajelor <strong>de</strong> nivel înalt C şi C++, însă <strong>de</strong>osebirile dintre cele două sunt<br />
importante.<br />
Fundamentul platformei Java este dat <strong>de</strong> maşina virtuală, reprezentând mediul în care se execută<br />
programele. Astfel, orice limbaj Java compilat, corect scris, poate fi rulat pe orice computer pe care e instalată o<br />
maşină virtuală [4], in<strong>de</strong>pen<strong>de</strong>nt <strong>de</strong> arhitectura acestuia. Acest lucru este posibil <strong>de</strong>oarece, în urma compilării,<br />
sursele sunt transformate în byteco<strong>de</strong>, acesta reprezentând formatul standard intermediar între codul maşină şi<br />
codul sursă.<br />
ComponenŃa maşinii virtuale Java<br />
Maşina virtuală Java poate fi împărţită în mai multe componente:<br />
• ClassLoa<strong>de</strong>r: se ocupă cu aducerea fişierelor byteco<strong>de</strong> necesare execuţiei programului, fişiere ce se pot<br />
găsi pe orice <strong>calcul</strong>ator dintr-o reţea dată;<br />
• Byteco<strong>de</strong> Verifier: este utilizat pentru a verifica dacă fişierele <strong>de</strong> tip byteco<strong>de</strong> respectă setul <strong>de</strong> reguli<br />
Java; fişierele ce nu sunt în concordanţă cu aceste norme sunt respinse;
• Interpreter + Java RunTime: se folosesc pentru analiza şi transformarea fiecărei instrucţiuni <strong>de</strong> tip<br />
byteco<strong>de</strong> din cod maşină în instrucţiuni ale maşinii reale. Deoarece maşina virtuală Java constituie un<br />
nivel suplimentar <strong>de</strong>asupra platformei <strong>de</strong> lucru (componente hardware şi sistem <strong>de</strong> operare) execuţia<br />
programelor Java este mai lentă <strong>de</strong>cât execuţia codurilor native;<br />
• JIT (Just-in-Time): oferă ca soluţie pentru problema expusă anterior o executare a programului printr-un<br />
compilator JIT ce transferă din primul moment programul Java în instrucţiuni ale procesorului, reuşind<br />
astfel să crească viteza <strong>de</strong> execuţie a programelor;<br />
• Garbage Collector: reprezintă componenta ce se ocupă <strong>de</strong> eliberarea zonelor <strong>de</strong> memorie alocate ce nu<br />
mai sunt utilizate <strong>de</strong> program. Specificaţiile maşinii virtuale nu impun un algoritm <strong>de</strong> <strong>de</strong>zalocare, lăsând<br />
stabilirea acestuia la latitudinea celui ce implementează aplicaţia. Cu toate acestea, <strong>de</strong>oarece în Java nu<br />
îi este permis programatorului să aibă acces la resurse, <strong>de</strong> ocuparea şi eliberarea propriu-zisă se ocupă<br />
mediul <strong>de</strong> execuţie;<br />
• Security Manager: asigură respectarea restricţiilor <strong>de</strong> securitate impuse <strong>de</strong> lucrul cu sisteme <strong>de</strong>schise.<br />
Arhitectura maşinii virtuale asigură un control foarte fin asupra acţiunilor pe care aplicaţia are voie să le<br />
întreprindă în interiorul maşinii. Astfel, această parte este concepută pentru a asigura execuţia în<br />
siguranţă a unui cod „nesigur” provenit din surse în<strong>de</strong>părtate, caracteristică utilizată în<strong>de</strong>osebi <strong>de</strong> către<br />
applet-uri ce rulează pe maşini virtuale încorporate în browser-ele folosite <strong>de</strong> către utilizatori şi care<br />
execută codurile <strong>de</strong>scărcate <strong>de</strong> pe server-ele http <strong>de</strong> la distanţă.<br />
Caracteristici<br />
Maşina virtuală Java poate fi consi<strong>de</strong>rată un <strong>calcul</strong>ator abstract, dispunând, ca şi <strong>calcul</strong>atoarele reale, <strong>de</strong><br />
un set <strong>de</strong> instrucţiuni, unul <strong>de</strong> registre şi diferite zone <strong>de</strong> memorie. Aplicaţiile scrise în Java nu sunt astfel<br />
compilate pentru o platformă anume, ducând la o separare <strong>de</strong> platformă a limbajului. Nefiind impusă o<br />
implementare anume, maşina virtuală se poate implementa ca interpretor <strong>de</strong> cod binar, compilator (generează<br />
cod nativ), sau pe Siliciu, dar păstrând funcţionalitatea. Arhitectura JVM, este, ca a majorităţii maşinilor virtuale,<br />
<strong>de</strong> tip stivă.<br />
Această maşină virtuală foloseşte un byteco<strong>de</strong> obţinut, <strong>de</strong> obicei, din codul sursă al programului scris în<br />
Java. Deoarece acest lucru nu este necesar, un JVM poate fi folosit şi pentru implementarea altor programe,<br />
cum ar fi, <strong>de</strong> exemplu Ada. Pentru o securitate sporită, fişierelor cu extensia „.class” (byteco<strong>de</strong>-ul) li se impun<br />
constrângeri importante, atât în ceea ce priveşte formatul, cât şi structura.<br />
În paralel cu maşina virtuală, sunt distribuite o serie <strong>de</strong> librării care formează aşa-numitul Java API<br />
(Application Programming Interface). Deoarece cele două componente trebuie să se susţină reciproc, ele sunt<br />
încorporporate în Java Runtime Environment. Această structură este reprezentată în schema <strong>de</strong> mai jos:
Arhitectura maşinii virtuale Java<br />
Structura Java Runtime Environment [5]<br />
Maşina virtuală Java are o arhitectură <strong>de</strong> tip stivă, această structură fiind folosită pentru furnizarea<br />
parametrilor pentru operaţii, preluarea rezultatelor, transferarea parametrilor meto<strong>de</strong>lor ş.a.m.d. Ca şi în orice<br />
alt limbaj si în Java stack frame-ul are o structură ce conţine 3 elemente: variabilele locale, mediul <strong>de</strong> execuţie şi<br />
stiva <strong>de</strong> operanzi. În timpul apelării unei meto<strong>de</strong> se va aloca spaţiu pentru variabilele locale şi mediul <strong>de</strong><br />
execuţie, în timp ce pentru stiva <strong>de</strong> operanzi schimbările vor surveni în timpul execuţiei.<br />
Variabilele locale reprezintă un format stocat pe 32 <strong>de</strong> biţi, pentru valorile datelor reprezentate prin<br />
tipuri <strong>de</strong> date long şi double fiind alocate câte două variabile locale. Aceste elemente sunt stocate într-un vector,<br />
fiind adresate prin registrul „vars” şi încărcate cu ajutorul stivei <strong>de</strong> operanzi.<br />
Mediul <strong>de</strong> execuţie este o componentă a ferestrei <strong>de</strong> stivă utilizată pentru păstrarea operaţiilor<br />
efectuate aici. Ea conţine informaţii ce se folosesc la <strong>de</strong>panare, precum şi pointeri către fereastra <strong>de</strong> stivă<br />
prece<strong>de</strong>ntă şi către baza şi vârful stivei <strong>de</strong> operanzi şi variabilele locale.<br />
Stiva <strong>de</strong> operanzi funcţionează după principiul First-In-First-Out (FIFO) şi are dimensiunea <strong>de</strong> 32 <strong>de</strong> biţi.<br />
Aici se stochează argumentele şi rezultatele obţinute în urma încărcării instrucţiunilor maşinii virtuale Java,<br />
pentru fiecare tip <strong>de</strong> date putând fi utilizate numai operaţii specifice.<br />
O importanţă <strong>de</strong>osebită o au şi clauzele „catch” conţinute în fiecare metodă din Java. Fiecare clauză se<br />
ocupă <strong>de</strong> tratarea excepţiilor, aici fiind inclus domeniul pentru care este activă, tipul excepţiei tratate, precum şi
modalitatea <strong>de</strong> rezolvare a problemei. La aruncarea oricărei excepţii se va executa o căutare în lista „catch”,<br />
corespon<strong>de</strong>nţele fiind vali<strong>de</strong> în cazul în care excepţia tratată este inclusă în domeniul în care este validă clauza,<br />
sau dacă aceasta este <strong>de</strong>rivată din excepţia tratată. Dacă cele două elemente sunt compatibile se vor executa<br />
comenzile din blocul ce tratează excepţia, în caz contrar aceasta fiind aruncată la un nivel superior aceluia în<br />
care a apărut. [1]<br />
Mediul <strong>de</strong> execuŃie<br />
Orice program ce se doreşte a fi utilizat <strong>de</strong> către o JVM trebuie compilat într-un format binar standard,<br />
ce conţine extensia „.class”. Aceste programe pot conţine clase multiple aflate în fişiere diferite, <strong>de</strong> aceea este<br />
preferată utilizarea arhivelor Java (fişiere „.jar”) pentru manevrarea programelor <strong>de</strong> dimensiuni extinse.<br />
Deşi maşina virtuală Java a fost concepută la bază pentru rularea programelor Java compilate anterior şi<br />
alte programe pot fi acum astfel rulate. [2] Printre aceste programe compatibile se numără Ruby (se utilizează<br />
JRuby), JavaScript (cu Rhino) sau Phyton (cu Jytho). În prezent, Java are <strong>de</strong> asemenea implementat suport pentru<br />
clasele şi meto<strong>de</strong>le ce se modifică dinamic, lucru posibil însă numai în mediile <strong>de</strong> <strong>de</strong>panare.<br />
Execuţia oricărui program se <strong>de</strong>sfăşoară în jurul duratei <strong>de</strong> viaţă a maşinii virtuale, a claselor, interfeţelor<br />
şi obiectelor care formează un program. Maşina virtuală porneşte execuţia în momentul în care este apelată<br />
metoda „main” a unei clase prin trimiterea unui singur argument, sub forma unui şir <strong>de</strong> caractere. Astfel, clasele<br />
utilizate sunt încărcate, iniţializate şi conectate cu celelalte tipuri folosite. Pentru acestea, metoda „main”<br />
trebuie <strong>de</strong>clarată public, static şi void (exemplu: public static void main(String Args[]) {}).<br />
Încărcarea este efectuată <strong>de</strong> către ClassLoa<strong>de</strong>r şi subclasele conţinute <strong>de</strong> acesta. De asemenea, un rol<br />
suplimentar al ClassLoa<strong>de</strong>r-ului este acela <strong>de</strong> a semnala erori din timpul încărcarii claselor prin aruncarea <strong>de</strong><br />
excepţii.<br />
Conectarea are loc în urma încărcării şi foloseşte forma binară a unei clase sau interfeţe şi intercalarea în<br />
procesul <strong>de</strong> rulare al maşinii virtuale. Activităţile implicate în procesul <strong>de</strong> conectare sunt: verificarea, pregătirea<br />
şi analiza referinţelor simbolice.<br />
Iniţializarea unei clase cuprin<strong>de</strong> executarea iniţializatorilor statici pentru câmpuri şi meto<strong>de</strong> <strong>de</strong>clarate în<br />
clasă. Pentru interfeţe, iniţializarea cuprin<strong>de</strong> câmpurile din interfaţă. Înainte <strong>de</strong> acest proces, trebuiesc<br />
iniţializate întâi superclasele, dar nu şi interfeţele implementate <strong>de</strong> clasa în discuţie. În mod similar,<br />
superinterfeţele trebuiesc şi ele iniţializate înaintea interfeţei <strong>de</strong> bază.<br />
Maşina virtuală Java îşi încheie activitatea atunci când se întâmplă unul din următoarele lucruri:<br />
• toate thread-urile sunt terminate;<br />
• unul din thread-uri invocă metoda „exit” a clasei Runtime sau System şi operaţia <strong>de</strong> ieşire este permisă<br />
<strong>de</strong> către managerul <strong>de</strong> securiatate.<br />
Formatul byteco<strong>de</strong><br />
Limbajul Java este consi<strong>de</strong>rat a fi un limbaj sigur, în sensul că nici un utilizator nu poate să afecteze<br />
funcţionarea maşinii gazdă, să intervină într-un mod nea<strong>de</strong>cvat în operaţiile efectuate <strong>de</strong> aceasta sau ca funcţiile<br />
şi structurile <strong>de</strong> date ce aparţin codului „sigur” să nu fie afectate sau corupte <strong>de</strong> un cod consi<strong>de</strong>rat „nesigur” ce
ulează pe aceeaşi maşină virtuală. Mai mult, se consi<strong>de</strong>ră că se poate împiedica apariţia erorilor comune <strong>de</strong><br />
programare, cum ar fi <strong>de</strong>păşirea dimensiunilor unui array sau folosirea <strong>de</strong> pointeri neiniţializaţi, care duc la un<br />
comportament neprevăzut al compilatorului sau la afectarea datelor existente.<br />
Pentru a evita aceste probleme, maşina virtuală Java verifică byteco<strong>de</strong>-ul înainte <strong>de</strong> execuţie, verificare<br />
ce se <strong>de</strong>sfăşoară în 3 paşi:<br />
• toate variabilele indică locaţii vali<strong>de</strong> din memorie;<br />
• datele sunt întoat<strong>de</strong>auna iniţializate;<br />
• accesul la datele <strong>de</strong>clarate „private” este strict controlat.<br />
Primele două din aceste etape au loc în timpul pasului <strong>de</strong> „verificare”, care are loc atunci când o clasă<br />
este încărcată şi gata pentru a fi folosită. Cel <strong>de</strong> al treilea pas se efectuează în mod dinamic, atunci când datele<br />
sau meto<strong>de</strong>le unei clase sunt pentru prima oară accesate <strong>de</strong> o altă clasă. Această verificare impune anumite<br />
restricţii asupra programelor vali<strong>de</strong>, cum ar fi cele ce afectează instrucţiunile <strong>de</strong> salt care pot face referire numai<br />
la funcţii din aceeaşi funcţie sau metodă. De asemenea, verificarea byteco<strong>de</strong>-ului oferă siguranţa că mo<strong>de</strong>lele<br />
arbitrare <strong>de</strong> biţi nu se pot folosi ca şi adrese vali<strong>de</strong>. Astfel, protecţia memoriei este asigurată fără utilizarea unei<br />
MMU (Memory Management Unit), iar JVM-ul <strong>de</strong>vine o metodă eficientă pentru protecţia memoriei chiar şi pe<br />
arhitecturi simple.<br />
Aşa cum s-a precizat, byteco<strong>de</strong>-ul reprezintă tipul <strong>de</strong> instrucţiuni pe care maşina virtuală Java poate să îl<br />
execute, reprezentând echivalentul <strong>de</strong> limbaj <strong>de</strong> asamblare a unei aplicaţii Java. La fel ca orice aplicaţie C,<br />
rezultatul obţinut în urma compilării este un cod binar, cu <strong>de</strong>osebirea că aici nu este strâns legat <strong>de</strong> un<br />
microprocesor.<br />
Instrucţiunile Java sunt formate dintr-un opco<strong>de</strong> şi operanzi. Opco<strong>de</strong>-ul are lungimea <strong>de</strong> un octet, în<br />
timp ce operandul este <strong>de</strong> lungime variabilă. Cu toate acestea, nu toate cele 256 <strong>de</strong> instrucţiuni posibile sunt<br />
utilizate, existând un anumit număr ce sunt mereu libere. [5] Operanzii cu lungimi mai mari <strong>de</strong> un octet se vor<br />
păstra în memorie folosind mo<strong>de</strong>lul „big endian”, în care octetul cel mai semnificativ este primul.<br />
Operanzii din memoria <strong>de</strong> date a JVM-ului sunt prelucrate <strong>de</strong> instrucţiunile binare Java ca aparţinând<br />
unui grup redus <strong>de</strong> tipuri primitive. Aceste tipuri <strong>de</strong> date primitive pot fi: byte, short, int, long, char, floar, double<br />
sau boolean. Ele sunt tratate <strong>de</strong> către compilator şi nu <strong>de</strong> programul Java compilat sau mediul <strong>de</strong> execuţie Java,<br />
instrucţiunile Java conţinând cod operaţie separat pentru diferitele tipuri <strong>de</strong> date primitive.<br />
Maşina virtuală Java conţine instrucţiuni pentru următoarele grupuri <strong>de</strong> sarcini:<br />
• operaţii aritmetice;<br />
• conversii;<br />
• încărcare şi înmagazinare;<br />
• crearea şi manipularea <strong>de</strong> obiecte;<br />
• controlul stivei cu operanzi;<br />
• controlul transferurilor;<br />
• apelarea meto<strong>de</strong>lor şi elementele returnate;<br />
• aruncarea <strong>de</strong> excepţii;
Toate aceste reprezentări binare au ca scop compatibilitatea între sisteme, <strong>de</strong>oarece fiecare sistem <strong>de</strong><br />
operare <strong>de</strong> pe unităţile <strong>de</strong> prelucrare are nevoie <strong>de</strong> versiunea proprie <strong>de</strong> JVM. Aceste maşini virtuale<br />
interpretează însă byteco<strong>de</strong>-ul similar din punct <strong>de</strong> ve<strong>de</strong>re semantic, <strong>de</strong>şi implementările pot să difere <strong>de</strong> la caz<br />
la caz. Un caz mai special <strong>de</strong>cât cel legat <strong>de</strong> portabilitatea byteco<strong>de</strong>-ului este dat <strong>de</strong> implementare eficientă a<br />
Java API, care trebuie sa fie în concordanţă cu cerinţele fiecărui sistem <strong>de</strong> operare.<br />
Din punctul <strong>de</strong> ve<strong>de</strong>re al unui compilator, byteco<strong>de</strong>-ul reprezintă doar un alt tip <strong>de</strong> procesor cu un set <strong>de</strong><br />
instrucţiuni care poate trata codul generat. Astfel, <strong>de</strong>şi maşina virtuală Java a fost iniţial concepută pentru a<br />
executa programe scrise în limbajul Java, aceasta oferă un mediu <strong>de</strong> execuţie în format byteco<strong>de</strong> în<strong>de</strong>ajuns <strong>de</strong><br />
<strong>de</strong>zvoltat pentru a suporta compilări ale programelor scrise în alte limbaje.<br />
Fişiere <strong>de</strong> tip „.class”<br />
În urma compilării, fişierul ce trebuie executat <strong>de</strong> către maşina virtuală Java este reprezentat utilizând<br />
un format binar hardware şi in<strong>de</strong>pen<strong>de</strong>nt <strong>de</strong> sistemul <strong>de</strong> operare, gasit <strong>de</strong> obicei în fişiere cu extensia „.class”.<br />
Acest format <strong>de</strong>fineşte în mod precis şi <strong>de</strong>taliat reprezentarea unei clase sau a unei interfeţe. [3]<br />
Constrângeri ale codului utilizat <strong>de</strong> JVM<br />
Codul maşinii virtuale Java pentru o metodă, metodă <strong>de</strong> iniţializare a instanţelor, sau meto<strong>de</strong> <strong>de</strong><br />
iniţializare a claselor şi meto<strong>de</strong>lor sunt localizate în structura method_info a unui fişier „.class”. Constrângerile<br />
care sunt asociate cu conţinutul structurii Co<strong>de</strong>_attribute se împart în două categorii: constrângeri statice şi<br />
constrângeri structurale. [6]<br />
Constrângerile statice asupra unui fişier <strong>de</strong> tip „.class” sunt acelea care <strong>de</strong>finesc corectitudinea<br />
formatului acestui tip <strong>de</strong> fişier. Aceste constrângeri impuse asupra codului din maşina virtuală Java arată<br />
structura instrucţiunilor maşinii virtuale şi operanzii ce vor fi folosiţi pentru fiecare instrucţiune.<br />
Din constrângerile legate <strong>de</strong> instrucţiunile aflate în vectorul <strong>de</strong> instrucţiuni şi operazi putem aminti:<br />
• Valoarea elementului co<strong>de</strong>_legth nu poate fi 0 şi trebuie să fie mai mică <strong>de</strong>cât 65536;<br />
• Opco<strong>de</strong>-ul primei instrucţiuni din tabloul co<strong>de</strong> are întot<strong>de</strong>auna in<strong>de</strong>xul 0;<br />
• Pentru fiecare instrucţiune din vectorul <strong>de</strong> instrucţiuni, cu excepţia ultimeia, in<strong>de</strong>xul opco<strong>de</strong>-ului<br />
următoarei instrucţiuni trebuie să fie egal cu in<strong>de</strong>xul opco<strong>de</strong>-ului <strong>de</strong> la instrucţiunea curentă la care se<br />
adaugă lungimea instrucţiunii în discuţie, incluzând toţi operanzii;<br />
• Registrul la care face referire o instrucţiune <strong>de</strong> salt trebuie să fie un opco<strong>de</strong> al unei instrucţiuni din<br />
aceeaşi metodă;<br />
Constrângerile structurale coordonează relaţiile dintre instrucţiunile maşinii virtuale Java. Dintre<br />
acestea putem menţiona:<br />
• Fiecare instrucţiune trebuie executată în funcţie <strong>de</strong> tipul şi numărul <strong>de</strong> argumente din vectorul<br />
variabilelor locale. Cu toate acestea, o instrucţiune ce operează asupra unei valori <strong>de</strong> tip int poate să
prelucreze şi date <strong>de</strong> tipul boolea, byte, char şi short, <strong>de</strong>oarece maşina virtuală Java converteşte<br />
automat aceste tipuri la tipul int;<br />
• În timpul execuţiei nu se poate schimba ordinea dintr-o pereche <strong>de</strong> variabile locale ce conţin elemente<br />
<strong>de</strong> tip long sau double;<br />
• Nici o variabilă locală nu poate fi accesată înainte <strong>de</strong> iniţializare;<br />
• Înaintea accesării unei meto<strong>de</strong> sau instanţe a unei variabile, instanţa clasei ce conţine metoda sau<br />
variabila trebuie să fi fost <strong>de</strong>ja iniţializată;<br />
• La apelul unei meto<strong>de</strong>, argumentele utilizate trebuie să fie compatibile cu tipul utilizat în <strong>de</strong>scrierea<br />
meto<strong>de</strong>i;<br />
• Fiecare element returnat trebuie să aibă tipul specificat în <strong>de</strong>scrierea meto<strong>de</strong>i. Toate meto<strong>de</strong>le <strong>de</strong><br />
iniţializare, fie ele pentru clase sau interfeţe, sau meto<strong>de</strong>le ce returnează void trebuie să utilizeze numai<br />
instrucţiunea „return”. Pentru meto<strong>de</strong>le ce returnează date <strong>de</strong> tip boolean, byte, char, short sau int se<br />
foloseşte instrucţiunea „ireturn”, în timp ce pentru meto<strong>de</strong> ce returnează o referinţă la obiect se va<br />
utiliza „areturn”;<br />
• Nici o valoare <strong>de</strong> tipul returnAddress nu poate fi accesată folosind o variabilă locală.<br />
În fişierele <strong>de</strong> tip „.class” se mai întâlnesc următoarele limitări:<br />
• În rezerva <strong>de</strong> constante (constant pool) asociate fiecărei clase Java se va păstra numele tuturor<br />
câmpurilor, meto<strong>de</strong>lor şi informaţiile ce pot fi utilizate <strong>de</strong> orice metodă a clasei. Această rezervă se<br />
comportă ca o limitare internă a complexităţii clasei sau interfeţei create, <strong>de</strong>oarece dimensiunea ei nu<br />
poate <strong>de</strong>păşi 65535 <strong>de</strong> instrări;<br />
• Numărul <strong>de</strong> câmpuri ce pot fi <strong>de</strong>clarate în interiorul unei clase sau interfeţe este limitat la 65535 <strong>de</strong><br />
către valoarea elementului „fields_count”. Această valoare nu inclu<strong>de</strong> însă câmpuri moştenite <strong>de</strong> la<br />
superclase sau superinterfeţe;<br />
• Numărul <strong>de</strong> meto<strong>de</strong> ce pot fi <strong>de</strong>clarate într-o clasă sau interfaţă este dat <strong>de</strong> valoarea maxima <strong>de</strong> 65535 a<br />
valorii lui „methods_count” din structura ClassFile, în această valoare nefiind incluse meto<strong>de</strong>le<br />
moştenite;<br />
• Numărul <strong>de</strong> superinterfeţe sau <strong>de</strong> superclase este şi el limitat <strong>de</strong> aceeaşi valoare (65535) prin valoarea<br />
maximă a elementului interfaces_count;<br />
• Într-o metodă, numărul parmetrilor este limitat la 255 în <strong>de</strong>finirea <strong>de</strong>scriptorului meto<strong>de</strong>i, în această<br />
limită fiind inclus un loc şi pentru cuvântul cheie „this”, în cazul în care se invocă o instanţă sau interfaţă<br />
a respectivei meto<strong>de</strong>. Descriptorul meto<strong>de</strong>i este <strong>de</strong>finit în funcţie <strong>de</strong> dimensiunea parametrilor, astfel că<br />
limita se reduce în cazul utilizării tipurilor long sau double cărora le sunt alocate două unităţi;<br />
• Lungimea numelor câmpurilor şi meto<strong>de</strong>lor, <strong>de</strong>scriptorilor <strong>de</strong> câmpuri şi meto<strong>de</strong> sau alte string-uri cu<br />
valoare constantă trebuie să aibă dimensiuni mai mici <strong>de</strong> 65535 <strong>de</strong> caractere datorită dimensiunii pe 16<br />
biti a elementului length din structura CONSTANT_Utf8_info. Limita este <strong>de</strong> fapt impusă asupra<br />
numărului <strong>de</strong> octeţi si nu asupra numărului <strong>de</strong> caractere codate, <strong>de</strong> aceea string-urile ce conţin<br />
caractere codate pe mai mulţi octeţi sunt supuse unor limitări mai importante.
VMware<br />
VMware este o maşina virtuală ce permite accesul la sisteme <strong>de</strong> operare diferite <strong>de</strong> sistemul <strong>de</strong> operare<br />
nativ. Spre exemplu pe o platformă hardware ce rulează sistemul Windows XP se poate rula simultan un alt<br />
sistem <strong>de</strong> operare cum ar fi Linux sau o altă versiune <strong>de</strong> Windows.<br />
VMware se bazează pe o arhitectură <strong>de</strong> tip Pentium (sau superioară acesteia) şi este disponibilă pentru<br />
sistemele <strong>de</strong> operare: Windows NT, Windows 2000, Windows XP şi Linux. Maşina virtuală funcţionează pe o<br />
platformă hardware reală copiind arhitectura acesteia. Astfel dacă avem la dispoziţie o arhitectură Intel Core 2<br />
atunci maşina virtuală va prelua toate elementele acesteia (setul <strong>de</strong> instrucţiuni, accesul la memorie etc.) şi nu<br />
va funcţiona ca un alt tip <strong>de</strong> arhitectură Pentium.<br />
Ca principiu <strong>de</strong> funcţionare maşina virtuală VMware se comportă asemănător unui emulator însă cu<br />
câteva diferenţe majore. Emulatorul se bazează pe resurse software interceptând şi interpretând instrucţiunile<br />
maşinii client pe când VMware interceptează şi transmite platformei hardware reale instrucţiunile. Rezultă <strong>de</strong><br />
aici mai multe avantaje printre care cele mai importante sunt viteza <strong>de</strong> lucru mai mare şi reducerea probabilităţii<br />
<strong>de</strong> apariţie a erorilor. Creşterea vitezei este rezultatul direct al modului în care sunt tratate instrucţiunile. Dacă<br />
la emulator acestea sunt tratate la nivel software la VMware acestea sunt preluate <strong>de</strong> hardware-ul maşinii<br />
gazdă. Sunt astfel diminuate şi sansele <strong>de</strong> a apărea erori întrucât procesorul gaz<strong>de</strong>i are mult mai puţine şanse să<br />
genereze erori <strong>de</strong>cât o aplicaţie software. Totuşi, viteza <strong>de</strong> lucru a sistemului client este mai scazută <strong>de</strong>cât a<br />
sistemului gazdă întrucât este nevoie <strong>de</strong> timp pentru a comunica între hardware-ul virtual şi cel real.[7]<br />
AplicaŃiile VMware<br />
Una dintre cele mai importante întrebuinţări ale VMware este aceea <strong>de</strong> a testa noile sisteme <strong>de</strong><br />
operare. În principiu, pentru testarea unui sistem <strong>de</strong> operare este nevoie <strong>de</strong> un <strong>calcul</strong>ator fizic, fiind nevoie ca<br />
pentru orice modificare în nucleu (kernel) să se facă o restartare a întregului sistem. Testarea pe un alt <strong>calcul</strong>ator<br />
este iarăşi o soluţie consumatoare <strong>de</strong> timp fiind permanent nevoie <strong>de</strong> a se copia informaţiile <strong>de</strong> pe o maşină pe<br />
alta. VMware elimină această necesitate întrucât noul sistem poate fi rulat pe acelaşi <strong>calcul</strong>ator, împărţind<br />
acelaşi mediu <strong>de</strong> stocare fizic cu maşina pe care este <strong>de</strong>zvoltat. Datele pot fi astfel transferate foarte uşor,<br />
<strong>de</strong>panarea este mult mai facilă întrucât VMware pune la dispoziţie unele instrumente specifice (Snapshot<br />
Record) precum şi un disc <strong>de</strong> revenire în caz ca sistemul client ce<strong>de</strong>ază pentru a-l readuce la setările iniţiale.<br />
VMware este folosit <strong>de</strong> asemenea şi la simularea şi testarea retelelor, acestea putând fi create la nivel<br />
virtual fără cabluri sau terminale fizice. Se pot stabili legături <strong>de</strong> tip client-client sau client server între gazdă şi<br />
sistemul <strong>de</strong> operare găzduit. Toate setările pot fi efectuate <strong>de</strong> pe un singur <strong>calcul</strong>ator şi se pot testa oricâte<br />
conexiuni simultane fără posibilitatea <strong>de</strong> supraîncărcare şi apariţie a fenomenului <strong>de</strong> bottleneck la nivelul<br />
reţelei. [7]
Dispozitivele VMware<br />
1. Magistralele<br />
Sunt trei dispozitive <strong>de</strong> bază pe care VMware le simulează. Ca la orice sistem <strong>de</strong> <strong>calcul</strong> acestea sunt:<br />
procesorul, memoria şi dispozitivele Input/Output. La un <strong>calcul</strong>ator obişnuit procesorul este conectat <strong>de</strong> restul<br />
componentelor prin intermediul magistralelor (bus), acest lucru fiind necesar să fie implementat şi pentru<br />
maşina virtuală. VMware are două magistrale virtuale, prima dintre ele cu o funcţionare similară mo<strong>de</strong>lului PCI,<br />
iar cea <strong>de</strong>-a doua <strong>de</strong>numită PCI-to-ISA bridge. ISA este un standard hardware vechi, provenit <strong>de</strong> la sistemele<br />
IBM, la care s-a renunţat din cauza unor limitări ale acestuia. Una dintre limitări ţine <strong>de</strong> controlul întreruperilor.<br />
Dispozitivele trimit cereri <strong>de</strong> întreruperi prin magistrală către UPC. Acesta îşi încetează activitatea şi procesează<br />
întreruperea. ISA numerotează aceste întreruperi (IRQ) pentru a le diferenţia. Din păcate pentru ISA nu sunt<br />
foarte multe numere, iar atunci când apare situaţia în care două întreruperi poartă acelaşi numere, rezultă<br />
conflicte grave. Acest lucru este rezolvat <strong>de</strong> PCI care nu are numere fixe pentru întreruperi, iar întreruperile PCI<br />
poartă mai multă informaţie astfel încât într-o singură întrerupere PCI şi mai multe dispozitive pot împărţi<br />
acelaşi IRQ.<br />
SCSI<br />
SVG<br />
A<br />
Magistrala PCI<br />
Ethernet<br />
VMware – hardware real si virtual [1]<br />
În figură, partea virtuală este încadrată în chenarul punctat. Se observă foarte bine cum dispozitivele<br />
sunt conectate la UCP prin intermediul magistralei PCI şi a PCI-to-ISA bridge şi a interfeţelor acestora.<br />
2. Discurile IDE şi CD-ROM<br />
UPC<br />
IDE Sunet Altele<br />
PCI-to-ISA bridge<br />
MMU<br />
Memorie<br />
VMware posedă două controllere IDE (Integrated Device Electronics) numite primar şi secundar.<br />
Hardware-ul virtual pentru acestea este chipsetul Intel 82371AB PIIX3 având porturile IRQ asignate ca în tabelul<br />
<strong>de</strong> mai jos:
Interfata IRQ Porturile I/O<br />
Primar 14 0x01f0 – 0x01f7, 0x03f6<br />
Secundar 15 0x0170 – 0x0177, 0x0376<br />
Ca orice interfaţă IDE aceste porturi pot suporta maximum două dispozitive (numite master şi slave),<br />
fiind limitate în cazul VMware la discurile CD-ROM/DVD-ROM, CD-R şi CD-RW care pot fi configurate în mai<br />
multe moduri. Aceste discuri sunt stocate pe suportul hardware real sub formă <strong>de</strong> imagini virtuale, ocupand o<br />
parte din spatiul discului real. Un disk “raw” este o mapare a discurilor sistemelor gazdă ce poate fi folosită sub<br />
VMware. Un avantaj al acestor discuri virtuale e că se pot manipula mult mai uşor şi se pot folosi imagini virtuale<br />
<strong>de</strong> pe sistemul gazdă. [14]<br />
3. Discurile SCSI (Small Computer System Interface)<br />
SCSI e un standard <strong>de</strong> magistrală folosit la <strong>calcul</strong>atoarele personale, in<strong>de</strong>pen<strong>de</strong>nt <strong>de</strong> arhitectura<br />
acestora. Un astfel <strong>de</strong> hardware virtual foloseşte şi VMware care poate suporta până la 60 discuri virtuale, faţă<br />
<strong>de</strong> 15 cât poate suporta o magistrală SCSI reală şi foloseşte un cotroller LSI Logic LSI53C10xx Ultra320 SCSI I/O.<br />
Modul <strong>de</strong> funcţionare al interfeţei SCSI este asemănător cu cel al IDE, fiind tratată ca un dispozitiv PCI şi având<br />
numerele IRQ şi porturile alocate dinamic la fiecare pornire.[14]<br />
4. Discurile Floppy<br />
În VMware se pot configura 2 discuri floppy ca mapări ale discurilor reale <strong>de</strong> pe sistemul gazdă. Acestea<br />
se pot accesa atât <strong>de</strong> pe sistemul gazdă cât şi prin intermediul VMware. Controllerul floppy are IRQ 6 cu<br />
porturile I/O la adresele 0x03f0 – 0x3f5 si 0x3f7. [17]<br />
5. Interfeţele Ethernet<br />
Interfaţa Ethernet virtuală a VMware este AMD PCnet bazată pe chipul AMD 79C970A sau pentru<br />
sistemele client pe 64 <strong>de</strong> biţi Intel Pro/100MT Server Adapter. Se pot adăuga până la 10 interfeţe Ethernet care<br />
sunt <strong>de</strong> mai multe tipuri:<br />
• Reţea host-only, numai pe sistemul gazdă şi este folosită la comunicarea între client şi sistemul pe care<br />
rulează VMware.<br />
• Reţea bridged, care funcţionează asemănător modului în care VMware funcţionează pentru UCP,<br />
multiplexând interfaţa Ethernet pentru ca sistemul client să comunice cu gazda.<br />
• Reţea NAT (Network Address Translation), este o reţea <strong>de</strong> tip host-only care foloseşte NAT pentru a<br />
comunica cu reţelele exterioare prin intermediul reţelei gazdă.<br />
Interfaţa virtuală Ethernet este un dispozitiv PCI, <strong>de</strong>ci întreruperile şi porturile I/O sunt setate la<br />
pornire.[13]
6. Porturile seriale<br />
VMware are 4 porturi seriale virtuale 16550A UART ce sunt configurate ca în tabelul <strong>de</strong> mai jos:<br />
Nume DOS Nume Linux IRQ Porturi I/O<br />
COM1 /<strong>de</strong>v/ttyS0 4 0x3f8-0x3ff<br />
COM2 /<strong>de</strong>v/ttyS1 3 0x2f8-0x2ff<br />
COM3 /<strong>de</strong>v/ttyS2 4 0x3e8-0x3ef<br />
COM4 /<strong>de</strong>v/ttyS3 3 0x2e8-0x3ef<br />
Deoarece porturile COM 2 si COM 4, respectiv COM 1 şi COM3 împart acelaşi număr IRQ pot apărea<br />
erori la folosirea simultană a lor.[13]<br />
7. Porturile paralele<br />
Porturile paralele sunt folosite pentru a transmite un număr mai mare <strong>de</strong> biţi simultan <strong>de</strong>cât porturile<br />
seriale. VMware suportă două porturi PC paralele în moduri unidirecţionale şi bidirecţionale:<br />
Nume DOS Nume Linux IRQ Porturi I/O<br />
LPT1 /<strong>de</strong>v/lp0, /<strong>de</strong>v/parport0 7 0x3be<br />
LPT2 /<strong>de</strong>v/lp1, /<strong>de</strong>v/parport1 5 0x37f<br />
Similar cu portul serial, datele <strong>de</strong> ieşire pentru porturile paralel pot fi direcţionate către un fişier în locul<br />
unui dispozitiv real.[13]<br />
8. Interfaţa USB<br />
VMware emulează controllerul UHCI (Universal Host Controller Interface) pentru USB 1.1 sau EHCI<br />
(Exten<strong>de</strong>d Host Controller Interface) pentru USB 2.0, suportând o gamă variată <strong>de</strong> dispozitive: imprimante,<br />
scannere, cititoare <strong>de</strong> carduri, mouse, tastaturi etc.[16]<br />
9. Adaptor grafic<br />
VMware are un adaptor grafic VGA16 şi unul SVGA care permite folosirea extensiilor VGA şi poate afişa<br />
la aceleaşi rezoluţii ca şi sistemul gazdă. Totusi, pentru folosirea acestor opţiuni este nevoie să se instaleze un<br />
software auxiliar numit VMware Tools pentru sistemul client care permite comunicarea directă cu sistemul vi<strong>de</strong>o<br />
<strong>de</strong> pe <strong>calcul</strong>atorul gazdă.[16]<br />
10. Mouse, tastatură şi tablete grafice<br />
Toate aceste dispozitive sunt virtualizate astfel:<br />
• Tastatura: 104 Key Windows 95/98 enhanced<br />
• Mouse: PS/2 Mouse
• Tablete grafice: Generic Serial Tablets<br />
11. Plăci <strong>de</strong> sunet<br />
VMware emulează dispozitivul Creative Technology SoundBlaster 16, IRQ 5, porturi I/O 0x220 – 0x22f,<br />
canal DMA 16 biti. Deoarece placa <strong>de</strong> sunet foloseşte IRQ 5, pot apărea conflicte dacă unul din porturile paralele<br />
doreşte să folosească simultan această întrerupere.<br />
12. BIOS-ul (Basic Input Output System)<br />
VMware foloseşte versiunea <strong>de</strong> BIOS PhoenixBIOS 4.0 Release 6 VESA şi emulează totodată RTC-ul (Real-<br />
Time Clock) sistemului gazdă.<br />
VMware ESX Server<br />
VMware ESX Server este un produs oferit <strong>de</strong> VMware Inc. pentru virtualizarea sistemelor <strong>de</strong> tip server.<br />
Principala diferenţă între VMware ESX Server şi Workstation este aceea că cel dintâi funcţionează direct pe<br />
hardwareul serverului şi nu necesită un sistem <strong>de</strong> operare gazdă. Avantajul este acela <strong>de</strong> a rula mai multe<br />
sisteme <strong>de</strong> operare simultan folosind direct resursele hardware ale maşinii. ESX server este <strong>de</strong>stinat în special<br />
utilizatorilor din mediul <strong>de</strong> afaceri şi nu utilizatorilor individuali, pretându-se cel mai bine sistemelor <strong>de</strong> tip<br />
multiprocesor performante.<br />
ESX Server încorporează un manager <strong>de</strong> resurse şi o consolă <strong>de</strong> servicii care asigură controlul pornirii<br />
precum şi alte servicii. Designul arhitecturii ESX Server implementează mecanisme care permit resurselor<br />
hardware să fie alocate mai multor sarcini <strong>de</strong> lucru simultan în medii complet izolate.<br />
Elementele cheie ale <strong>de</strong>signului sistemului sunt:<br />
• Stratul <strong>de</strong> virtualizare VMware care asigură un mediu hardware i<strong>de</strong>al şi virtualizarea resurselor hardware<br />
• Managerul <strong>de</strong> resurse care permite partiţionarea şi garantarea UPC, memoriei, lăţimii <strong>de</strong> bandă a reţelei<br />
şi a discurilor pentru fiecare maşină virtuală.<br />
• Interfaţa componentelor hardware care inclu<strong>de</strong> driverele dispozitivelor, ce permite livrarea unor servicii<br />
hardware specifice, ascunzând totodată diferenţele hardware pentru alte componente ale sistemului.<br />
Virtualizarea ESX Server presupune ca şi în cazul Workstation <strong>de</strong>finirea pentru fiecare maşină virtuală a<br />
unui procesor virtual, a unei memorii s.a.m.d. Pentru fiecare staţie virtuală se pot <strong>de</strong> asemenea <strong>de</strong>fini mai multe<br />
interfeţe Ethernet (maxim 4) fiecare cu adresa IP si MAC proprii ce pot fi conectate la un switch virtual care la<br />
rândul lui poate fi conectat printr-o legatură <strong>de</strong> tip bridge la reţeaua fizică a sistemului gazdă. Virtualizarea ESX<br />
server poate fi uşor interpretată din figura <strong>de</strong> mai jos (fiecărei maşini virtuale îi corespun<strong>de</strong> o UPC, o memorie şi<br />
un disc propriu, în realitate toate împărţind aceleaşi resurse)[15]:
Masina virtuala 1<br />
UPC Memorie Disc NIC NIC<br />
UPC1 Mem 1 Disc<br />
1<br />
UPC 1<br />
NIC1a NIC 1b<br />
UPC n<br />
Resurse fizice<br />
Mem 1<br />
………………………………<br />
Mem n<br />
Configuraţia maşinii virtuale [3]<br />
Procesele şi fişierele Consolei <strong>de</strong> Servicii (Service Console)<br />
Consola <strong>de</strong> servicii este o componentă cheie a VMware Server şi oferă control API (Application<br />
Programming Interface) care permite maşinilor virtuale şi resurselor alocate să fie manageriate. Administratorul<br />
poate <strong>de</strong> asemenea să acceseze aceste controale direct prin pagini Web <strong>de</strong> pe serverul web ce rulează în<br />
interiorul consolei <strong>de</strong> servicii. Consola <strong>de</strong> servicii este practic un sistem <strong>de</strong> operare cu nucleul vmkernel. [4]<br />
Diagrama consolei <strong>de</strong> servicii [14]<br />
NIC1b… NIC<br />
Retea Virtuala<br />
Pe lângă serverul web, în consola <strong>de</strong> servicii mai rulează următoarele procese:<br />
• Server daemon (vmserverd): execută acţiuni în consola <strong>de</strong> servicii din parte VMware Remote Console<br />
(controlul consolei <strong>de</strong> pe un alt sistem) bazate pe Interfaţa <strong>de</strong> management Web.<br />
• Authentification daemon (vmauthd): autentifică utilizatorii interfeţei <strong>de</strong> management şi consolele<br />
folosind un sistem bazat pe un nume <strong>de</strong> utilizator şi parolă.<br />
• Server SNMP (Simple Network Management Protocol) (ucd-snmpd): implementează structurile <strong>de</strong> date<br />
SNMP.<br />
Cerinţe minime pentru staţia pe care se instalează VMware ESX Server.<br />
Disc 1<br />
Disc 2<br />
NIC 1a<br />
NIC na<br />
Masina virtuala n<br />
UPC Memorie Disc NIC NIC<br />
UPC n Mem n Disc n NICna NIC nb
VMware Converter<br />
Un alt produs al companiei VMware Inc. care are la bază virtualizarea este VMware Converter. Acesta<br />
are mai multe întrebuinţări:<br />
• Converteşte maşini fizice în maşini virtuale pentru a putea fi folosite cu alte produse VMware (Ex:<br />
converteşte un disc real în timp ce acesta rulează într-o imagine virtuală ce poate fi acesată din VMware)<br />
• Converteşte maşini virtuale pentru a putea fi folosite cu alte produse VMware.<br />
• Schimbă locul maşinilor virtuale pe diferite platforme VMware.<br />
• Importă sau exportă aplicaţii virtuale din sistemul local sau le downloa<strong>de</strong>aza <strong>de</strong> pe un URL.<br />
• Reajustează rapid mărimile discurilor şi tipurile partiţiilor pentru a maximiza utilizarea resurselor <strong>de</strong><br />
stocare.<br />
Spre exemplu, VMware Converter este foarte util atunci când se doreşte migrarea <strong>de</strong> la un sistem <strong>de</strong><br />
operare la altul, dar să se păstreze vechiul sistem <strong>de</strong> operare. [17]<br />
ÎmbunătăŃirea performanŃelor VMware<br />
VMware este o aplicaţie consumatoare <strong>de</strong> resurse însă performanţele pot fi îmbunătăţite renunţănd la<br />
unele elemente în favoarea altora. Cel mai mare plus <strong>de</strong> performanţă se obţine pornind <strong>de</strong> la sistemul gazdă.<br />
• Procesorul maşinii gazdă trebuie să execute cât mai puţine instrucţiuni aşadar este recomandat să se<br />
ruleze o singură maşină virtuală la un moment dat.<br />
• Deşi producătorul recomandă un minim <strong>de</strong> 512 MB <strong>de</strong> memorie RAM, i<strong>de</strong>al sunt 2 GB pentru a obţine o<br />
performanţă cât mai bună. Trebuie să fie <strong>de</strong>stulă memorie astfel încât să se ruleze atât sistemul gazdă<br />
cât şi clientul simultan. Pentru gaz<strong>de</strong>le Linux cu nucleu din seria 2.2.x maximul <strong>de</strong> memorie suportat este<br />
1GB aşadar este nevoie fie <strong>de</strong> un upgra<strong>de</strong> al kernelului la o versiune 2.4.x fie o recompilare a nucleului<br />
folosind opţiunea CONFIG_2GB astfel încât să se aloce 2GB pentru nucleu şi 2 GB pentru utilizator (în<br />
mod normal se alocă 1GB pentru kernel şi 3 GB pentru utilizator).<br />
• Trebuie evitate situaţiile în care nu există suficient spaţiu liber pe hard diskul staţiei gazdă. Performanţa<br />
poate scă<strong>de</strong>a consi<strong>de</strong>rabil atunci când VMware Workstation (sau alt produs VMware) vrea să execute<br />
operaţii cu discurile virtuale (<strong>de</strong> crestere, snapshot, redo etc.). O altă i<strong>de</strong>e pentru îmbunătăţire este <strong>de</strong> a<br />
împărţi maşinile virtuale pe hard diskuri diferite sau folosirea unei interfeţe RAID şi <strong>de</strong>fragmentarea<br />
periodică a discurilor virtuale.<br />
• Se recomandă ca în cazul în care sistemul posedă mai multe plăci <strong>de</strong> interfaţă cu reţeaua (NIC) să se<br />
activeze doar cea care este folosită la un moment dat şi nu toate simultan.<br />
• Dezactivarea CD-ROM-ului în VMware pentru fiecare maşină virtuală îmbunătăţeste <strong>de</strong> asemenea<br />
performanţa.<br />
• Din punct <strong>de</strong> ve<strong>de</strong>re grafic performanţa se poate îmbunătăţi dacă se <strong>de</strong>zactivează efectele vizuale<br />
(Windows) sau se rulează VMware în full-screen.<br />
• Instalarea VMware Tools aduce <strong>de</strong> asemenea îmbunătăţiri.
x86 virtualization<br />
x86 virtualization este o metodă prin care un x86 <strong>de</strong> bază cu un sistem <strong>de</strong> operare poate să ruleze sub<br />
un alt <strong>calcul</strong>ator numit gazdă, ce are un x86, cu sistem <strong>de</strong> operare, cu puţine sau fară nicio modificare asupra<br />
primului sistem <strong>de</strong> operare.<br />
Termenul general <strong>de</strong> x86 se referă la un set <strong>de</strong> instrucţiuni pentru cele mai <strong>de</strong> succes arhitecturi <strong>de</strong><br />
procesoare din istoria <strong>calcul</strong>atoarelor personale. Aceste instrucţiuni sunt folosite in procesoarele <strong>de</strong> la INTEL,<br />
AMD, VIA si <strong>de</strong>rivă <strong>de</strong> la primele generaţii <strong>de</strong> procesoare, începând cu procesorul pe 16 biţi Intel 8086 ce a<br />
apărut la sfârşitul anilor 86. De atunci setul <strong>de</strong> instrucţiuni a fost frecvent extins.<br />
Arhitectura procesorului x86 nu a corespuns la început cerinţelor <strong>de</strong> virtualizare Popek si Goldberg.<br />
Astfel a fost greu să se implementeze o maşina virtuală pe un processor x86.<br />
Cerinţele Popek şi Goldberg sunt un set <strong>de</strong> condiţii suficiente pentru ca un <strong>calcul</strong>ator să suporte eficient<br />
un sistem virtualizat. Acestea au fost introduce <strong>de</strong> Gerald J. Popek si Robert P. Goldberg intr-un articol din anul<br />
1974 sub numele <strong>de</strong> : “Formal Requisements for Virtualizable Third Generation Arhitectures”. Chiar dacă<br />
cerinţele sunt <strong>de</strong>rivate luând forme simplificate, ele tot reprezintă o cale convenabilă pentru a <strong>de</strong>termina dacă<br />
arhitectura unui <strong>calcul</strong>ator suportă eficient virtualizarea.<br />
Pentru a obţine aceste cerinţe <strong>de</strong> virtualizare Popek şi Goldberg au introdus o clasificare a instrucţiunilor<br />
in 3 grupe diferite:<br />
• Instrucţiuni privilegiate: acestea sunt accesibile daca procesorul este în user mo<strong>de</strong> şi nu sunt accesibile<br />
dacă procesorul este in sistem mo<strong>de</strong>.<br />
• Instrucţiuni pentru controlul sensibilităţii: sunt instrucţiuni ce încearcă sa schimbe configuraţia<br />
resurselor în sistem.<br />
• Instrucţiuni pentru funcţionarea sensibilitaţii: acele instrucţiuni ale căror funcţionări <strong>de</strong>pin<strong>de</strong> <strong>de</strong><br />
configurarea resurselor.<br />
Rezultatul principal al analizei Popek şi Goldberg poate fi exprimat sub forma a 2 teoreme [5]:<br />
Teorema 1 - Pentru cea <strong>de</strong>-a treia generaţie <strong>de</strong> <strong>calcul</strong>atoare un VMM (“Virtual Machine Monitor”) poate fi<br />
construită daca setul 2 <strong>de</strong> instrucţiuni este un subset al primului. Intuitiv enunţul teoremei exprimă faptul că<br />
instrucţiunile care ar putea afecta funcţionarea corectă a VMM (instrucţiuni pentru controlul sensibilităţii)<br />
trebuie blocate şi controlul trebuie trecut VMM-lui. Acest lucru garantează controlul calitativ al resurselor. Nicio<br />
altă instrucţiune privilegiată nu trebuie executată.<br />
Teorema 2 - O a treia generaţie <strong>de</strong> <strong>calcul</strong>atoare este recursiv virtualizată dacă:<br />
1. Este virtualizată<br />
2. Poate fi construit un VMM fără a <strong>de</strong>pin<strong>de</strong> <strong>de</strong> timp<br />
Intel si AMD au <strong>de</strong>zvoltat in<strong>de</strong>pen<strong>de</strong>nt exdin<strong>de</strong>rea virtualizarii arhitecturii x86. Ele nu sunt direct<br />
compatibile intre ele, dar satisfac in mare aceleaşi funcţii. Oricum vor permite unei masini virtuale ce are mai<br />
multe sisteme <strong>de</strong> operare pe acelaşi <strong>calcul</strong>ator gazdă în acelaşi timp, sa ruleze un sistem <strong>de</strong> operare<br />
nemodificat, secundar, fără a suporta penalitaţi importante <strong>de</strong> emulare a perforamntelor.
Virtuozzo<br />
Spre <strong>de</strong>osebire <strong>de</strong> soluţiile prezentate până acum , acest program foloseşte tehnologia <strong>de</strong> virtualizare<br />
host based , neincluzând astfel mo<strong>de</strong>lul <strong>de</strong> abstractizare al componentelor hardware. Acest program se<br />
evi<strong>de</strong>nţiază printr-un nivel ridicat <strong>de</strong> performanţă in utilizare şi dispune <strong>de</strong> utilitare <strong>de</strong> administrare complete .<br />
Virtuozzo ofera un set complet <strong>de</strong> utilitare <strong>de</strong> monitorizare, acestea oferind informaţii utile<br />
administratorilor care gestionează mediul virtual. Creează mai multe recipiente izolate , (cunoscute ca medii<br />
virtuale sau virtual environments (VE)) sau Servere <strong>Virtuale</strong> Private (VPS) pe un singur server fizic . Aceasta<br />
metoda permite punerea in comun a resurselor hardware , a sistemelor <strong>de</strong> management şi câteodată a<br />
licenţelor software in diferite sarcinii . [11]<br />
Fiecare VPS se comporta exact ca un server obişnuit în ceea ce priveşte utilizatorii si aplicaţiile, poate fi<br />
resetat in<strong>de</strong>pen<strong>de</strong>nt si are acces individual <strong>de</strong> nivel root, utilizatori si adrese IP individuale, memorie, fişiere <strong>de</strong><br />
configurare, procese, aplicaţii, librării <strong>de</strong> sistem si fişiere <strong>de</strong> configurare proprii. Uşor <strong>de</strong> întreţinut si cu un <strong>de</strong>sign<br />
eficient, Virtuozzo este o soluţie eficientă <strong>de</strong> virtualizare atât pentru sisteme Linux/UNIX, cât si Microsoft<br />
Windows.<br />
Caracteristici<br />
Platformele Linux sunt consi<strong>de</strong>rate cele mai potrivite pentru Virtuozzo, având documentaţia completă<br />
pentru cele mai cunoscute distribuţii . Avantajele principale ale Virtuozzo sunt : partiţionarea inteligentă , prin<br />
care un server se împarte in multe recipiente cu funcţionalităţi complete a unui server obişnuit; izolarea<br />
completă , recipientele sunt in siguranţă şi au izolare din punct <strong>de</strong> ve<strong>de</strong>re al performanţei , funcţionalităţii şi a<br />
eroriilor;alocarea <strong>de</strong> resurse dinamice – unitatea <strong>de</strong> control si procesare (CPU) , memoria , reţeaua , discurile şi<br />
intrările/ieşirile pot fi schimbate fară resetarea serverului; Magement in masă – un set <strong>de</strong> utilitare şi şabloane<br />
pentru automatizare,multi-recipiente şi multi-administrarea <strong>de</strong> server.<br />
Mo<strong>de</strong>lul <strong>de</strong> virtualizare SO a Virtuozzo este i<strong>de</strong>al pentru cea mai buna performanţă, management şi<br />
eficienţă. La bază sta un sistem <strong>de</strong> operare gazdă standard care poate fi atât Windows cât şi Linux. Următorul<br />
este un strat <strong>de</strong> virtualizare cu un sistem al gestiunii <strong>de</strong> fişiere şi un strat abstractizat al kernelului care asigură<br />
izolarea şi securizarea resurselor dintre diferite recipiente. Stratul <strong>de</strong> virtualizare face din fiecare recipient să<br />
pară un server <strong>de</strong> sine stătator.<br />
Soluţia <strong>de</strong> virtualizare a SO Virtuozzo are cea mai mare eficientă şi scalabilitate, astfel încât e consi<strong>de</strong>rată<br />
cea mai bună soluţie pentru organizaţiile din domeniul infrastructurii IT şi eficientizarea utilizării resurselor. Setul<br />
complet <strong>de</strong> utilitare <strong>de</strong> management şi arhitectura unică fac din Virtuozzo cea mai soluţia perfectă pentru<br />
intreţinerea usoară, monitorizare şi administrarea resurselor serverului virtual.<br />
Diagrama <strong>de</strong> mai jos reprezintă un mo<strong>de</strong>l tipic al structurii <strong>de</strong> sistem Virtuozzo [11]
Figura 1 . Virtuozzo Virtualizare SO [11]<br />
Recipientul insăşi găzduieşte aplicaţia, se comportă ca şi cum ar fi un server <strong>de</strong> sine-stătător. Fiecare<br />
recipient are superutilizatorul său (root sau Administrator), un set <strong>de</strong> useri sau grupuri, adrese IP, procese,<br />
fişiere, aplicaţii, fişiere, aplicaţii, librării <strong>de</strong> system şi fişiere <strong>de</strong> configurare. Recipientul este accesibil prin retea.<br />
Datorită stivei <strong>de</strong> reţea virtuală, recipientul are tabele proprii <strong>de</strong> rutare si seturi <strong>de</strong> reguli ale firewall-ului<br />
(iptables).<br />
OpenVZ<br />
OpenVZ este o soluţie <strong>de</strong> virtualizare şi automatizare completă a serverului. Această creează mai multe<br />
Server <strong>Virtuale</strong> Private (VPS) izolate intre ele pe un singur server fizic pentru a eficientiza la maxim resursele<br />
oferite. Fiecare VPS realizează şi execută asemănător unui server <strong>de</strong> sine stătător pentru utilizatorii săi şi<br />
aplicaţii, putând fi resetat in<strong>de</strong>pen<strong>de</strong>nt şi având access la root-ul său, utilizatori, adrese IP, memorie, fişiere,<br />
aplicaţii, librarii <strong>de</strong> sistem şi fişiere <strong>de</strong> configurare. Designul eficient a OpenVZ îl recomandă ca fiind alegerea<br />
potrivită pentru serverele <strong>de</strong> producţie cu aplicaţii live şi date in timp real. [1]<br />
Posibilităţiile <strong>de</strong> bază a OpenVZ sunt :<br />
• Partiţionarea dinamică în timp real – un server fizic se poate partiţiona în zeci <strong>de</strong> VPS-uri, fiecare cu<br />
funcţionalităţi diferite şi cu atribuţii <strong>de</strong> server <strong>de</strong>dicat.<br />
• Managementul resurselor – atribuie şi controlează resursele parametrilor VPS şi realoca resursele în<br />
timp real.
• Management în masă – Administrează o reţea <strong>de</strong> server fizice şi servere virtuale private printr-o metodă<br />
unitară.<br />
Din punct <strong>de</strong> ve<strong>de</strong>re al aplicaţiilor şi a utilizatorilor <strong>de</strong> VPS, fiecare server virtual este un sistem<br />
in<strong>de</strong>pen<strong>de</strong>nt. Această in<strong>de</strong>pen<strong>de</strong>nţă este oferită <strong>de</strong> un strat <strong>de</strong> virtualizare in kernelul sistemului <strong>de</strong> operare a<br />
gaz<strong>de</strong>i. Interesant este faptul că o mică parte a resurselor CPU sunt ocupate cu virtualizarea (aproape <strong>de</strong> 2 %).<br />
Principalele caracteristici a stratului virtual implementat în OpenVZ sunt următoarele:<br />
• VPS arată ca un sistem <strong>de</strong> operare Linux normal. Are scripturile <strong>de</strong> început standard, software care<br />
rulează în VPS fără OpenVZ – modificări specifice sau adaptări .<br />
• Un utilizator poate schimba orice fişier <strong>de</strong> configurare şi poate instala software adiţional.<br />
• Servere virtuale private sunt izolate complet între ele (fişiere <strong>de</strong> sistem, procese, Comunicate Inter<br />
Procese (IPC) ).<br />
• Procese ce aparţin unui VPS sunt programate pentru execuţie pentru toate resursele CPU valabile. În<br />
consecinţă, VPS-urile nu sunt legate doar la un singur CPU şi pot utiliza toată puterea CPU.<br />
ComparaŃie<br />
Spre <strong>de</strong>osebire <strong>de</strong> alte soluţii <strong>de</strong> virtualizare, Virtuozzo nu alocă <strong>de</strong>cât sub 3% din resursele serverului<br />
pentru taskurile <strong>de</strong> virtualizare si administrare, permiţând instalarea unui număr foarte mare <strong>de</strong> servere virtuale<br />
pe un singur server fizic. Tehnologia avansată <strong>de</strong> virtualizare permite ca orice VPS sa poată fi mutat uşor <strong>de</strong> pe<br />
un server fizic pe altul.<br />
Z-machine<br />
Prima schiţă a unei maşini Z a apărut pe o masă <strong>de</strong> cafea în 1979 în Pittsburg. Este un <strong>calcul</strong>ator virtual a<br />
cărui programe sunt jocuri <strong>de</strong> aventură, perfect adaptat acestei misiuni, întrucât reuşeşte să implementeze<br />
jocuri complexe pentru perioada sa într-un mod compact. Se poate spune că erau totuşi un pic prea mari pentru<br />
memoria disponibilă <strong>calcul</strong>atoarelor personale din acele zile, dar maşina Z pare să fi fost prima care să utilizeze<br />
memoria virtuală într-un micro<strong>calcul</strong>ator. Mult mai impresionant <strong>de</strong>cât acest amănunt este posibilitatea <strong>de</strong> a<br />
salva si a reporni programul exact în locul un<strong>de</strong> a fost lăsat într-un mod eficient.<br />
Principiul cardinal al <strong>de</strong>signului acestei maşini esta <strong>de</strong> a putea fii 100% portabil pe orice tip <strong>de</strong> <strong>calcul</strong>ator.<br />
Această portabilitate este facută posibilă din dorinţa <strong>de</strong> a face constrânge programele la un minim <strong>de</strong> memorie<br />
precum şi cerinţele cât mai mici hardware (spre exemplu alocarea dinamică este imposibilă).<br />
Jocurile create <strong>de</strong> Infocom continuă să fie vândute şi jucate sub programe interpretor create ori <strong>de</strong><br />
Infocom ori <strong>de</strong> surse in<strong>de</strong>pen<strong>de</strong>nte. În jur <strong>de</strong> 130 <strong>de</strong> jocuri-poveşti compilate sub Zilch (care este compilatorul<br />
firmei Infocom) mai supravieţuiesc şi din 1993 mult mai multe jocuri-poveşti au fost create ţinând cont <strong>de</strong><br />
sistemul <strong>de</strong> referinţă Inform. Există 8 versiuni ale maşinii Z iar primul byte din orice “joc-poveste” (adică orice<br />
program al maşinii Z) dă numarul versiunii sub care trebuie interpretat codul.
O privire asupra structurii maşinii Z<br />
Structura Maşinii Z [6]<br />
Maşinile Z sunt precum spuneam un <strong>calcul</strong>ator virtual. “Z” vine <strong>de</strong> la “Zork”, jocul <strong>de</strong> aventură text<br />
pentru care a fost originar conceput. Ca orice <strong>calcul</strong>ator îşi ţine informaţiile (majoritatea lor) într-o matrice <strong>de</strong><br />
variabile numerotate <strong>de</strong> la 0 în sus care constituie memoria sistemului. Un număr <strong>de</strong> 240 <strong>de</strong> locuri <strong>de</strong> memorie<br />
sunt separate <strong>de</strong> restul sistemului pentru un acces rapid si uşor, iar la aceste adrese <strong>de</strong> memorie sunt <strong>de</strong>numite<br />
variabile globale (pentru că sunt disponibile oricărei părţi ale programului in execuţie, la orice moment <strong>de</strong> timp).<br />
Cele mai importante două informaţii neţinute în memorie sunt contorul <strong>de</strong> program (PC) şi stiva. Maşina<br />
Z rulează programul în mod continuu luând instrucţiunea <strong>de</strong> la poziţia ţinută în PC, executând respectiva<br />
instrucţiune după care incrementează în mod automat PC-ul. Setul <strong>de</strong> instrucţiuni al maşinii Z (plaja tuturor<br />
acţiunilor posibile şi cum sunt ele codate ca şi numere în memorie) ocupă cea mai mare parte a unui program<br />
menit să ruleze pe o astfel <strong>de</strong> maşină.<br />
Programele sunt divizate în rutine : maşina Z executând mereu rutina care este indicată <strong>de</strong> contorul <strong>de</strong><br />
program. Totuşi, unele instrucţiuni cer efectuarea unor salturi sau execuţia unor rutine noi după care trebuie să<br />
se întoarcă în locul un<strong>de</strong> a fost lăsată rutina prece<strong>de</strong>ntă. Pentru informaţiile privitoare la locul un<strong>de</strong> să se<br />
întoarcă maşina se foloseşte <strong>de</strong> stivă. Stiva este un al doilea banc <strong>de</strong> memorie, total separat <strong>de</strong> memoria<br />
principală, <strong>de</strong> un<strong>de</strong> sunt luate sau în care se adaugă anumite informaţii. Stiva este <strong>de</strong> tip FIFO (first in first out).<br />
În afară <strong>de</strong> a reţine locurile <strong>de</strong> întoarcere în rutină în stivă se mai reţin variabilele locale (folosite doar <strong>de</strong><br />
anumite rutine din program), cât şi pentru a ţine minte pentru o perioadă scurtă <strong>de</strong> timp rezultatele parţiale ale<br />
unor <strong>calcul</strong>e.
Astfel, în timp ce majoritatea procesoarelor fizice au un număr <strong>de</strong> variabile uşor <strong>de</strong> accesat ăn afara<br />
memoriei principale (zone numite “registre”) şi o stivă in interiorul memoriei principale, maşina Z are exact<br />
invers : variabilele globale sunt ţinute in interiorul memoriei şi stiva in afara acesteia. Accesul la resursele<br />
hardware ale <strong>calcul</strong>atorului pe care rulează maşina Z nu se pot face <strong>de</strong>cât apelând instrucţiuni specifice. Spre<br />
exemplu, instrucţiunile read şi read_char permit folosirea tastaturii; print şi draw_picture permit folosirea<br />
ecranului. Imaginea afişată pe ecran nu este reţinută nicăieri in memorie. În mod simetric, resursele hardware<br />
pot intrerupe rutina curentă a maşinii. Acest lucru se întâmplă doar dacă programul a cerut în prealabil acest<br />
lucru, cum ar fi <strong>de</strong> exemplu dacă se cere o întrerupere pentru treizeci <strong>de</strong> secun<strong>de</strong> pentru a da timp jucătorului<br />
timp <strong>de</strong> gâmdire pentru a scrie un răspuns. După expirarea timpului programul va genera o întrerupere pentru a<br />
analiza răspunsul utilizatorului.<br />
Această simplă arhitectură este intercalată cu mai multe structuri speciale pe care maşina Z le menţine<br />
inăuntrul memoriei. Sunt in jur <strong>de</strong> douăsprezece astfel <strong>de</strong> structuri dar cele mai importante sunt :<br />
• Hea<strong>de</strong>r-ul, care se află mereu la adresa cu numărul <strong>de</strong> ordine cel mai mic, un<strong>de</strong> se ţin informaţii privind<br />
programul şi o mapare a restului memoriei<br />
• Dicţionarul, care conţine o listă <strong>de</strong> cuvinte pe care programul se aşteaptă să le îi fie date <strong>de</strong> la tastatură<br />
• Arborele obiectelor, care reprezintă un aranjament <strong>de</strong> bucăţi <strong>de</strong> memorie<br />
Maşina Z este folosită cel mai a<strong>de</strong>sea pentru jocuri <strong>de</strong> aventură tip text, astfel că dicţionarul ţine minte<br />
nume <strong>de</strong> obiecte sau verbe pe care utilizatorul trebuie să le introducă, în timp ce obiectele ce compun arborele<br />
sunt locuri si artefacte care compun jocul. Orice obiect din arbore poate avea un părinte, un frate sau un copil.<br />
Obiectele sunt colecţii <strong>de</strong> variabile în principiu, variabile care se împart in două categorii: atribute şi<br />
proprietaţi.<br />
Atributele sunt simple fanioane, în sensul că pot fii doar active sau inactive, ele neavând nicio valoare<br />
numerică. Proprietaţile conţin numere, care la rândul lor pot reprezenta bucăţi <strong>de</strong> text sau alte tipuri <strong>de</strong><br />
informaţii. Spre exemplu, o proprietate a obiectului „cutie poştală” conţine informaţia <strong>de</strong>spre <strong>de</strong>numirea<br />
obiectului. Un atribut al acestui obiect este faptul că este un container, în sensul că el conţine la rândul lui alte<br />
obiecte copil. Acest atribut este <strong>de</strong>zactivat în cazul obiectului „notiţă”.<br />
Programele pentru maşini Z sunt stocate local pe disc, sau arhivate pe Internet, în ceea ce se numesc<br />
„fişiere poveste”(story files). Aceste fişiere conţin doar un cadru al memoriei principale. Procesorul începe să<br />
ruleze un astfel <strong>de</strong> fişsier începând cu o stivă goală şi o valoare a contorului <strong>de</strong> program în concordanţă cu<br />
informaţiile conţinute in hea<strong>de</strong>rul fişierului. Trebuie menţionat că în prealabil fişierele poveste trebuie să fie<br />
corelate cu structurile <strong>de</strong> memorie care conţin dicţionarul au arborele <strong>de</strong> obiecte.<br />
Primul byte din orice fişier poveste, cel conţinut la adresa 0, conţine întot<strong>de</strong>auna numărul versiunii<br />
maşinii Z ce trebuie folosite. Designul acestei maşini a fost unul revoluţionar pe o perioadă <strong>de</strong> o <strong>de</strong>cadă. Astfel<br />
pe măsură ce numărul versiunii creştea, setul <strong>de</strong> instrucţiuni creştea şi tabelele <strong>de</strong> memorie erau reformatate<br />
pentru a face loc jocurilor mai complicate şi mai mari din punct <strong>de</strong> ve<strong>de</strong>re al necesităţii memoriei. Toate jocurile<br />
făcute <strong>de</strong> Infocom pot fi jucate folosind versiuni variind între 3 (majoritatea) si 6. Toate jocurile compilate <strong>de</strong><br />
Inform în anii ’90 folosesc prepon<strong>de</strong>rent versiunile 5 şi 8.
Maparea memoriei<br />
1.1 Regiunile memoriei<br />
Memoria maşinii Z este impărţită in trei regiuni : “dinamică”, “statică” şi “mare”(high) . Memoria<br />
dinamică începe la adresa byte-ului $00000 şi merge până la byte-ul înainte <strong>de</strong> adresa byte-ului conţinut în<br />
cuvântul aflat la adresa $0e din hea<strong>de</strong>r. Memoria dinamică trebuie să conţină cel puţin 64 <strong>de</strong> bytes. Memoria<br />
statică porneşte imediat după ultima adresa a memoriei dinamice. Lungimea acesteia nu este specificată<br />
nicăieri, dar trebuie să se termine la ultimul byte al fişierului poveste sau la adresa $0ffff (oricare este mai mică).<br />
Memoria high incepe <strong>de</strong> la fanionul <strong>de</strong> memorie high (adresa stocată în cuvântul aflat la adresa $04 din hea<strong>de</strong>r)<br />
şi se continuă până la sfârşitul fişierului poveste. Începutul stivei <strong>de</strong> memorie high se poate suprapune peste<br />
sfârşitul stivei <strong>de</strong> memorie statică însă nu şi cu memoria dinamică.<br />
Memoria dinamică poate fi scrisă sau citită (fie direct folosind instrucţiunile loadb , loadw şi storeb şi<br />
storew, sau în mod indirect folosind opco<strong>de</strong>-urile insert_obj sau remove_obj)<br />
Prin tradiţie, primii 64 <strong>de</strong> bytes sunt cunoscuţi drept hea<strong>de</strong>r. Majoritatea jocurilor nu le este permis să<br />
modifice biţii aflaţi in hea<strong>de</strong>r. Este în schimb permis jocurilor să altereze orice tabele stocate în memoria<br />
dinamică, cu condiţia să lase tabelele respectând regulile versiunii <strong>de</strong> maşină Z pe care ruleză.<br />
Memoria statică poate fi citită folosind opco<strong>de</strong>-urile loadb si loadw. În schimb este ilegal pentru un joc<br />
<strong>de</strong> a încerca să scrie in memoria statică.<br />
În afară <strong>de</strong> posibila suprapunere cu memoria statică, memoria high nu poate fi accesată direct <strong>de</strong> un<br />
program joc. În schimb aceasta conţine rutine, care pot fi rulate, sau şiruri <strong>de</strong> caractere care pot fi printate<br />
folosind comanda print_paddr.<br />
Lungimea maximă permisă a unui fişier poveste <strong>de</strong>pin<strong>de</strong> <strong>de</strong> versiune, cum urmează.<br />
V1-3 V4-5 V6 V7 V8<br />
128 256 512 320 512<br />
1.2 Adrese<br />
Sunt trei tipuri <strong>de</strong> adrese în maşina Z, toate putând fi stocate într-un număr <strong>de</strong> doi bytes : adrese <strong>de</strong><br />
bytes, adrese <strong>de</strong> cuvinte şi adrese împachetate.<br />
O adresă <strong>de</strong> byte specifică adresa respectivului byte în memorie ţi poate varia între 0 şi ultimul byte<br />
alocat memoriei statice.<br />
O adresă <strong>de</strong> cuvânt specifică o adresă pară în ultimii 128K ai memoriei (dând astfel adresa divizată cu<br />
doi). Adresele <strong>de</strong> cuvânt sunt folosite doar in tabela <strong>de</strong> abreviere.<br />
O adresa împachetată specifică locul un<strong>de</strong> o rutină sau un şir începe în memoria high. Fiind dată o<br />
adresă împachetată P, formula corespunzătoare pentru a obţine adresa byte-ului B este :<br />
2P Versiunile 1, 2 and 3<br />
4P Versiunile 4 and 5<br />
4P + 8R_O Versiunile 6 şi 7, pentru adresarea rutinelor<br />
4P + 8S_O Versiunile 6 and 7, pentru print_paddr
$2a )<br />
8P Versiunea 8<br />
R_O şi S_O sunt offsetul pentru rutine şi şiruri (specificate în hea<strong>de</strong>r la cuvintele <strong>de</strong> la adresele $28 şi<br />
Inform niciodată nu compilează suprapunerea dintre memoria statică şi cea high (îşi plasează toate<br />
tabelele în memoria dinamică). Totuşi, jocurile Infocom grupează tabelele chiar <strong>de</strong>asupra fanionului <strong>de</strong> memorie<br />
high, chiar înainte <strong>de</strong> a începe rutinele.Unele jocuri intercaleză datele statice între rutine astfel încât memoria<br />
statică se suprapune peste cod, şi alte jocuri pot conţine rutine plasate sub fanionul <strong>de</strong> memorie high. (I<strong>de</strong>ea<br />
originală din spatele fanionului <strong>de</strong> memorie high a fost că tot ceea ce se află sub el ar trebui stocată în RAM-ul<br />
interpretorului, în timp ce se află <strong>de</strong>asupra ar putea fii ţinut în memoria virtuală). De asemenea ar trebui<br />
menţionat faptul că memoria dinamică si cea statică nu ar trebui să <strong>de</strong>păşească 64K. Aceasta era cea mai mare<br />
limitare a maşinii Z, cu toate că această limită nu a fost niciodată atinsă.[3]<br />
Bibliografie<br />
Cărţi:<br />
1. Andrew S. Tanenbaum Operating Sistems. Design and Implementation<br />
2. Andrew S. Tanenbaum Mo<strong>de</strong>rn Operating Systems 2 nd Edition<br />
3. Abraham Silberschatz, Operating System Concepts<br />
4. M. Waite, F. Lafore – Structuri <strong>de</strong> date şi algoritmi în Java, ed. Teora, 2001<br />
5. Robert Tolksdorf - Languages for the Java VM, Berlin 2005<br />
6. Irina Atanasiu, B. Constantinescu, O. A. Drăgoi, Florentina Irina Popovici – Limbajul Java, ed.<br />
Agora,1998<br />
7. The Book Of VMware - The Complete Gui<strong>de</strong> To VMware Workstation (2002) , Brian Ward<br />
Site-uri <strong>de</strong> internet:<br />
8. http://ro.wikipedia.org/wiki/Java_(limbaj_<strong>de</strong>_programare)<br />
9. http://en.wikipedia.org/wiki/Java_byteco<strong>de</strong><br />
10. http://java.sun.com/docs/books/tutorial/<br />
11. http://en.wikipedia.org/wiki/Virtuozzo<br />
12. http://www.parallels.com/en/products/virtuozzo/<br />
13. VMware Workstation 6.0 User Manual<br />
14. VMware Converter User Manual<br />
15. VMware ESX Server Administration Gui<strong>de</strong><br />
16. VMware ESX Server Installation Gui<strong>de</strong>