Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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.
Aanbevolen verwerking van berichten
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.
Afhandeling van aanbevolen gebeurtenisvlag
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 |