Delen via


Inter-Partition Communicatie

De hypervisor biedt twee eenvoudige mechanismen waarmee de ene partitie kan communiceren met een andere partitie: berichten en gebeurtenissen. In beide gevallen wordt een melding gesignaleerd met behulp van de SynIC (synthetische interruptcontroller).

SynIC-berichten

De hypervisor biedt een eenvoudige communicatiefaciliteit tussen partities waarmee één partitie een geparameteriseerd bericht naar een andere partitie kan verzenden. (Omdat het bericht asynchroon wordt verzonden, wordt gezegd dat het wordt gepost.) De doelpartitie kan worden geïnformeerd over de aankomst van dit bericht via een interrupt. Berichten kunnen expliciet worden verzonden met behulp van de HvCallPostMessage-hypercall of impliciet door de hypervisor.

Messages

Wanneer een bericht wordt verzonden, selecteert de hypervisor een gratis berichtbuffer. De set beschikbare berichtbuffers is afhankelijk van de gebeurtenis die het verzenden van het bericht heeft geactiveerd.

De hypervisor markeert de berichtbuffer 'in gebruik' en vult de berichtkop in met het berichttype, de nettoladinggrootte en informatie over de afzender. Ten slotte wordt de nettolading van het bericht ingevuld. De inhoud van de nettolading is afhankelijk van de gebeurtenis die het bericht heeft geactiveerd.

De hypervisor voegt vervolgens de berichtbuffer toe aan een ontvangende berichtenwachtrij. De ontvangende berichtenwachtrij is afhankelijk van de gebeurtenis die het verzenden van het bericht heeft geactiveerd. Voor alle berichttypen is SINTx impliciet (in het geval van onderscheppingsberichten), expliciet (in het geval van timerberichten) of opgegeven door een poort-id (in het geval van gastberichten). De virtuele doelprocessor wordt expliciet opgegeven of gekozen door de hypervisor wanneer het bericht wordt ge enqueued. Virtuele processors waarvan de SynIC- of SIM-pagina is uitgeschakeld, worden niet beschouwd als potentiële doelen. Als er geen doelen beschikbaar zijn, beëindigt de hypervisor de bewerking en retourneert de aanroeper een fout.

De hypervisor bepaalt vervolgens of de opgegeven SINTx-berichtsite binnen de SIM-pagina voor de virtuele doelprocessor leeg is. Als het berichttype in de berichtensite gelijk is aan HvMessageTypeNone (dat wil gezegd nul), wordt ervan uitgegaan dat de berichtensite leeg is. In dit geval wordt de berichtbuffer door de hypervisor verwijderd en wordt de inhoud ervan gekopieerd naar de berichtensite op de SIM-pagina. De hypervisor kan alleen het aantal nettoladingbytes kopiëren dat aan het bericht is gekoppeld. De hypervisor probeert ook een door edge geactiveerde interrupt te genereren voor de opgegeven SINTx. Als de APIC software is uitgeschakeld of de SINTx wordt gemaskeerd, gaat de interrupt verloren. De aankomst van deze interrupt meldt de gast dat er een nieuw bericht is aangekomen. Als de SIM-pagina is uitgeschakeld of de berichtensleuf op de SIM-pagina niet leeg is, blijft het bericht in de wachtrij en wordt er geen interrupt gegenereerd.

Net als bij een interrupt met een vaste prioriteit wordt de interrupt pas door de virtuele processor bevestigd als de PPR (procesprioriteitsregister) kleiner is dan de vector die is opgegeven in het SINTx-register en interrupts niet worden gemaskeerd door de virtuele processor (rFLAGS[ALS] is ingesteld op 1).

Meerdere berichtbuffers met dezelfde SINTx kunnen in de wachtrij worden geplaatst voor een virtuele processor. In dit geval levert de hypervisor het eerste bericht (dat wil gezegd, schrijf het naar de SIM-pagina) en laat de anderen in de wachtrij staan totdat een van de drie gebeurtenissen plaatsvindt:

  • Een andere berichtbuffer wordt in de wachtrij geplaatst.
  • De gast geeft het "einde van interrupt" aan door te schrijven naar het EOI-register van de APIC.
  • De gast geeft het 'einde van bericht' aan door naar het EOM-register van synIC te schrijven.

