x86 -virtualisering - x86 virtualization

x86-virtualisering är användningen av hårdvaruassisterad virtualiseringsfunktioner på en x86/x86-64 CPU.

I slutet av 1990-talet uppnåddes x86-virtualisering med komplexa mjukvarutekniker, nödvändiga för att kompensera för processorns brist på hårdvaruassisterad virtualiseringsfunktioner samtidigt som rimlig prestanda uppnås. Under 2005 och 2006 introducerade både Intel ( VT-x ) och AMD ( AMD-V ) begränsat hårdvaruvirtualiseringsstöd som möjliggjorde enklare virtualiseringsprogram men erbjöd mycket få hastighetsfördelar. Större hårdvarusupport, vilket möjliggjorde betydande hastighetsförbättringar, kom med senare processormodeller.

Programvarubaserad virtualisering

Följande diskussion fokuserar endast på virtualisering av det skyddade x86 -läget .

I skyddat läge körs operativsystemets kärna med ett högre privilegium, till exempel ring 0, och applikationer med lägre behörighet, till exempel ring 3. I mjukvarubaserad virtualisering har ett värd-OS direkt åtkomst till hårdvara medan gäst-operativsystemen har begränsad åtkomst till hårdvara, precis som alla andra program på värd -operativsystemet. Ett tillvägagångssätt som används i x86-mjukvarubaserad virtualisering för att övervinna denna begränsning kallas ringdeprivilegering , vilket innebär att du kör gäst-operativsystemet med en ring högre (mindre privilegierad) än 0.

Tre tekniker möjliggjorde virtualisering av skyddat läge:

  • Binär översättning används för att skriva om i ring 3-instruktioner vissa ring 0-instruktioner, till exempel POPF , som annars skulle misslyckas tyst eller bete sig annorlunda när de körs ovanför ring 0, vilket gör den klassiska trap-and-emulate-virtualiseringen omöjlig. För att förbättra prestanda måste de översatta grundläggande blocken cachas på ett sammanhängande sätt som upptäcker kodlappning (används till exempel i VxD ), återanvändning av sidor av gäst-operativsystemet eller till och med självmodifierande kod .
  • Ett antal viktiga datastrukturer som används av en processor måste skuggas . Eftersom de flesta operativsystem använder visat virtuellt minne och att ge gäst -OS direkt åtkomst till MMU skulle innebära förlust av kontroll av virtualiseringshanteraren , måste en del av x86 MMU: s arbete kopieras i programvara för gäst -operativsystemet med hjälp av en teknik kallas skuggsidabord . Detta innebär att neka gäst -operativsystemet någon åtkomst till de faktiska sidtabellposterna genom att fånga åtkomstförsök och emulera dem istället i programvara. X86 -arkitekturen använder dolt tillstånd för att lagra segmentbeskrivare i processorn, så när segmentbeskrivningarna har laddats in i processorn kan minnet från vilket de har laddats skrivas över och det finns inget sätt att få tillbaka beskrivningarna från processorn . Skuggbeskrivningstabeller måste därför användas för att spåra ändringar som görs i beskrivningstabellerna av gäst -operativsystemet.
  • I/O -enhetsemulering: Enheter som inte stöds i gäst -operativsystemet måste emuleras av en enhetsemulator som körs i värd -operativsystemet.

Dessa tekniker medför vissa prestandakostnader på grund av brist på MMU -virtualiseringsstöd jämfört med en virtuell dator som körs på en inbyggd virtualiserbar arkitektur som IBM System/370 .

På traditionella stordatorer var den klassiska typ 1- hypervisoren självständig och berodde inte på något operativsystem eller körde några användarprogram själv. Däremot riktades de första x86 -virtualiseringsprodukterna till arbetsstationsdatorer och körde ett gäst -OS i ett värd -operativsystem genom att bädda in hypervisor i en kärnmodul som kördes under värd -operativsystemet (typ 2 -hypervisor).

Det har varit en del kontroverser om x86 -arkitekturen utan maskinvaruassistans är virtualiserbar som beskrivs av Popek och Goldberg . VMware- forskare påpekade i ett ASPLOS- papper från 2006 att ovanstående tekniker gjorde x86-plattformen virtualiserbar i bemärkelsen att de uppfyllde de tre kriterierna för Popek och Goldberg, om än inte med den klassiska fäll-och-emulera-tekniken.

