Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Funkcja hypervisor udostępnia dwa proste mechanizmy komunikacji z jedną partycją: komunikaty i zdarzenia. W obu przypadkach powiadomienie jest sygnalizowane przy użyciu synIC (syntetyczny kontroler przerwań).
Komunikaty synic
Funkcja hypervisor udostępnia prostą funkcję komunikacji między partycjami, która umożliwia jednej partycji wysyłanie sparametryzowanego komunikatu do innej partycji. (Ponieważ wiadomość jest wysyłana asynchronicznie, mówi się, że ma zostać wysłana). Partycja docelowa może zostać powiadomiona o nadejściu tej wiadomości przez przerwanie. Komunikaty mogą być wysyłane jawnie przy użyciu funkcji hypercallPostMessage HvCallMessage lub niejawnie przez funkcję hypervisor.
Messages
Po wysłaniu komunikatu funkcja hypervisor wybiera wolny bufor komunikatów. Zestaw dostępnych komunikatów zależy od zdarzenia, które wyzwoliło wysyłanie komunikatu.
Funkcja hypervisor oznacza bufor komunikatów "w użyciu" i wypełnia nagłówek komunikatu typem komunikatu, rozmiarem ładunku i informacjami o nadawcy. Na koniec wypełnia ładunek komunikatu. Zawartość ładunku zależy od zdarzenia, które wyzwoliło komunikat.
Następnie funkcja hypervisor dołącza bufor komunikatów do kolejki komunikatów odbierających. Kolejka komunikatów odbierających zależy od zdarzenia, które wyzwoliło wysyłanie komunikatu. W przypadku wszystkich typów komunikatów SINTx jest niejawny (w przypadku przechwytywania komunikatów), jawny (w przypadku komunikatów czasomierza) lub określony przez identyfikator portu (w przypadku komunikatów gościa). Docelowy procesor wirtualny jest jawnie określony lub wybrany przez funkcję hypervisor, gdy komunikat jest w kolejce. Procesory wirtualne, których strona SynIC lub SIM jest wyłączona, nie będą traktowane jako potencjalne cele. Jeśli żadne obiekty docelowe nie są dostępne, funkcja hypervisor kończy operację i zwraca błąd do wywołującego.
Funkcja hypervisor określa następnie, czy określone miejsce komunikatu SINTx na stronie SIM dla docelowego procesora wirtualnego jest puste. Jeśli typ komunikatu w miejscu komunikatu jest równy HvMessageTypeNone (czyli zero), zakłada się, że miejsce komunikatu jest puste. W takim przypadku funkcja hypervisor dequeuuje bufor komunikatu i kopiuje jego zawartość do miejsca komunikatu na stronie SIM. Funkcja hypervisor może kopiować tylko liczbę bajtów ładunku skojarzonych z komunikatem. Funkcja hypervisor próbuje również wygenerować przerwanie wyzwalane przez krawędź dla określonego SINTx. Jeśli APIC jest wyłączone oprogramowanie lub SINTx jest zamaskowany, przerwanie zostanie utracone. Przybycie tego przerwania powiadamia gościa o nadejściu nowej wiadomości. Jeśli strona SIM jest wyłączona lub miejsce komunikatu na stronie SIM nie jest puste, komunikat pozostanie w kolejce i nie zostanie wygenerowany żaden przerwanie.
Podobnie jak w przypadku przerwania o stałym priorytcie, przerwanie nie jest potwierdzane przez procesor wirtualny, dopóki rejestr PPR (rejestr priorytetu procesu) nie jest mniejszy niż wektor określony w rejestrze SINTx i przerwania nie są maskowane przez procesor wirtualny (rFLAGS[IF] jest ustawiony na 1).
Wiele komunikatów z tym samym SINTx można kolejkować do procesora wirtualnego. W takim przypadku funkcja hypervisor dostarczy pierwszy komunikat (czyli zapisz go na stronie SIM) i pozostaw inne umieszczone w kolejce do momentu wystąpienia jednego z trzech zdarzeń:
- Inny bufor komunikatów jest kolejkowany.
- Gość wskazuje "koniec przerwania", pisząc do rejestru EOI APIC.
- Gość wskazuje "koniec wiadomości", pisząc do rejestru EOM synIC.
We wszystkich trzech przypadkach funkcja hypervisor przeskanuje co najmniej jedną kolejkę bufora komunikatów i spróbuje dostarczyć dodatkowe komunikaty. Funkcja hypervisor próbuje również wygenerować przerwanie wyzwalane przez krawędź, co oznacza, że przybył nowy komunikat.
Strona SIM
Strona SIM składa się z tablicy 16 elementów 256-bajtowych komunikatów (zobacz HV_MESSAGE strukturę danych). Każdy element tablicy (znany również jako gniazdo komunikatów) odpowiada jednemu syntetycznym źródle przerwań (SINTx). Mówi się, że miejsce komunikatu jest "puste", jeśli typ komunikatu w miejscu jest równy HvMessageTypeNone.
Adres strony SIM jest określony w rejestrze SIMP. Adres strony SIM powinien być unikatowy dla każdego procesora wirtualnego. Programowanie tych stron w celu nakładania się innych wystąpień stron SIEF lub SIM lub dowolnej innej strony nakładki (na przykład strony hypercall) spowoduje niezdefiniowane zachowanie.
Dostęp do odczytu i zapisu przez procesor wirtualny na stronie SIM zachowuje się jak dostęp do odczytu i zapisu do pamięci RAM. Jednak implementacja SynIC funkcji hypervisor zapisuje również na stronach w odpowiedzi na określone zdarzenia.
Po utworzeniu i zresetowaniu procesora wirtualnego strona SIM zostanie wyczyszczone do zera.
Zalecana obsługa komunikatów
Mechanizm dostarczania komunikatów SynIC został zaprojektowany w celu zapewnienia wydajnego dostarczania i odbierania komunikatów w partycji docelowej. Zaleca się, aby obsługa komunikatów ISR (procedura usługi przerwania) w partycji docelowej wykonywała następujące czynności:
- Sprawdź komunikat, który został zdeponowany w miejscu komunikatu SIM.
- Skopiuj zawartość wiadomości do innej lokalizacji i ustaw typ komunikatu w miejscu komunikatu na HvMessageTypeNone.
- Wskaż koniec przerwania dla wektora, zapisując w rejestrze EOI APIC.
- Wykonaj wszelkie akcje dorozumiane przez komunikat.
Źródła komunikatów
Klasy zdarzeń, które mogą wyzwolić wysyłanie komunikatu, są następujące:
- Przechwytuje: przechwycenie w procesorze wirtualnym spowoduje wysłanie komunikatu do partycji nadrzędnej lub wyższej biblioteki VTL.
- Czasomierze: mechanizmy czasomierza spowodują wysłanie komunikatów. Skojarzony z każdym procesorem wirtualnym to cztery dedykowane komunikatów czasomierza, po jednym dla każdego czasomierza. Kolejka komunikatów odbierających należy do SINTx procesora wirtualnego, którego czasomierz wyzwolił wysyłanie komunikatu.
- Komunikaty gościa: funkcja hypervisor obsługuje przekazywanie komunikatów jako mechanizm komunikacji między partycjami między gośćmi. Interfejsy zdefiniowane w tej sekcji umożliwiają jednemu gościowi wysyłanie komunikatów do innego gościa. komunikatów używane w przypadku komunikatów tej klasy są pobierane z puli poszczególnych portów odbiornika komunikatów gościa.
komunikatów
Bufor komunikatów jest używany wewnętrznie do funkcji hypervisor do przechowywania komunikatu do momentu dostarczenia go do adresata. Funkcja hypervisor obsługuje kilka zestawów komunikatów.
komunikatów gościa
Funkcja hypervisor obsługuje zestaw komunikatów gościa dla każdego portu. Te są używane w przypadku komunikatów wysyłanych jawnie z jednej partycji do innej przez gościa. Po utworzeniu portu funkcja hypervisor przydzieli szesnaście komunikatów (16) z puli pamięci właściciela portu. Te komunikatów są zwracane do puli pamięci po usunięciu portu.
Kolejki komunikatów
Dla każdej partycji i każdego procesora wirtualnego w partycji funkcja hypervisor obsługuje jedną kolejkę komunikatów dla każdego sinTx (syntetyczne źródło przerwań) w synIC procesora wirtualnego. Wszystkie kolejki komunikatów procesora wirtualnego są puste podczas tworzenia lub resetowania procesora wirtualnego.
Niezawodność i sekwencjonowanie komunikatów gościa
Komunikaty pomyślnie opublikowane przez gościa zostały umieszczone w kolejce do dostarczania przez funkcję hypervisor. Rzeczywiste dostarczanie i odbiór przez partycję docelową zależy od prawidłowej operacji. Partycje mogą wyłączyć dostarczanie komunikatów do określonych procesorów wirtualnych, wyłączając funkcję SynIC lub wyłączając kartę SIMP.
Przerwanie połączenia nie wpłynie na komunikaty niedostarczone (w kolejce). Usunięcie portu docelowego zawsze spowoduje zwolnienie wszystkich komunikatów portu, niezależnie od tego, czy są dostępne, czy zawierają komunikaty niedostarczone (w kolejce).
Wiadomości docierają do kolejności, w której zostały pomyślnie opublikowane. Jeśli port odbierający jest skojarzony z określonym procesorem wirtualnym, komunikaty będą dostarczane w tej samej kolejności, w jakiej zostały opublikowane. Jeśli port odbierający jest skojarzony z HV_ANY_VP, komunikaty nie są gwarantowane do odebrania w jakiejkolwiek określonej kolejności.
Flagi zdarzeń synIC
Oprócz komunikatów synIC obsługuje drugi typ mechanizmu powiadamiania o różnych partycjach nazywanych flagami zdarzeń. Flagi zdarzeń można ustawić jawnie przy użyciu funkcji hypercall HvCallSignalEvent lub niejawnie przez funkcję hypervisor.
Flagi zdarzeń a komunikaty
Flagi zdarzeń są lżejsze niż komunikaty i dlatego są niższe obciążenie. Ponadto flagi zdarzeń nie wymagają żadnej alokacji buforu ani kolejkowania w ramach funkcji hypervisor, więc HvCallSignalEvent nigdy nie zakończy się niepowodzeniem z powodu niewystarczających zasobów.
Dostarczanie flagi zdarzeń
Gdy partycja wywołuje element HvCallSignalEvent, określa numer flagi zdarzenia. Funkcja hypervisor reaguje niepodziealnie na stronie SIEF odbierającego procesora wirtualnego. Procesory wirtualne, których strona SynIC lub SIEF jest wyłączona, nie będą traktowane jako potencjalne cele. Jeśli żadne obiekty docelowe nie są dostępne, funkcja hypervisor kończy operację i zwraca błąd do wywołującego.
Jeśli flaga zdarzenia została wcześniej wyczyszczone, funkcja hypervisor próbuje powiadomić partycję odbierającą, że flaga jest teraz ustawiona przez wygenerowanie przerwania wyzwalanego przez krawędź. Docelowy procesor wirtualny, wraz z docelowym SINTx, jest określany jako część tworzenia portu. Jeśli sinTx jest maskowany, HvSignalEvent zwraca HV_STATUS_INVALID_SYNIC_STATE.
Podobnie jak w przypadku jakichkolwiek przerwań zewnętrznych o stałym priorytcie, przerwanie nie jest uznawane przez procesor wirtualny, dopóki rejestr priorytetu procesu (PPR) nie jest mniejszy niż wektor określony w rejestrze SINTx i przerwania nie są maskowane przez procesor wirtualny (rFLAGS[IF] jest ustawiony na 1).
Strona SIEF
Strona SIEF składa się z 16-elementowej tablicy 256-bajtowych flag zdarzeń (zobacz HV_SYNIC_EVENT_FLAGS). Każdy element tablicy odpowiada jednemu syntetycznym źródle przerwań (SINTx).
Adres strony SIEF jest określony w rejestrze SIEF. Adres strony SIEF powinien być unikatowy dla każdego procesora wirtualnego. Programowanie tych stron w celu nakładania się innych wystąpień stron SIEF lub SIM lub dowolnej innej strony nakładki (na przykład strony hypercall) spowoduje niezdefiniowane zachowanie.
Dostęp do odczytu i zapisu przez procesor wirtualny na stronie SIEF zachowuje się jak dostęp do odczytu i zapisu do pamięci RAM. Jednak implementacja SynIC funkcji hypervisor zapisuje również na stronach w odpowiedzi na określone zdarzenia.
Po utworzeniu i zresetowaniu procesora wirtualnego strona SIEF zostanie wyczyszczone do zera.
Zalecana obsługa flag zdarzeń
Zaleca się, aby w ramach partycji docelowej procedury przerwania usługi (ISR) flaga zdarzenia wykonywała następujące czynności:
- Sprawdź flagi zdarzeń i określ, które, jeśli istnieją, są ustawione.
- Wyczyść co najmniej jedną flagę zdarzenia przy użyciu zablokowanej (niepodzielnej) operacji, takiej jak LOCK AND lub LOCK CMPXCHG.
- Wskaż koniec przerwania dla wektora, zapisując w rejestrze EOI APIC.
- Wykonaj wszelkie akcje sugerowane przez flagi zdarzeń, które zostały ustawione.
Porty i połączenia
Komunikat lub zdarzenie wysyłane z jednego gościa do innego musi być wysyłane za pośrednictwem wstępnie przydzielonego połączenia. Z kolei połączenie musi być skojarzone z portem docelowym.
Port jest przydzielany z puli pamięci odbiorcy i określa, który procesor wirtualny i SINTx mają być docelowe. Porty zdarzeń mają "numer flagi podstawowej" i "liczbę flag", które umożliwiają obiektowi wywołującym określenie zakresu prawidłowych flag zdarzeń dla tego portu.
Połączenia są przydzielane z puli pamięci nadawcy. Po utworzeniu połączenia musi być skojarzony z prawidłowym portem. To powiązanie tworzy prosty, jednokierunkowy kanał komunikacyjny. Jeśli port zostanie następnie usunięty, jego połączenie, gdy pozostanie, stanie się bezużyteczne.
Rejestry synIC
Każdy procesor wirtualny ma własną kopię tych rejestrów, więc można je programować niezależnie.
Na platformach x64 te rejestry są dostępne jako rejestry specyficzne dla modelu (MSR) przy użyciu instrukcji RDMSR i WRMSR:
| Adres MSR | Nazwa rejestracji | Funkcja |
|---|---|---|
| 0x40000080 | SCONTROL | Kontrolka SynIC |
| 0x40000081 | SVERSION | Wersja synIC |
| 0x40000082 | SIEFP | Strona flag zdarzeń przerwania |
| 0x40000083 | TRAD | Strona wiadomości przerwania |
| 0x40000084 | EOM | Koniec wiadomości |
| 0x40000090 | SINT0 | Źródło przerwania 0 (funkcja hypervisor) |
| 0x40000091 | SINT1 | Źródło przerwania 1 |
| 0x40000092 | SINT2 | Źródło przerwania 2 |
| 0x40000093 | SINT3 | Źródło przerwania 3 |
| 0x40000094 | SINT4 | Źródło przerwania 4 |
| 0x40000095 | SINT5 | Źródło przerwania 5 |
| 0x40000096 | SINT6 | Źródło przerwania 6 |
| 0x40000097 | SINT7 | Źródło przerwania 7 |
| 0x40000098 | SINT8 | Źródło przerwania 8 |
| 0x40000099 | SINT9 | Źródło przerwania 9 |
| 0x4000009A | SINT10 | Źródło przerwania 10 |
| 0x4000009B | SINT11 | Źródło przerwania 11 |
| 0x4000009C | SINT12 | Źródło przerwania 12 |
| 0x4000009D | SINT13 | Źródło przerwania 13 |
| 0x4000009E | SINT14 | Źródło przerwania 14 |
| 0x4000009F | SINT15 | Źródło przerwania 15 |
Na platformach ARM64 te rejestry są dostępne przy użyciu HvCallGetVpRegisters i HvCallSetVpRegisters hypercallers z następującymi nazwami rejestrów:
| Nazwa HvRegister | Funkcja |
|---|---|
| HvRegisterScontrol | Kontrolka SynIC |
| HvRegisterSversion | Wersja synIC |
| HvRegisterSifp | Strona flag zdarzeń przerwania |
| HvRegisterSipp | Strona wiadomości przerwania |
| HvRegisterEom | Koniec wiadomości |
| HvRegisterSirbp | Strona buforu odpowiedzi przerwania |
| HvRegisterSint0 | Źródło przerwania 0 (funkcja hypervisor) |
| HvRegisterSint1 | Źródło przerwania 1 |
| HvRegisterSint2 | Źródło przerwania 2 |
| HvRegisterSint3 | Źródło przerwania 3 |
| HvRegisterSint4 | Źródło przerwania 4 |
| HvRegisterSint5 | Źródło przerwania 5 |
| HvRegisterSint6 | Źródło przerwania 6 |
| HvRegisterSint7 | Źródło przerwania 7 |
| HvRegisterSint8 | Źródło przerwania 8 |
| HvRegisterSint9 | Źródło przerwania 9 |
| HvRegisterSint10 | Źródło przerwania 10 |
| HvRegisterSint11 | Źródło przerwania 11 |
| HvRegisterSint12 | Źródło przerwania 12 |
| HvRegisterSint13 | Źródło przerwania 13 |
| HvRegisterSint14 | Źródło przerwania 14 |
| HvRegisterSint15 | Źródło przerwania 15 |
Rejestrowanie SCONTROL
Ten rejestr służy do kontrolowania zachowania SynIC procesora wirtualnego.
W czasie tworzenia procesora wirtualnego i po zresetowaniu procesora wartość tego rejestru kontroli SCONTROL (SynIC) jest 0x0000000000000000. W związku z tym kolejkowanie komunikatów i powiadomienia o flagach zdarzeń zostaną wyłączone.
| Bity | (No changes needed) | Description | Attributes |
|---|---|---|---|
| 63:1 | RsvdP | Wartość musi być zachowana | Odczyt/zapis |
| 0 | Enable | Po ustawieniu ten procesor wirtualny zezwoli na wysyłanie powiadomień o flagach komunikatów i kolejkowania komunikatów do usługi SynIC. W przypadku czyszczenia kolejkowania komunikatów i powiadomień o flagach zdarzeń nie można przekierować do tego procesora wirtualnego. | Odczyt/zapis |
Rejestracja SVERSION
Jest to rejestr tylko do odczytu i zwraca numer wersji synIC. Próby zapisu w tym rejestrze powodują błąd #GP.
| Bity | (No changes needed) | Description | Attributes |
|---|---|---|---|
| 63:32 | RsvdP | Przeczytaj | |
| 31:0 | Wersja synIC | Numer wersji synic | Przeczytaj |
Rejestracja SIEFP
W czasie tworzenia procesora wirtualnego i po zresetowaniu procesora wartość tego rejestru SIEFP (syntetyczne flagi zdarzeń przerwania) jest 0x0000000000000000. W związku z tym protokół SIEFP jest domyślnie wyłączony. Gość musi go włączyć, ustawiając bit 0. Jeśli określony adres podstawowy znajduje się poza końcem przestrzeni gpA partycji, strona SIEFP nie będzie dostępna dla gościa. Podczas modyfikowania rejestru goście powinni zachować wartość zarezerwowanych bitów (od 1 do 11) w celu zapewnienia przyszłej zgodności.
| Bity | (No changes needed) | Description | Attributes |
|---|---|---|---|
| 63:12 | Adres podstawowy | Adres podstawowy (w przestrzeni GPA) SIEFP (niskie 12 bitów zakładane jako wyłączone) | Odczyt/zapis |
| 11:1 | RsvdP | Wartość zarezerwowana powinna być zachowana | Odczyt/zapis |
| 0 | Enable | Włączanie protokołu SIEFP | Odczyt/zapis |
Rejestrowanie SIMP
W czasie tworzenia procesora wirtualnego i po zresetowaniu procesora wartość tego rejestru SIMP (syntetyczna strona komunikatu przerwania) jest 0x0000000000000000. W związku z tym simp jest domyślnie wyłączony. Gość musi go włączyć, ustawiając bit 0. Jeśli określony adres podstawowy znajduje się poza końcem przestrzeni gpA partycji, strona SIMP nie będzie dostępna dla gościa. Podczas modyfikowania rejestru goście powinni zachować wartość zarezerwowanych bitów (od 1 do 11) w celu zapewnienia przyszłej zgodności.
| Bity | (No changes needed) | Description | Attributes |
|---|---|---|---|
| 63:12 | Adres podstawowy | Adres podstawowy (w przestrzeni GPA) SIMP (niskie 12 bitów zakładane jako wyłączone) | Odczyt/zapis |
| 11:1 | RsvdP | Wartość zarezerwowana powinna być zachowana | Odczyt/zapis |
| 0 | Enable | Włączanie protokołu SIMP | Odczyt/zapis |
Rejestry SINTx
W czasie tworzenia procesora wirtualnego wartość domyślna wszystkich rejestrów SINTx (syntetycznego źródła przerwań) jest 0x0000000000010000. W związku z tym wszystkie syntetyczne źródła przerwań są domyślnie maskowane. Gość musi je zdemaskować przez zaprogramowanie odpowiedniego wektora i wyczyszczenie bitu 16.
Ustawienie bitu sondowania będzie miało wpływ na usunięcie źródła przerwań, z wyjątkiem tego, że rzeczywiste przerwanie nie jest generowane.
Flaga AutoEOI wskazuje, że niejawna funkcja EOI powinna być wykonywana przez funkcję hypervisor po dostarczeniu przerwania do procesora wirtualnego. Ponadto funkcja hypervisor automatycznie wyczyści odpowiednią flagę w "rejestrze w usłudze" (ISR) wirtualnej APIC. Jeśli gość włączy to zachowanie, nie może wykonać EOI w swojej procedurze obsługi przerwania. Flaga AutoEOI może być włączona w dowolnym momencie, choć gość musi wykonać jawne EOI na przerwaniu lotu. Kwestie dotyczące czasu utrudniają ustalenie, czy określone przerwanie wymaga EOI, więc zaleca się, aby po zdemaskowaniu SINT jego ustawienia nie zostały zmienione. Podobnie flaga AutoEOI może być w dowolnym momencie wyłączona, chociaż obowiązują te same obawy dotyczące przerwań lotów
Prawidłowe wartości wektora to 16–255 włącznie. Określenie nieprawidłowej liczby wektorów powoduje #GP.
| Bity | (No changes needed) | Description | Attributes |
|---|---|---|---|
| 63:19 | RsvdP | Wartość zarezerwowana powinna być zachowana | Odczyt/zapis |
| 18 | Sondowanie | Włącza tryb sondowania | Odczyt/zapis |
| 17 | AutoEOI | Ustaw, czy niejawna EOI powinna być wykonywana po dostarczaniu przerwań | Odczyt/zapis |
| 16 | Zamaskowany | Ustaw, czy protokół SINT jest maskowany | Odczyt/zapis |
| 15:8 | RsvdP | Wartość zarezerwowana powinna być zachowana | Odczyt/zapis |
| 7:0 | Vector | Wektor przerwań | Odczyt/zapis |
Rejestracja EOM
Zapis na końcu rejestracji komunikatów (EOM) przez gościa powoduje, że funkcja hypervisor skanuje kolejki wewnętrznego buforu komunikatów skojarzone z procesorem wirtualnym. Jeśli kolejka buforu komunikatów zawiera bufor komunikatu w kolejce, funkcja hypervisor próbuje dostarczyć komunikat. Dostarczanie komunikatów powiedzie się, jeśli strona SIM jest włączona, a miejsce komunikatu odpowiadające SINTx jest puste (oznacza to, że typ komunikatu w nagłówku jest ustawiony na HvMessageTypeNone). Jeśli komunikat zostanie pomyślnie dostarczony, jego odpowiedni wewnętrzny bufor komunikatu zostanie odsłonięty i oznaczony jako wolny. Jeśli odpowiedni sinTx nie jest maskowany, zostanie dostarczone przerwanie wyzwalane przez krawędź (czyli odpowiedni bit w IRR jest ustawiony).
Ten rejestr może być używany przez gości do "sondowania" wiadomości. Może być również używany jako sposób opróżniania kolejki komunikatów dla sintx, który został wyłączony (czyli maskowany).
Jeśli kolejki komunikatów są puste, zapis w rejestrze EOM jest no-op.
Odczyty z rejestru EOM zawsze zwracają zera.
| Bity | (No changes needed) | Description | Attributes |
|---|---|---|---|
| 63:0 | RsvdZ | Wyzwalacz tylko do zapisu | Napisz |