In alle drie gevallen scant de hypervisor een of meer berichtenbufferwachtrijen en probeert ze extra berichten te leveren. De hypervisor probeert ook een door edge geactiveerde interrupt te genereren, waarmee wordt aangegeven dat er een nieuw bericht is aangekomen.

SIM-pagina

De SIM-pagina bestaat uit een matrix van 16 elementen van 256 byteberichten (zie HV_MESSAGE gegevensstructuur). Elk matrixelement (ook wel een berichtensite genoemd) komt overeen met één synthetische interruptbron (SINTx). Een berichtsite is 'leeg' als het berichttype van het bericht in de site gelijk is aan HvMessageTypeNone.

Het adres voor de SIM-pagina wordt opgegeven in het SIMP-register. Het adres van de SIM-pagina moet uniek zijn voor elke virtuele processor. Het programmeren van deze pagina's om andere exemplaren van de SIEF- of SIM-pagina's of een andere overlaypagina (bijvoorbeeld de hypercall-pagina) te overlappen, leidt tot niet-gedefinieerd gedrag.

Lees- en schrijftoegang door een virtuele processor naar de SIM-pagina gedragen zich als lees- en schrijftoegang tot RAM-geheugen. De SynIC-implementatie van de hypervisor schrijft echter ook naar de pagina's als reactie op bepaalde gebeurtenissen.

Bij het maken en opnieuw instellen van de virtuele processor wordt de SIM-pagina gewist tot nul.

Het SynIC-mechanisme voor het bezorgen van berichten is ontworpen voor een efficiënte bezorging en ontvangst van berichten binnen een doelpartitie. Het wordt aanbevolen dat de berichtafhandeling isr (onderbrekingsserviceroutine) binnen de doelpartitie de volgende stappen uitvoert:

  • Bekijk het bericht dat is opgeslagen in de SIM-berichtensite.
  • Kopieer de inhoud van het bericht naar een andere locatie en stel het berichttype in de berichtensite in op HvMessageTypeNone.
  • Geef het einde van de interrupt voor de vector aan door naar het EOI-register van de APIC te schrijven.
  • Voer alle acties uit die door het bericht worden geïmpliceerd.

Berichtbronnen

De klassen gebeurtenissen die het verzenden van een bericht kunnen activeren, zijn als volgt:

  • Onderscheppingen: als u een virtuele processor onderschept, wordt een bericht verzonden naar de bovenliggende partitie of een hogere VTL.
  • Timers: De timermechanismen zorgen ervoor dat berichten worden verzonden. Gekoppeld aan elke virtuele processor zijn vier toegewezen timerberichtbuffers, één voor elke timer. De ontvangende berichtenwachtrij behoort tot SINTx van de virtuele processor waarvan de timer het verzenden van het bericht heeft geactiveerd.
  • Gastberichten: de hypervisor ondersteunt het doorgeven van berichten als een communicatiemechanisme tussen meerdere partities tussen gasten. Met de interfaces die in deze sectie zijn gedefinieerd, kan één gast berichten verzenden naar een andere gast. De berichtbuffers die worden gebruikt voor berichten van deze klasse, worden opgehaald uit de groep per poort van gastberichtbuffers van de ontvanger.

Berichtbuffers

Een berichtbuffer wordt intern gebruikt voor de hypervisor om een bericht op te slaan totdat het aan de geadresseerde wordt bezorgd. De hypervisor onderhoudt verschillende sets berichtbuffers.

Buffers voor gastberichten

De hypervisor onderhoudt een set gastberichtbuffers voor elke poort. Deze buffers worden gebruikt voor berichten die expliciet van de ene partitie naar de andere worden verzonden door een gast. Wanneer een poort wordt gemaakt, wijst de hypervisor zestien (16) berichtbuffers toe aan de geheugengroep van de poorteigenaar. Deze berichtbuffers worden geretourneerd naar de geheugengroep wanneer de poort wordt verwijderd.

