virtualizare x86 - x86 virtualization

virtualizarea x86 este utilizarea capacităților de virtualizare asistată de hardware pe un procesor x86 / x86-64.

La sfârșitul anilor 1990, virtualizarea x86 a fost realizată prin tehnici software complexe, necesare pentru a compensa lipsa procesorului de capacități de virtualizare asistată de hardware, obținând în același timp performanțe rezonabile. În 2005 și 2006, atât Intel ( VT-x ), cât și AMD ( AMD-V ) au introdus un suport limitat de virtualizare hardware care a permis un software de virtualizare mai simplu, dar a oferit foarte puține beneficii de viteză. Suport hardware mai mare, care a permis îmbunătățiri substanțiale ale vitezei, a venit cu modelele de procesor ulterioare.

Virtualizare bazată pe software

Următoarea discuție se concentrează numai pe virtualizarea modului protejat de arhitectură x86 .

În modul protejat, nucleul sistemului de operare rulează cu un privilegiu mai mare, cum ar fi inelul 0 și aplicațiile cu un privilegiu mai mic, cum ar fi inelul 3. În virtualizarea bazată pe software, un sistem de operare gazdă are acces direct la hardware, în timp ce sistemele de operare invitat au acces limitat la hardware, la fel ca orice altă aplicație a sistemului de operare gazdă. O abordare utilizată în virtualizarea bazată pe software x86 pentru a depăși această limitare se numește deprivilegierea inelului , care implică rularea sistemului de operare invitat la un inel mai mare (cu privilegii mai mici) decât 0.

Trei tehnici au făcut posibilă virtualizarea modului protejat:

  • Traducerea binară este utilizată pentru a rescrie în termeni de instrucțiuni de apel 3 anumite instrucțiuni de apel 0, cum ar fi POPF , care altfel ar eșua în tăcere sau ar avea un comportament diferit atunci când sunt executate deasupra ringului 0, ceea ce face imposibilă virtualizarea clasică trap-and-emulate . Pentru a îmbunătăți performanța, blocurile de bază traduse trebuie stocate în cache într-un mod coerent care să detecteze patch-uri de cod (utilizate în VxDs, de exemplu), reutilizarea paginilor de către sistemul de operare invitat sau chiar codul auto-modificat .
  • Un număr de structuri de date cheie utilizate de un procesor trebuie umbrite . Deoarece majoritatea sistemelor de operare folosesc memorie virtuală paginată și acordarea sistemului de operare pentru oaspeți acces direct la MMU ar însemna pierderea controlului de către managerul de virtualizare , o parte din activitatea MMU x86 trebuie duplicată în software pentru sistemul de operare invitat folosind o tehnică cunoscute sub numele de tabele de pagini shadow . Aceasta implică refuzarea sistemului de operare invitat de orice acces la intrările efective din tabelul de pagini prin captarea încercărilor de acces și emularea acestora în software. Arhitectura x86 folosește starea ascunsă pentru a stoca descriptorii de segmente în procesor, astfel încât odată ce descriptorii de segmente au fost încărcați în procesor, memoria din care au fost încărcați poate fi suprascrisă și nu există nicio modalitate de a recupera descriptorii de la procesor . Tabelele descriptorului umbrelor trebuie, prin urmare, utilizate pentru a urmări modificările făcute tabelelor descriptorului de către sistemul de operare invitat.
  • Emulare dispozitiv I / O: dispozitivele neacceptate de pe sistemul de operare invitat trebuie să fie emulate de un emulator de dispozitiv care rulează în sistemul de operare gazdă.

Aceste tehnici suportă unele cheltuieli generale de performanță din cauza lipsei suportului de virtualizare MMU, în comparație cu o VM care rulează pe o arhitectură virtualizabilă nativ, cum ar fi IBM System / 370 .

Pe mainframe-urile tradiționale, hipervizorul clasic de tip 1 era de sine stătător și nu depindea de niciun sistem de operare și nici nu executa aplicațiile utilizatorului. În schimb, primele produse de virtualizare x86 au fost destinate computerelor stațiilor de lucru și au rulat un sistem de operare invitat în interiorul unui sistem de operare gazdă încorporând hipervizorul într-un modul de nucleu care a funcționat sub sistemul de operare gazdă (tip 2 hipervizor).

Au existat unele controverse dacă arhitectura x86 fără asistență hardware este virtualizabilă așa cum este descris de Popek și Goldberg . Cercetătorii VMware au subliniat într-o lucrare ASPLOS din 2006 că tehnicile de mai sus au făcut ca platforma x86 să fie virtualizabilă în sensul îndeplinirii celor trei criterii ale lui Popek și Goldberg, deși nu prin tehnica clasică trap-and-emulate.