En annan väg togs av andra system som Denali , L4 och Xen , känd som paravirtualisering , vilket innebär att portsystem av operativsystem körs på den resulterande virtuella maskinen, som inte implementerar de delar av själva x86 -instruktionsuppsättningen som är svåra att virtualisera . Den paravirtualiserade I/O har betydande prestandafördelar som visas i det ursprungliga SOSP '03 Xen -papperet .

Den ursprungliga versionen av x86-64 ( AMD64 ) tillät inte en fullständig virtualisering endast på grund av bristen på segmenteringsstöd i långt läge , vilket gjorde skyddet av hypervisorns minne omöjligt, i synnerhet skyddet för fällhanteraren som körs i gästkärnans adressutrymme. Revision D och senare 64-bitars AMD-processorer (som tumregel, de som tillverkas i 90 nm eller mindre) lade till grundläggande stöd för segmentering i långt läge, vilket gjorde det möjligt att köra 64-bitars gäster i 64-bitars värdar via binär översättning . Intel lade inte till segmenteringsstöd till sin x86-64-implementering ( Intel 64 ), vilket gjorde 64-bitars mjukvaru-virtualisering omöjlig på Intel-processorer, men Intel VT-x-stöd gör 64-bitars maskinvaruassisterad virtualisering möjlig på Intel-plattformen.

På vissa plattformar är det möjligt att köra en 64-bitars gäst på ett 32-bitars värd-operativsystem om den underliggande processorn är 64-bitars och stöder nödvändiga virtualiseringstillägg.

Maskinvaruassisterad virtualisering

Under 2005 och 2006 skapade Intel och AMD (arbetar oberoende) nya processortillägg till x86 -arkitekturen. Den första generationen av x86 hårdvaruvirtualisering tog upp frågan om privilegierade instruktioner. Problemet med låg prestanda för virtualiserat systemminne behandlades med MMU -virtualisering som lades till i chipsetet senare.

Centrala behandlingsenheten

Virtuellt 8086 -läge

Baserat på smärtsamma erfarenheter av det skyddade läget 80286 , som i sig inte var tillräckligt lämpligt för att köra samtidiga DOS -applikationer väl, introducerade Intel det virtuella 8086 -läget i sitt 80386 -chip, som erbjöd virtualiserade 8086 -processorer på 386 och senare chips. Maskinvarustöd för virtualisering av själva det skyddade läget blev dock tillgängligt 20 år senare.

AMD-virtualisering (AMD-V)

AMD utvecklade sina första generationens virtualiseringstillägg under kodnamnet "Pacifica" och publicerade dem ursprungligen som AMD Secure Virtual Machine (SVM), men marknadsförde dem senare under varumärket AMD Virtualization , förkortat AMD-V .

Den 23 maj 2006 släppte AMD Athlon 64 ( "Orleans" ), Athlon 64 X2 ( "Windsor" ) och Athlon 64 FX ( "Windsor" ) som de första AMD -processorerna som stödde denna teknik.

AMD-V-funktionen finns också i Athlon 64- och Athlon 64 X2- processorfamiljen med revisioner "F" eller "G" på socket AM2 , Turion 64 X2 och Opteron 2: a generationen och tredje generationens, Phenom- och Phenom II- processorer. De APU Fusion -processorer stöder AMD-V. AMD-V stöds inte av några Socket 939-processorer. De enda Sempron -processorerna som stöder det är APU: er och Huron , Regor , Sargas stationära processorer.

AMD Opteron -processorer som börjar med Family 0x10 Barcelona -linjen och Phenom II -processorer stöder en andra generationens hårdvaruvirtualiseringsteknik som kallas Rapid Virtualization Indexing (tidigare känd som kapslade sidtabeller under utvecklingen), senare antagen av Intel som Extended Page Tables (EPT) .

Från och med 2019 stöder alla Zen -baserade AMD -processorer AMD -V.

Den CPU flagga för AMD-V är "SVM". Detta kan kontrolleras i BSD -derivat via dmesg eller sysctl och i Linux via . Instruktioner i AMD-V inkluderar VMRUN, VMLOAD, VMSAVE, CLGI, VMMCALL, INVLPGA, SKINIT och STGI. /proc/cpuinfo

Med vissa moderkort måste användare aktivera AMD SVM -funktionen i BIOS -installationen innan program kan använda den.