Berichtenbufferwachtrijen

Voor elke partitie en elke virtuele processor in de partitie onderhoudt de hypervisor één wachtrij met berichtbuffers voor elke SINTx (synthetische interruptbron) in de SynIC van de virtuele processor. Alle berichtenwachtrijen van een virtuele processor zijn leeg bij het maken of opnieuw instellen van de virtuele processor.

Betrouwbaarheid en sequentiëren van gastberichtbuffers

Berichten die door een gast zijn gepost, zijn in de wachtrij geplaatst voor levering door de hypervisor. De daadwerkelijke levering en ontvangst door de doelpartitie is afhankelijk van de juiste werking. Partities kunnen de bezorging van berichten naar bepaalde virtuele processors uitschakelen door de SynIC uit te schakelen of de SIMP uit te schakelen.

Het verbreken van een verbinding heeft geen invloed op niet-bezorgde (in de wachtrij geplaatste) berichten. Als u de doelpoort verwijdert, worden altijd alle berichtbuffers van de poort vrijgemaakt, ongeacht of deze beschikbaar zijn of niet-bezorgde (in de wachtrij geplaatste) berichten bevatten.

Berichten komen binnen in de volgorde waarin ze zijn geplaatst. Als de ontvangende poort is gekoppeld aan een specifieke virtuele processor, komen berichten binnen in dezelfde volgorde waarin ze zijn gepost. Als de ontvangende poort is gekoppeld aan HV_ANY_VP, zijn berichten niet gegarandeerd in een bepaalde bestelling.

SynIC-gebeurtenisvlagmen

Naast berichten ondersteunt synIC een tweede type meldingsmechanisme voor meerdere partities, ook wel gebeurtenisvlagmarkeringen genoemd. Gebeurtenisvlagmen kunnen expliciet worden ingesteld met behulp van de HvCallSignalEvent hypercall of impliciet door de hypervisor.

Gebeurtenisvlagmen versus berichten

Gebeurtenisvlagmen zijn lichter dan berichten en zijn daarom lagere overhead. Bovendien vereisen gebeurtenisvlagmen geen buffertoewijzing of wachtrij binnen de hypervisor, zodat HvCallSignalEvent nooit zal mislukken vanwege onvoldoende resources.

Bezorging van gebeurtenisvlag

Wanneer een partitie HvCallSignalEvent aanroept, geeft deze een gebeurtenisvlagnummer op. De hypervisor reageert door atomisch een bit in te stellen op de SIEF-pagina van de ontvangende virtuele processor. Virtuele processors waarvan de SynIC- of SIEF-pagina is uitgeschakeld, worden niet beschouwd als potentiële doelen. Als er geen doelen beschikbaar zijn, beëindigt de hypervisor de bewerking en retourneert de aanroeper een fout.

Als de gebeurtenisvlag eerder is gewist, probeert de hypervisor de ontvangende partitie te waarschuwen dat de vlag nu is ingesteld door een door edge geactiveerde interrupt te genereren. De virtuele doelprocessor, samen met de doel SINTx, wordt opgegeven als onderdeel van het maken van een poort. Als de SINTx is gemaskeerd, retourneert HvSignalEvent HV_STATUS_INVALID_SYNIC_STATE.

Net als bij een externe interrupt met een vaste prioriteit wordt de interrupt pas door de virtuele processor bevestigd als het procesprioriteitsregister (PPR) kleiner is dan de vector die is opgegeven in het SINTx-register en interrupts niet worden gemaskeerd door de virtuele processor (rFLAGS[ALS] is ingesteld op 1).

SIEF-pagina

De SIEF-pagina bestaat uit een matrix van 16 elementen van 256 bytegebeurtenissen (zie HV_SYNIC_EVENT_FLAGS). Elk matrixelement komt overeen met één synthetische interruptbron (SINTx).

