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.
Interfejs maszyny wirtualnej uwidoczniony przez każdą partycję obejmuje jednostkę zarządzania pamięcią (MMU). Wirtualna jednostka MMU uwidoczniona przez partycje funkcji hypervisor jest ogólnie zgodna z istniejącymi jednostkami MMU.
Implementacja wirtualnej jednostki MMU jest specyficzna dla architektury. Ten dokument obejmuje zarówno platformy x64, jak i ARM64, z wyraźnie oznaczonymi sekcjami specyficznymi dla platformy.
Omówienie wirtualnej jednostki MMU
Procesory wirtualne uwidaczniają pamięć wirtualną i wirtualny bufor TLB (bufor z odkładam do tłumaczenia), który buforuje tłumaczenia z adresów wirtualnych na adresy fizyczne (gościa). Podobnie jak w przypadku TLB na procesorze logicznym, wirtualny TLB jest niespójnego pamięci podręcznej, a ten brak spójności jest widoczny dla gości. Funkcja hypervisor uwidacznia operacje opróżniania modułu TLB. Goście mogą używać tych operacji do usuwania potencjalnie niespójnych wpisów i tworzenia przewidywalnych tłumaczeń adresów wirtualnych.
Compatibility
Wirtualna funkcja MMU uwidoczniona przez funkcję hypervisor jest ogólnie zgodna z fizyczną jednostką MMU znajdującą się w podstawowej architekturze procesora.
Na platformach x64
Wirtualna funkcja MMU na platformach x64 jest ogólnie zgodna z fizyczną jednostką MMU znajdującą się w procesorze x64. Istnieją następujące różnice, które można zaobserwować gościa:
- The CR3. PWT i CR3. Bity PCD mogą nie być obsługiwane w niektórych implementacjach funkcji hypervisor. W przypadku takich implementacji wszelkie próby ustawienia tych flag przez gościa za pośrednictwem instrukcji CR3 lub przełącznika bramy zadania zostaną zignorowane. Próby programowego ustawienia tych bitów za pośrednictwem HvSetVpRegisters lub HvCallSwitchVirtualAddressSpace mogą spowodować błąd.
- Bity PWT i PCD w wpisie tabeli strony liścia (na przykład PTE dla stron 4-K i PDE dla dużych stron) określają możliwość buforowania strony mapowanej. Bity PAT, PWT i PCD w pozycjach tabeli stron innych niż liści wskazują na możliwość buforowania następnej tabeli stron w hierarchii. Niektóre implementacje funkcji hypervisor mogą nie obsługiwać tych flag. W takich implementacjach dostęp do wszystkich tabel stron wykonywanych przez funkcję hypervisor odbywa się przy użyciu atrybutów pamięci podręcznej zapisu zwrotnego. Ma to wpływ, w szczególności na dostęp i brudne bity zapisywane w wpisach tabeli stron. Jeśli gość ustawia bity PAT, PWT lub PCD w wpisach tabeli stron innych niż liści, może zostać wygenerowany komunikat "nieobsługiwana funkcja", gdy procesor wirtualny uzyskuje dostęp do strony mapowanej przez tę tabelę stron.
- Bit CR0.CD (wyłączanie pamięci podręcznej) może nie być obsługiwany w niektórych implementacjach funkcji hypervisor. W przypadku takich implementacji bit CR0.CD musi być ustawiony na 0. Każda próba ustawienia tej flagi przez gościa za pośrednictwem instrukcji MOV na CR0 zostanie zignorowana. Próby programowego ustawienia tego bitu za pośrednictwem HvSetVpRegisters spowodują błąd.
- Pat (typ adresu strony) MSR jest rejestrem na vp. Jednak gdy wszystkie procesory wirtualne w partycji ustawić MSR pat na tę samą wartość, nowy efekt staje się efektem obejmującym całą partycję.
- Ze względu na bezpieczeństwo i izolację instrukcja INVD zostanie zwirtualizowana tak, aby działała jak instrukcja WBINVD, z pewnymi różnicami. W celach bezpieczeństwa należy zamiast tego użyć środowiska CLFLUSH.
Starsze operacje zarządzania TLB
Każda architektura zapewnia natywne mechanizmy zarządzania tlb procesora. Te mechanizmy są zwirtualizowane przez funkcję hypervisor i mają wpływ tylko na lokalny procesor wirtualny. Aby unieważnić tłumaczenia na innych procesorach wirtualnych, oprogramowanie musi używać przerwań między procesorami specyficznymi dla architektury lub ulepszonych hiperwołów zarządzania TLB opisanych w następnej sekcji.
Na platformach x64
Architektura x64 udostępnia następujące mechanizmy zarządzania TLB:
- Instrukcja INVLPG unieważnia tłumaczenie pojedynczej strony z modułu TLB procesora. Jeśli określony adres wirtualny został pierwotnie zamapowany jako strona 4-K, tłumaczenie tej strony zostanie usunięte z modułu TLB. Jeśli określony adres wirtualny został pierwotnie zamapowany jako "duża strona" (2 MB lub 4 MB, w zależności od trybu MMU), tłumaczenie całej dużej strony zostanie usunięte z modułu TLB. Instrukcja INVLPG opróżnia tłumaczenia globalne i nieglobalne. Translacje globalne są definiowane jako te, które mają "globalny" bit ustawiony we wpisie tabeli stron.
- Instrukcja MOV do CR3 i przełączniki zadań, które modyfikują translacje CR3 unieważniają tłumaczenia dla wszystkich stron innych niż globalne w TLB procesora.
- Instrukcja MOV do CR4, która modyfikuje CR4. WŁĄCZ (strona globalna) bit, CR4. Bit PSE (rozszerzenia rozmiaru strony) lub CR4. Bit PAE (rozszerzenia adresów strony) unieważnia wszystkie tłumaczenia (globalne i inne niż globalne) w ramach TLB procesora.
Należy pamiętać, że wszystkie te operacje unieważniania mają wpływ tylko na jeden procesor. Aby unieważnić tłumaczenia na innych procesorach, oprogramowanie musi używać mechanizmu "zestrzelenia TLB" opartego na oprogramowaniu (zwykle implementowane przy użyciu przerwań między procesami).
Na platformach ARM64
Architektura ARM64 udostępnia mechanizmy zarządzania TLB za pomocą instrukcji TLBI (TLB Invalidate). Aby uzyskać więcej informacji, zapoznaj się z instrukcjami dotyczącymi architektury arm.
Uwaga: Instrukcje konserwacji pamięci podręcznej ustawiania/sposobu (takie jak DC ISW, DC CSW, DC CISW) nie są obsługiwane w środowiskach zwirtualizowanych i są traktowane jako operacje bez operacji.
Ulepszenia wirtualnego modułu równoważenia obciążenia
Oprócz obsługi starszych mechanizmów zarządzania TLB opisanych wcześniej, na platformach x64 funkcja hypervisor obsługuje również zestaw ulepszeń, które umożliwiają gościowi wydajniejsze zarządzanie wirtualnym modułem TLB. Te rozszerzone operacje mogą być używane zamiennie z starszymi operacjami zarządzania TLB.
Funkcja hypervisor obsługuje następujące hypercalls w celu unieważnienia tlB:
| Funkcja Hypercall | Description |
|---|---|
| HvCallFlushVirtualAddressSpace | Unieważnia wszystkie wirtualne wpisy TLB należące do określonej przestrzeni adresowej. |
| HvCallFlushVirtualAddressSpaceEx | Podobnie jak HvCallFlushVirtualAddressSpace, przyjmuje rozrzedzona vp ustawiona jako dane wejściowe. |
| HvCallFlushVirtualAddressList | Unieważnia część określonej przestrzeni adresowej. |
| HvCallFlushVirtualAddressListEx | Podobnie jak HvCallFlushVirtualAddressList, przyjmuje rozrzedzona vp ustawiona jako dane wejściowe. |
W niektórych systemach (tych z wystarczającą obsługą wirtualizacji w sprzęcie) starsze instrukcje zarządzania TLB mogą być szybsze w przypadku lokalnego lub zdalnego (między procesorami) unieważnienia TLB. Goście, którzy są zainteresowani optymalną wydajnością, powinni użyć 0x40000004 liścia CPUID, aby określić, które zachowania mają być implementowane za pomocą hiperwzlotów:
- UseHypercallForAddressSpaceSwitch: jeśli ta flaga jest ustawiona, obiekt wywołujący powinien założyć, że szybsze jest użycie elementu HvCallSwitchVirtualAddressSpace do przełączania się między przestrzeniami adresowymi. Jeśli ta flaga jest jasna, zalecana jest instrukcja MOV do CR3.
- UseHypercallForLocalFlush: jeśli ta flaga jest ustawiona, obiekt wywołujący powinien założyć, że szybsze jest używanie hiperwołyń (w przeciwieństwie do INVLPG lub MOV do CR3), aby opróżnić co najmniej jedną stronę z wirtualnego modułu TLB.
- UseHypercallForRemoteFlushAndLocalFlushEntire: Jeśli ta flaga jest ustawiona, obiekt wywołujący powinien zakładać, że szybciej używać hipercalls (w przeciwieństwie do używania przerwań między procesorami generowanymi przez gościa), aby opróżnić co najmniej jedną stronę z wirtualnego modułu TLB.
Na platformach ARM64 goście powinni zazwyczaj używać mechanizmów architektury do zarządzania TLB.
Kontrolka pamięci podręcznej — omówienie
Funkcja hypervisor obsługuje ustawienia pamięci podręcznej zdefiniowanej przez gościa dla stron mapowanych w przestrzeni GVA gościa. Aby uzyskać szczegółowy opis dostępnych ustawień pamięci podręcznej i ich znaczenia, zapoznaj się z dokumentacją firmy Intel lub AMD.
Gdy procesor wirtualny uzyskuje dostęp do strony za pośrednictwem przestrzeni GVA, funkcja hypervisor honoruje bity atrybutów pamięci podręcznej (PAT, PWT i PCD) w wpisie tabeli strony gościa używanym do mapowania strony. Te trzy bity są używane jako indeks do rejestru pat partycji (typ adresu strony) w celu wyszukania końcowego ustawienia pamięci podręcznej dla strony.
Strony dostępne bezpośrednio za pośrednictwem miejsca gpA (na przykład w przypadku wyłączenia stronicowania, ponieważ CR0.PG jest czyszczone) używają pamięci podręcznej zdefiniowanej przez MTRRs. Jeśli implementacja funkcji hypervisor nie obsługuje wirtualnych wystąpień MTRR, przyjmuje się, że przyjmuje się możliwość buforowania WB.
Mieszanie typów pamięci podręcznej między partycją a funkcją Hypervisor
Goście powinni pamiętać, że niektóre strony w przestrzeni gpA mogą być dostępne przez funkcję hypervisor. Poniższa lista, chociaż nie jest wyczerpująca, zawiera kilka przykładów:
- Strony zawierające parametry wejściowe lub wyjściowe dla funkcji hypercalls
- Wszystkie strony nakładki, w tym strony hipercall, strony SynIC SIEF i SIM oraz strony statystyk
- Strony pomocy vp i inne strony interfejsu funkcji hypervisor
Funkcja hypervisor zawsze wykonuje dostęp do parametrów funkcji hypercall i stron nakładek przy użyciu Write-Back atrybutów z możliwością buforowania:
- Na platformach x64: WB (Write-Back) typ pamięci podręcznej za pośrednictwem pat
- Na platformach ARM64: normalna pamięć z wewnętrznym i zewnętrznym zapisem zwrotnym, przydzielenie do odczytu, Write-Allocate atrybutami
Funkcja hypervisor zawsze wykonuje dostęp do parametrów funkcji hypercall i stron nakładek przy użyciu ustawienia buforowania WB.