O altă cale a fost luată de alte sisteme precum Denali , L4 și Xen , cunoscute sub numele de paravirtualizare , care implică portarea sistemelor de operare pentru a rula pe mașina virtuală rezultată, care nu implementează părțile din setul de instrucțiuni x86 care sunt greu de virtualizat . E / S paravirtualizate are beneficii semnificative de performanță, așa cum este demonstrat în hârtia originală SOSP '03 Xen.

Versiunea inițială a x86-64 ( AMD64 ) nu a permis o virtualizare completă numai software datorită lipsei suportului de segmentare în modul lung , ceea ce a făcut imposibilă protecția memoriei hipervizorului, în special protecția manipulatorului de capcană care rulează în spațiul de adresă al nucleului de oaspeți. Revizuirea D și procesorele AMD pe 64 de biți (de regulă, cele fabricate în 90 nm sau mai puțin) au adăugat suport de bază pentru segmentare în modul lung, făcând posibilă rularea oaspeților pe 64 de biți în gazde pe 64 de biți prin traducere binară . Intel nu a adăugat suport de segmentare la implementarea sa x86-64 ( Intel 64 ), ceea ce face imposibilă virtualizarea numai pe 64 de biți pe procesoarele Intel, dar suportul Intel VT-x face posibilă virtualizarea hardware pe 64 de biți pe platforma Intel.

Pe unele platforme, este posibil să rulați un musafir pe 64 de biți pe un sistem de operare gazdă pe 32 de biți dacă procesorul de bază este pe 64 de biți și acceptă extensiile de virtualizare necesare.

Virtualizare asistată de hardware

În 2005 și 2006, Intel și AMD (care lucrează independent) au creat noi extensii de procesor pentru arhitectura x86. Prima generație de virtualizare hardware x86 a abordat problema instrucțiunilor privilegiate. Problema performanței scăzute a memoriei de sistem virtualizate a fost abordată cu virtualizarea MMU care a fost adăugată ulterior la chipset.

Unități centrale de procesare

Mod 8086 virtual

Pe baza experiențelor dureroase cu modul protejat 80286 , care în sine nu era suficient de adecvat pentru a rula bine aplicații DOS simultane , Intel a introdus modul virtual 8086 în cipul lor 80386 , care oferea procesoare 8086 virtualizate pe cipurile 386 și ulterioare. Cu toate acestea, suportul hardware pentru virtualizarea modului protejat în sine a devenit disponibil 20 de ani mai târziu.

Virtualizare AMD (AMD-V)

AMD și-a dezvoltat extensiile de virtualizare de prima generație sub numele de cod „Pacifica” și le-a publicat inițial ca AMD Secure Virtual Machine (SVM), dar ulterior le-a comercializat sub marca AMD Virtualization , prescurtată AMD-V .

Pe 23 mai 2006, AMD a lansat Athlon 64 ( „Orleans” ), Athlon 64 X2 ( „Windsor” ) și Athlon 64 FX ( „Windsor” ) ca primii procesoare AMD care susțin această tehnologie.

Capacitatea AMD-V este, de asemenea, prezentată pe familia de procesoare Athlon 64 și Athlon 64 X2 cu reviziile „F” sau „G” pe soclurile AM2 , Turion 64 X2 și Opteron de generația a doua și a treia generație, procesatoare Phenom și Phenom II . Cele APU Fusion procesoare suporta AMD-V. AMD-V nu este acceptat de niciun procesor Socket 939. Singurele procesoare Sempron care îl suportă sunt APU-uri și CPU-uri desktop Huron , Regor , Sargas .

CPU-urile AMD Opteron care încep cu linia Family 0x10 Barcelona și CPU-urile Phenom II acceptă o tehnologie de virtualizare hardware de a doua generație numită Rapid Virtualization Indexing (cunoscută anterior sub numele de Nested Page Tables în timpul dezvoltării sale), adoptată ulterior de Intel ca Extended Page Tables (EPT) .

Începând din 2019, toate procesoarele AMD bazate pe Zen acceptă AMD-V.

Pavilion CPU pentru AMD-V este "SVM". Acest lucru poate fi verificat în derivatele BSD prin dmesg sau sysctl și în Linux prin . Instrucțiunile din AMD-V includ VMRUN, VMLOAD, VMSAVE, CLGI, VMMCALL, INVLPGA, SKINIT și STGI. /proc/cpuinfo