Het adres voor de SIEF-pagina wordt opgegeven in het SIEF-register. Het adres van de SIEF-pagina moet uniek zijn voor elke virtuele processor. Het programmeren van deze pagina's om andere exemplaren van de SIEF- of SIM-pagina's of een andere overlaypagina (bijvoorbeeld de hypercall-pagina) te overlappen, leidt tot niet-gedefinieerd gedrag.

Lees- en schrijftoegang door een virtuele processor naar de SIEF-pagina gedraagt zich als lees- en schrijftoegang tot RAM-geheugen. De SynIC-implementatie van de hypervisor schrijft echter ook naar de pagina's als reactie op bepaalde gebeurtenissen.

Bij het maken en opnieuw instellen van de virtuele processor wordt de SIEF-pagina gewist tot nul.

Het wordt aanbevolen dat de gebeurtenisvlag onderbrekingsserviceroutine (ISR) binnen de doelpartitie de volgende stappen uitvoert:

  • Bekijk de gebeurtenisvlagmen en bepaal welke, indien van toepassing, zijn ingesteld.
  • Wis een of meer gebeurtenisvlagmen met behulp van een vergrendelde (atomische) bewerking, zoals LOCK AND of LOCK CMPXCHG.
  • Geef het einde van de interrupt voor de vector aan door naar het EOI-register van de APIC te schrijven.
  • Voer alle acties uit die worden geïmpliceerd door de gebeurtenisvlaggen die zijn ingesteld.

Poorten en verbindingen

Een bericht of gebeurtenis die van de ene gast naar de andere wordt verzonden, moet worden verzonden via een vooraf toegewezen verbinding. Een verbinding moet op zijn beurt zijn gekoppeld aan een doelpoort.

Een poort wordt toegewezen vanuit de geheugengroep van de ontvanger en geeft aan welke virtuele processor en SINTx moeten worden gericht. Gebeurtenispoorten hebben een 'basisvlagnummer' en 'aantal vlaggen' waarmee de aanroeper een bereik van geldige gebeurtenisvlagmen voor die poort kan opgeven.

Verbindingen worden toegewezen vanuit de geheugengroep van de afzender. Wanneer een verbinding wordt gemaakt, moet deze zijn gekoppeld aan een geldige poort. Met deze binding wordt een eenvoudig communicatiekanaal in één richting gemaakt. Als een poort vervolgens wordt verwijderd, wordt de verbinding, terwijl deze blijft, nutteloos.

SynIC-registers

Elke virtuele processor heeft een eigen kopie van deze registers, zodat ze onafhankelijk kunnen worden geprogrammeerd.

