28.04.2013 Views

Masini Virtuale - Andreea HONCIUC - Ingineria Sistemelor de calcul

Masini Virtuale - Andreea HONCIUC - Ingineria Sistemelor de calcul

Masini Virtuale - Andreea HONCIUC - Ingineria Sistemelor de calcul

SHOW MORE
SHOW LESS

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>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!