Cu unele plăci de bază , utilizatorii trebuie să activeze caracteristica AMD SVM în configurarea BIOS înainte ca aplicațiile să o poată utiliza.

Virtualizare Intel (VT-x)

Image

Anterior denumit în cod „Vanderpool”, VT-x reprezintă tehnologia Intel pentru virtualizare pe platforma x86. La 13 noiembrie 2005, Intel a lansat două modele de Pentium 4 (modelele 662 și 672) ca primele procesoare Intel care acceptă VT-x. Semnalizatorul CPU pentru capacitatea VT-x este „vmx”; în Linux, acest lucru poate fi verificat prin /proc/cpuinfosau în macOS prin sysctl machdep.cpu.features.

„VMX” înseamnă Virtual Machine Extensions, care adaugă 13 instrucțiuni noi: VMPTRLD, VMPTRST, VMCLEAR, VMREAD, VMWRITE, VMCALL, VMLAUNCH, VMRESUME, VMXOFF, VMXON, INVEPT, INVVPID și VMFUNC. Aceste instrucțiuni permit intrarea și ieșirea dintr-un mod de execuție virtual în care sistemul de operare invitat se percepe ca rulând cu privilegiu complet (inelul 0), dar sistemul de operare gazdă rămâne protejat.

Începând cu 2015, aproape toate procesoarele Intel pentru server, desktop și mobile mai noi acceptă VT-x, cu unele dintre procesoarele Intel Atom ca excepție principală. Cu unele plăci de bază , utilizatorii trebuie să activeze funcția VT-x Intel în configurarea BIOS înainte ca aplicațiile să o poată folosi.

Intel a început să includă Extended Page Tables (EPT), o tehnologie pentru virtualizarea tabelelor de pagină, de la arhitectura Nehalem , lansată în 2008. În 2010, Westmere a adăugat suport pentru lansarea procesorului logic direct în modul real  - o caracteristică numită „guest nelimitat ", care necesită ca EPT să funcționeze.

De la microarhitectura Haswell (anunțată în 2013), Intel a început să includă umbrirea VMCS ca o tehnologie care accelerează virtualizarea imbricată a VMM-urilor. Structura de control al mașinii virtuale (VMCS) este o structură de date în memorie care există exact o dată pe VM, în timp ce este gestionată de VMM. Cu fiecare schimbare a contextului de execuție între diferite VM-uri, VMCS este restabilită pentru VM curentă, definind starea procesorului virtual al VM. De îndată ce sunt utilizate mai multe VMM sau VMM imbricate, apare o problemă într-un mod similar cu ceea ce a necesitat inventarea gestionării tabelelor de pagini umbre, așa cum este descris mai sus . În astfel de cazuri, VMCS trebuie să fie umbrit de mai multe ori (în caz de cuibărire) și parțial implementat în software în cazul în care nu există suport hardware de către procesor. Pentru a face gestionarea shadow VMCS mai eficientă, Intel a implementat suport hardware pentru umbrirea VMCS.

Virtualizare VIA (VIA VT)

Procesoare din seria VIA Nano 3000 și tehnologie de virtualizare VIA VT compatibilă cu Intel VT-x. EPT este prezent în Zhaoxin ZX-C, un descendent al VIA QuadCore-E și Eden X4 similar cu Nano C4350AL .

Virtualizare de întrerupere (AMD AVIC și Intel APICv)

În 2012, AMD și-a anunțat controlerul avansat de întrerupere virtuală ( AVIC ) care vizează reducerea cheltuielilor de întrerupere în mediile de virtualizare. Această tehnologie, așa cum a fost anunțat, nu acceptă x2APIC . În 2016, AVIC este disponibil pe procesoarele de familie AMD 15h modele 6Xh (Carrizo) și mai noi.

Tot în 2012, Intel a anunțat o tehnologie similară pentru întreruperea și virtualizarea APIC , care nu avea un nume de marcă la momentul anunțului. Ulterior, a fost marcat ca virtualizare APIC ( APICv ) și a devenit disponibil comercial în seria Ivy Bridge EP de procesoare Intel, care este vândută ca Xeon E5-26xx v2 (lansată la sfârșitul anului 2013) și ca Xeon E5-46xx v2 (lansată la începutul anului 2014).

Unitate de procesare grafică

Virtualizarea grafică nu face parte din arhitectura x86. Intel Graphics Virtualization Technology (GVT) oferă virtualizarea grafică ca parte a arhitecturilor grafice Gen mai recente. Deși APU-urile AMD implementează setul de instrucțiuni x86-64 , acestea implementează arhitecturi grafice proprii AMD ( TeraScale , GCN și RDNA ) care nu acceptă virtualizarea grafică. Larrabee a fost singura microarhitectură grafică bazată pe x86, dar probabil nu a inclus suport pentru virtualizarea grafică.