Intel-virtualisering (VT-x)

Intel Core i7 (Bloomfield) CPU

Tidigare kodnamnet "Vanderpool", VT-x representerar Intels teknik för virtualisering på x86-plattformen. Den 13 november 2005 släppte Intel två modeller av Pentium 4 (modell 662 och 672) som de första Intel-processorerna som stöder VT-x. CPU-flaggan för VT-x-kapacitet är "vmx"; i Linux kan detta kontrolleras via /proc/cpuinfoeller i macOS via sysctl machdep.cpu.features.

"VMX" står för Virtual Machine Extensions, som lägger till 13 nya instruktioner: VMPTRLD, VMPTRST, VMCLEAR, VMREAD, VMWRITE, VMCALL, VMLAUNCH, VMRESUME, VMXOFF, VMXON, INVEPT, INVVPID och VMFUNC. Dessa instruktioner gör det möjligt att komma in och ut från ett virtuellt körningsläge där gäst -operativsystemet uppfattar sig själv som kör med full behörighet (ring 0), men värd -operativsystemet förblir skyddat.

Från och med 2015 stöder nästan alla nyare server-, stationära och mobila Intel-processorer VT-x, med några av Intel Atom- processorerna som det främsta undantaget. Med vissa moderkort måste användare aktivera Intels VT-x-funktion i BIOS- inställningen innan applikationer kan använda den.

Intel började inkludera Extended Page Tables (EPT), en teknik för sidtabellvirtualisering, sedan Nehalem- arkitekturen, som släpptes 2008. År 2010 lade Westmere till stöd för att starta den logiska processorn direkt i realläge-  en funktion som kallas "obegränsad gäst ", vilket kräver att EPT fungerar.

Sedan Haswell mikroarkitektur (tillkännagav 2013) började Intel inkludera VMCS -skuggning som en teknik som påskyndar kapslad virtualisering av VMM. Den virtuella maskinkontrollstrukturen (VMCS) är en datastruktur i minnet som existerar exakt en gång per virtuell dator , medan den hanteras av VMM. Med varje ändring av körningskontexten mellan olika virtuella datorer återställs VMCS för den aktuella virtuella datorn, vilket definierar tillståndet för den virtuella datorns virtuella processor. Så snart mer än en VMM eller kapslade VMM används visas ett problem på ett sätt som liknar vad som krävde att hantering av skuggsidesbordet uppfanns, såsom beskrivits ovan . I sådana fall måste VMCS skuggas flera gånger (vid häckning) och delvis implementeras i programvara om det inte finns något maskinvarusupport från processorn. För att effektivisera skugghantering av VMCS implementerade Intel maskinvarusupport för skuggning av VMCS.

VIA -virtualisering (VIA VT)

VIA Nano 3000-serie processorer och högre stöd för VIA VT-virtualiseringsteknik som är kompatibel med Intel VT-x. EPT finns i Zhaoxin ZX-C, en ättling till VIA QuadCore-E & Eden X4 liknande Nano C4350AL .

Avbryt virtualisering (AMD AVIC och Intel APICv)

Under 2012 tillkännagav AMD sin Advanced Virtual Interrupt Controller ( AVIC ) som inriktar sig på avbrott i allmänna kostnader i virtualiseringsmiljöer. Den här tekniken stöder, som tillkännagiven, inte x2APIC . 2016 finns AVIC tillgängligt på AMD -familjen 15h -modeller 6Xh (Carrizo) -processorer och nyare.

Även 2012 tillkännagav Intel en liknande teknik för avbrott och APIC -virtualisering, som inte hade ett varumärke vid tillkännagivandet. Senare märktes det som APIC-virtualisering ( APICv ) och det blev kommersiellt tillgängligt i Ivy Bridge EP- serien av Intel-processorer, som säljs som Xeon E5-26xx v2 (lanserades i slutet av 2013) och som Xeon E5-46xx v2 (lanserades i början av 2014).

Grafisk bearbetningsenhet

Grafisk virtualisering är inte en del av x86 -arkitekturen. Intel Graphics Virtualization Technology (GVT) tillhandahåller grafikvirtualisering som en del av nyare Gen grafikarkitekturer. Även om AMD APU: er implementerar instruktionsuppsättningen x86-64 , implementerar de AMD: s egna grafikarkitekturer ( TeraScale , GCN och RDNA ) som inte stöder grafisk virtualisering. Larrabee var den enda grafiska mikroarkitekturen baserad på x86, men den inkluderade sannolikt inte stöd för grafikvirtualisering.