Op x64-platforms zijn deze registers toegankelijk als modelspecifieke registers (MSR's) met behulp van RDMSR- en WRMSR-instructies:

MSR-adres Registernaam Functie
0x40000080 SCONTROL SynIC-besturingselement
0x40000081 SVERSION SynIC-versie
0x40000082 SIEFP Pagina Gebeurtenisvlagken onderbreken
0x40000083 VER Berichtpagina onderbreken
0x40000084 EOM Einde van bericht
0x40000090 SINT0 Interruptbron 0 (hypervisor)
0x40000091 SINT1 Onderbrekingsbron 1
0x40000092 SINT2 Interruptbron 2
0x40000093 SINT3 Onderbrekingsbron 3
0x40000094 SINT4 Interruptbron 4
0x40000095 SINT5 Onderbrekingsbron 5
0x40000096 SINT6 Interruptbron 6
0x40000097 SINT7 Interruptbron 7
0x40000098 SINT8 Interruptbron 8
0x40000099 SINT9 Onderbrekingsbron 9
0x4000009A SINT10 Onderbrekingsbron 10
0x4000009B SINT11 Interruptbron 11
0x4000009C SINT12 Onderbrekingsbron 12
0x4000009D SINT13 Interruptbron 13
0x4000009E SINT14 Interruptbron 14
0x4000009F SINT15 Onderbrekingsbron 15

Op ARM64-platformen worden deze registers geopend met behulp van HvCallGetVpRegisters en HvCallSetVpRegisters hypercalls met de volgende registernamen:

HvRegister-naam Functie
HvRegisterScontrol SynIC-besturingselement
HvRegisterSversion SynIC-versie
HvRegisterSifp Pagina Gebeurtenisvlagken onderbreken
HvRegisterSipp Berichtpagina onderbreken
HvRegisterEom Einde van bericht
HvRegisterSirbp Bufferpagina voor interruptreacties
HvRegisterSint0 Interruptbron 0 (hypervisor)
HvRegisterSint1 Onderbrekingsbron 1
HvRegisterSint2 Interruptbron 2
HvRegisterSint3 Onderbrekingsbron 3
HvRegisterSint4 Interruptbron 4
HvRegisterSint5 Onderbrekingsbron 5
HvRegisterSint6 Interruptbron 6
HvRegisterSint7 Interruptbron 7
HvRegisterSint8 Interruptbron 8
HvRegisterSint9 Onderbrekingsbron 9
HvRegisterSint10 Onderbrekingsbron 10
HvRegisterSint11 Interruptbron 11
HvRegisterSint12 Onderbrekingsbron 12
HvRegisterSint13 Interruptbron 13
HvRegisterSint14 Interruptbron 14
HvRegisterSint15 Onderbrekingsbron 15

SCONTROL-register

Dit register wordt gebruikt om het SynIC-gedrag van de virtuele processor te beheren.

Bij het maken van een virtuele processor en bij het opnieuw instellen van de processor wordt de waarde van dit SCONTROL-besturingselement (SynIC-besturingselementregister) 0x0000000000000000. Berichten in wachtrij plaatsen en meldingen over gebeurtenisvlagken worden dus uitgeschakeld.

Bits Veld Description Attributes
63:1 RsvdP Waarde moet behouden blijven Lezen/schrijven
0 Enable Wanneer deze virtuele processor is ingesteld, kunnen meldingen over berichtenwachtrijen en gebeurtenisvlagmeldingen worden geplaatst in de SynIC. Wanneer dit is uitgeschakeld, kunnen meldingen over berichtenwachtrijen en gebeurtenisvlagmeldingen niet worden omgeleid naar deze virtuele processor. Lezen/schrijven

SVERSION-register

Dit is een alleen-lezen register en retourneert het versienummer van de SynIC. Pogingen om naar dit register te schrijven, resulteren in een #GP fout.

Bits Veld Description Attributes
63:32 RsvdP Lezen
31:0 SynIC-versie Versienummer van de SynIc Lezen

SIEFP-register

Bij het maken van een virtuele processor en bij het opnieuw instellen van de processor, wordt de waarde van dit SIEFP-register (pagina met synthetische interrupt-gebeurtenisvlagmarkeringen) 0x0000000000000000. Het SIEFP is dus standaard uitgeschakeld. De gast moet deze inschakelen door bit 0 in te stellen. Als het opgegeven basisadres buiten het einde van de GPA-ruimte van de partitie valt, is de SIEFP-pagina niet toegankelijk voor de gast. Bij het wijzigen van het register moeten gasten de waarde van de gereserveerde bits (1 tot en met 11) behouden voor toekomstige compatibiliteit.

Bits Veld Description Attributes
63:12 Basisadres Basisadres (in GPA-ruimte) van SIEFP (lage 12 bits verondersteld te worden uitgeschakeld) Lezen/schrijven
11:1 RsvdP Gereserveerd, waarde moet behouden blijven Lezen/schrijven
0 Enable SIEFP inschakelen Lezen/schrijven

SIMP Register

Bij het maken van een virtuele processor en bij het opnieuw instellen van de processor wordt de waarde van deze SIMP-registratie (synthetische interruptberichtpagina) 0x0000000000000000. De SIMP is dus standaard uitgeschakeld. De gast moet deze inschakelen door bit 0 in te stellen. Als het opgegeven basisadres zich buiten het einde van de GPA-ruimte van de partitie bevindt, is de SIMP-pagina niet toegankelijk voor de gast. Bij het wijzigen van het register moeten gasten de waarde van de gereserveerde bits (1 tot en met 11) behouden voor toekomstige compatibiliteit.

Bits Veld Description Attributes
63:12 Basisadres Basisadres (in GPA-ruimte) van SIMP (lage 12 bits verondersteld te worden uitgeschakeld) Lezen/schrijven
11:1 RsvdP Gereserveerd, waarde moet behouden blijven Lezen/schrijven
0 Enable SIMP inschakelen Lezen/schrijven

SINTx-registers

Tijdens het maken van een virtuele processor is de standaardwaarde van alle SINTx-registers (synthetische interruptbron) 0x0000000000010000. Daarom worden alle synthetische interruptbronnen standaard gemaskeerd. De gast moet ze ontmaskeren door een geschikte vector te programmeren en bit 16 te wissen.

Het instellen van de polling-bit heeft het effect van het ontmaskeren van een interruptbron, behalve dat er geen werkelijke interrupt wordt gegenereerd.

De vlag AutoEOI geeft aan dat een impliciete EOI moet worden uitgevoerd door de hypervisor wanneer een interrupt wordt geleverd aan de virtuele processor. Bovendien wist de hypervisor automatisch de bijbehorende vlag in het 'in-serviceregister' (ISR) van de virtuele APIC. Als de gast dit gedrag inschakelt, mag er geen EOI worden uitgevoerd in de onderbrekingsserviceroutine. De autoEOI-vlag kan op elk gewenst moment worden ingeschakeld, hoewel de gast een expliciete EOI moet uitvoeren bij een in-flight interrupt. De timing overweging maakt het moeilijk om te weten of een bepaalde interrupt EOI nodig heeft of niet, dus het wordt aanbevolen dat zodra SINT wordt ontmaskerd, de instellingen ervan niet worden gewijzigd. Op dezelfde manier kan de vlag AutoEOI op elk gewenst moment worden uitgeschakeld, hoewel dezelfde zorgen over in-flight interrupts van toepassing zijn

Geldige waarden voor vector zijn inclusief 16-255. Het opgeven van een ongeldig vectornummer resulteert in #GP.

Bits Veld Description Attributes
63:19 RsvdP Gereserveerd, waarde moet behouden blijven Lezen/schrijven
18 Polling Hiermee schakelt u de pollingmodus in Lezen/schrijven
17 AutoEOI Instellen of een impliciete EOI moet worden uitgevoerd bij onderbrekingslevering Lezen/schrijven
16 Gemaskerd Instellen als de SINT is gemaskeerd Lezen/schrijven
15:8 RsvdP Gereserveerd, waarde moet behouden blijven Lezen/schrijven
7:0 Vector Interruptvector Lezen/schrijven

EOM-register

Een schrijfbewerking naar het einde van het berichtregister (EOM) door de gast zorgt ervoor dat de hypervisor de interne berichtenbufferwachtrij(s) scant die aan de virtuele processor is gekoppeld. Als een berichtenbufferwachtrij een berichtenbuffer in de wachtrij bevat, probeert de hypervisor het bericht te bezorgen. Berichtbezorging slaagt als de SIM-pagina is ingeschakeld en de berichtsite die overeenkomt met de SINTx leeg is (dat wil gezegd, het berichttype in de header is ingesteld op HvMessageTypeNone). Als een bericht is bezorgd, wordt de bijbehorende interne berichtbuffer losgekoppeld en gemarkeerd als vrij. Als de bijbehorende SINTx niet wordt gemaskeerd, wordt er een door edge geactiveerde interrupt geleverd (dat wil gezegd, de bijbehorende bit in de IR is ingesteld).

Dit register kan door gasten worden gebruikt om berichten te 'peilen'. Het kan ook worden gebruikt als een manier om de berichtenwachtrij leeg te maken voor een SINTx die is uitgeschakeld (dat wil gezegd, gemaskeerd).

Als de berichtenwachtrijen allemaal leeg zijn, is een schrijfbewerking naar het EOM-register een no-op.

Leesbewerkingen uit het EOM-register retourneren altijd nullen.

Bits Veld Description Attributes
63:0 RsvdZ Trigger voor alleen schrijven Write