Chipset

Memoria și virtualizarea I / O sunt realizate de chipset . De obicei, aceste caracteristici trebuie să fie activate de BIOS, care trebuie să le poată accepta și să fie setate să le folosească.

Virtualizare I / O MMU (AMD-Vi și Intel VT-d)

Image
Un jurnal de kernel Linux care arată informații AMD-Vi

O unitate de gestionare a memoriei de intrare / ieșire (IOMMU) permite mașinilor virtuale invitate să utilizeze direct dispozitive periferice , cum ar fi Ethernet, plăci grafice accelerate și controlere de hard disk, prin DMA și remaparea întreruperilor . Aceasta se numește uneori passthrough PCI .

Un IOMMU permite, de asemenea, sistemelor de operare să elimine tampoanele de respingere necesare pentru a se permite să comunice cu dispozitive periferice ale căror spații de adrese de memorie sunt mai mici decât spațiul de adrese de memorie al sistemului de operare, utilizând traducerea adreselor de memorie. În același timp, o IOMMU permite, de asemenea, sistemelor de operare și hipervizorilor să prevină ca buggy sau hardware-ul rău intenționat să compromită securitatea memoriei .

Atât AMD, cât și Intel și-au lansat specificațiile IOMMU:

  • Tehnologia de virtualizare I / O a AMD, „AMD-Vi”, numită inițial „IOMMU”
  • „Tehnologia de virtualizare pentru I / O direcționată” (VT-d) Intel, inclusă în majoritatea procesoarelor Intel de ultimă generație (dar nu în toate) de la arhitectura Core 2.

În plus față de suportul CPU, atât chipset - ul plăcii de bază , cât și firmware-ul de sistem ( BIOS sau UEFI ) trebuie să accepte pe deplin funcționalitatea de virtualizare IOMMU I / O pentru a fi utilizabilă. Numai dispozitivele PCI sau PCI Express care acceptă resetarea nivelului funcției (FLR) pot fi virtualizate în acest fel, deoarece este necesar pentru reasignarea diferitelor funcții ale dispozitivului între mașinile virtuale. Dacă un dispozitiv care urmează să fie alocat nu acceptă întreruperi semnalizate prin mesaje (MSI), nu trebuie să partajeze liniile de întrerupere cu alte dispozitive pentru ca alocarea să fie posibilă. Toate dispozitivele PCI convenționale direcționate în spatele unui pod PCI / PCI-X -to-PCI Express pot fi alocate unei mașini virtuale invitate numai dintr-o dată; Dispozitivele PCI Express nu au o astfel de restricție.

Virtualizarea rețelei (VT-c)

  • „Tehnologia de virtualizare pentru conectivitate” Intel (VT-c).
Virtualizare PCI-SIG Single Root I / O (SR-IOV)

PCI-SIG Virtual Root I / O Virtualization (SR-IOV) oferă un set de metode generale (nespecifice x86) de virtualizare I / O bazate pe hardware nativ PCI Express (PCIe), standardizat de PCI-SIG:

  • Serviciile de traducere a adreselor (ATS) acceptă IOV nativ pe PCI Express prin traducerea adreselor. Necesită suport pentru tranzacții noi pentru a configura astfel de traduceri.
  • Single-root IOV (SR-IOV sau SRIOV) acceptă IOV nativ în topologiile PCI Express complexe single-root existente. Necesită suport pentru noile capacități ale dispozitivului pentru a configura mai multe spații de configurare virtualizate.
  • Multi-root IOV (MR-IOV) acceptă IOV nativ în topologii noi (de exemplu, servere blade), bazându-se pe SR-IOV pentru a furniza mai multe complexe rădăcină care împărtășesc o ierarhie PCI Express comună.

În SR-IOV, cel mai comun dintre acestea, o gazdă VMM configurează dispozitivele acceptate pentru a crea și aloca „umbre” virtuale ale spațiilor de configurare, astfel încât oaspeții mașinii virtuale să poată configura și accesa direct astfel de resurse ale dispozitivului „umbră”. Cu SR-IOV activat, interfețele de rețea virtualizate sunt direct accesibile oaspeților, evitând implicarea VMM și rezultând în performanțe generale ridicate; de exemplu, SR-IOV realizează peste 95% din lățimea de bandă a rețelei metalice goale în centrul de date virtualizat al NASA și în Amazon Public Cloud .

Vezi si

Referințe

linkuri externe