Chipset

Minne och I/O -virtualisering utförs av chipsetet . Vanligtvis måste dessa funktioner aktiveras av BIOS, som måste kunna stödja dem och också vara inställda på att använda dem.

I/O MMU-virtualisering (AMD-Vi och Intel VT-d)

En Linux-kärnlogg som visar AMD-Vi-information

En in/utminnehanteringsenhet (IOMMU) tillåter virtuella gästmaskiner att direkt använda kringutrustning , till exempel Ethernet, accelererade grafikkort och hårddiskkontroller, via DMA och avbrytande ommappning. Detta kallas ibland PCI -genomströmning .

En IOMMU tillåter också operativsystem att eliminera studsbuffertar som behövs för att tillåta sig att kommunicera med kringutrustning vars minnesadressutrymmen är mindre än operativsystemets minnesadressutrymme, med hjälp av minnesadressöversättning. Samtidigt tillåter en IOMMU också operativsystem och hypervisorer att förhindra att buggy eller skadlig hårdvara äventyrar minnesäkerheten .

Både AMD och Intel har släppt sina IOMMU -specifikationer:

  • AMDs I/O Virtualization Technology, "AMD-Vi", ursprungligen kallad "IOMMU"
  • Intels "Virtualization Technology for Directed I/O" (VT-d), ingår i de flesta avancerade (men inte alla) nyare Intel-processorer sedan Core 2-arkitekturen.

Förutom CPU -stödet måste både moderkortets chipset och systemets firmware ( BIOS eller UEFI ) fullt ut stödja IOMMU I/O -virtualiseringsfunktionaliteten för att den ska kunna användas. Endast PCI- eller PCI Express -enheter som stöder funktionsnivååterställning (FLR) kan virtualiseras på detta sätt, eftersom det krävs för att tilldela olika enhetsfunktioner mellan virtuella maskiner. Om en enhet som ska tilldelas inte stöder Message Signaled Interrupts (MSI) får den inte dela avbrottslinjer med andra enheter för att tilldelningen ska vara möjlig. Alla konventionella PCI- enheter som dirigeras bakom en PCI/ PCI-X- till-PCI Express-brygga kan bara tilldelas en virtuell gästmaskin samtidigt. PCI Express -enheter har ingen sådan begränsning.

Nätverksvirtualisering (VT-c)

  • Intels "Virtualization Technology for Connectivity" (VT-c).
PCI-SIG Single Root I/O-virtualisering (SR-IOV)

PCI-SIG Single Root I/O Virtualization (SR-IOV) tillhandahåller en uppsättning allmänna (icke-x86-specifika) I/O-virtualiseringsmetoder baserade på PCI Express (PCIe) inbyggd hårdvara, som standardiserats av PCI-SIG:

  • Adressöversättningstjänster (ATS) stöder inbyggd IOV över PCI Express via adressöversättning. Det kräver stöd för nya transaktioner för att konfigurera sådana översättningar.
  • Single-root IOV (SR-IOV eller SRIOV) stöder native IOV i befintliga single-root komplexa PCI Express-topologier. Det kräver stöd för nya enhetsfunktioner för att konfigurera flera virtualiserade konfigurationsutrymmen.
  • Multi-root IOV (MR-IOV) stöder native IOV i nya topologier (till exempel bladservrar) genom att bygga på SR-IOV för att tillhandahålla flera rotkomplex som delar en gemensam PCI Express-hierarki.

I SR-IOV, den vanligaste av dessa, konfigurerar en VMM-värd enheter som stöds för att skapa och tilldela virtuella "skuggor" av sina konfigurationsutrymmen så att virtuella datagäster direkt kan konfigurera och komma åt sådana "skugga" enhetsresurser. Med SR-IOV aktiverat är virtualiserade nätverksgränssnitt direkt tillgängliga för gästerna, vilket undviker inblandning av VMM och resulterar i hög övergripande prestanda. till exempel uppnår SR-IOV över 95% av bandmetallens bandbredd i nätt metall i NASA : s virtualiserade datacenter och i Amazonas offentliga moln .

Se även

Referenser

externa länkar