2024. április 26., péntek

Gyorskeresés

Emuláció, virtualizáció desktopon

Ha éppen nincs kéznél plusz egy gép, de ki akarsz próbálni valamit, akkor jól jöhet a virtualizáció

[ ÚJ TESZT ]

Bevezetés, történelem

Az átlag ember nem tart otthon fél tucat gépet csak azért, mert néha-néha szüksége lehet rá. Ha akad egy-két plusz gép, akkor is macerás azok telepítgetése, zaja... A megoldás egyszerű, emulálhatunk részlegesen vagy teljesen egy gépet, amin futtathatjuk a megfelelő operációs rendszert vagy programot. Ebben az írásban rövid betekintést szeretnék adni pár programba, amikkel a meglévő operációs rendszer (host OS) fölött virtualizált gépeket (guest) lehet létrehozni.

A bevezetésben szeretném a címben szereplő két szó közötti eltérést. Az emulátor teljesen eltérő (hardver-szoftver) környezetben teszi lehetővé a programok futását, ugyanis még a CPU-t is regiszter szinten szoftverrel szimulálunk. Így futtathatunk egy teljesen eltérő CPU-ra (SPARC, ARM x86-on) épülő rendszert is a gépünkön. Virtualizációnál a legfontosabb elemeket közvetlenül a meglévő hardverre támaszkodva hozzuk létre. Ez komplett gépnél szerintem a CPU. Azért tartottam fontosnak ezt hangsúlyozni, mert a kettő sebessége között közel nagyságrendi eltérés van. A cikkben elsősorban virtualizációról lesz szó, de az emulációra (qemu) is láthattok példát.

Egy kis történelem

Már az 50-es évek végén felmerült, hogy egy gépen lehetne virtuális gépeket futtatni. Christopher Strachey 59-es publikációja egy időosztásos rendszert képzelt el. Az alapelv hasonlított az akkoriban már fejlesztés alatt álló multi user rendszerekhez. Kicsit szabadabban értelmezve a fogalmat ezeknél jelent meg a virtualizáció. A több felhasználós rendszerek (pl. 1961 CTSS) egy virtuális konzolt adtak minden felhasználónak. A 60-as évek közepére az IBM fejlesztő laborjában megvalósították a teljesebb virtualizációt, a virtuális gépeket egy IBM 7044-en (M44) futtatták.

Az első PC emulátorok a 90-es években RISC rendszerekre jelentek meg. Wabi segítségével Windows programokat lehetett futtatni, ami először Solarisra jött ki, de volt többek között linuxos verziója is. Az Insignia féle SoftPC és Windows jelent meg talán a legtöbb rendszerre, például MAC-re is.

SoftWindows for Power Macintosh

x86-os platformon a 386-os CPU-k virtual 86 módja hozta meg az áttörést. Az OS/2 és a Windows is virtuális DOS használt. Az első VDM (Virtual DOS machine) a Windows 2.1/386-ban jelent meg. Újabb előrelépés volt a 32 bites NT, ami a 16 bites Windows programokat szintén virtuális környezetben futtatta. Természetesen ez nem jelenti azt, hogy egy komplett gépet hoztak volna létre. A CPU 386-os virtual 86 üzemmódban futott, a perifériákat részben emulálták, részben átfordították más rendszerhívásokká.

Az évezred végére több projectet is indítottak teljes x86 virtualizáció megvalósítására. Az első program, amivel találkoztam a Bochs volt. Pokolian lassú még a mai gépeken is, mivel a komplett gépet emulálja, cserébe bármin futtatható. A szintén emulátor QEMU sebessége sokkal jobb, amit a dinamikus bináris kód fordításnak és gyorsítótárazásnak köszönhet. Sok más virtualizációs szoftver épül az általuk kidolgozott technikákra, ami a nyílt forráskódnak köszönhető. Az áttörést - nem technikai értelemben - szerintem a VMware hozta. 1998-ban alapították meg a céget, amelyik 99 májusában mutatta be Workstation nevű programját. Folyamatos fejlesztéseivel és néhány program ingyenessé tételével azóta piacvezetővé vált és cselekvésre ösztönözi a konkurenciát.

0-ás ring mind felett

A virtualizáció megvalósítása "hála" az x86 felépítésének nem egyszerű. A programozók nagyon érdekes technikákat vetettek be, hogy normális sebességet érjenek el. A gondot többek között az okozza, hogy védett módban jogosultsági szintek, úgynevezett ring-ek, vannak. A 0-ás ringet használja a host operációs rendszer kernelje. A felhasználói programok valamelyik alacsonyabb szinten futnak, így nem férnek hozzá a hardverhez. A guest is a 0-ás gyűrűn szeretne futni, de ez nem lehetséges, de a virtualizációs szoftver sem mehet le erre a szintre. A guest OS átveréséhez több trükk szükséges:

Binary translation Vannak utasítások, amiket nem lehet végrehajtani, csak a legmagasabb ( 0-ás ) szinten vagy esetleges végrehajtásukkor a visszatérési értékük hibás. A megoldás az, hogy ezeket az utasításokat lecserélik több, magasabb szinten végrehajtható, de azonos eredményt adó parancsra. A sebességet gyorsítja, ha a program blokkokat képezve végzi ezt és egy cache-ben tárolja a már lefordított kódot.

Shadow pages A guest x86 virtuális memória kezelésekor a memória kezelő egységet (MMU) érintő utasításokat elkapják a BT során és egy táblázat segítségével megfeleltetik a guest OS-nek szimulált tábla bejegyzéseit a a fizikai CPU-ban szereplő címnek. Ezt a fordító táblát használjak később a memóriakezeléshez.

I/O és periféria emuláció A merevlemezt, hálózati kártyát, videókártyát és még sok más eszközt emulálnak a rendszerek. Lehetőség van a host gép hardvereinek átirányítására a guest számára, de ennek sebessége szoftveres megoldásnál limitált.

A hardver támogatás (AMD-V, Intel VT, IOMMU) megjelenése egyszerűsíti a virtualizációt, de ezek sajnos csak foltok az x86 rendszer hiányosságain és nem hoznak radikális gyorsulást. Az IOMMU, amivel a fizikai hardvert a virtuális géphez rendelhetjük, csak egy-két speciális esetben segít. Sajnos ugyanazt a hardvert, hacsak nem valami speciális kártyáról van szó, egyelőre nem lehet szétosztani a gépek között. Ráadásul még csak most van terjedőben.

A cikk még nem ért véget, kérlek, lapozz!

Azóta történt

Előzmények

Hirdetés

Copyright © 2000-2024 PROHARDVER Informatikai Kft.