W 1974 r. Gerald J. Popek i Robert P. Goldberg opublikowali swoje twierdzenia wirtualizacji3, w których formalnie przedstawili wymagania dotyczące wydajnych architektur wirtualizowalnych. Musimy poznać tę teorię, zanim przejdziemy do bardziej namacalnych implementacji, abyśmy mogli zrozumieć ich powiązania.
Ich praca zaczyna się od założenia modelu komputera składającego się z procesora z trybami wykonywania użytkownika/nadzorcy i prostym mechanizmem pułapki. W tym modelu pamięć jest jedynym zasobem systemowym, do którego procesor uzyskuje dostęp poprzez liniowe, względne adresowanie z rejestru relokacji. Instrukcje procesora są klasyfikowane w następujący sposób:
- Instrukcje uprzywilejowane Te instrukcje są dostępne tylko w trybie wykonywania nadzorcy. W tym modelu każda próba wykonania instrukcji uprzywilejowanej powoduje pułapkę, jeśli tryb wykonywania procesora jest trybem użytkownika.
- Instrukcje wrażliwe na sterowanie Te instrukcje mają wpływ na konfigurację jednego lub wielu zasobów systemowych. W obecnym modelu te efekty obejmują wartość rejestru relokacji i tryb wykonywania procesora.
- Instrukcje wrażliwe na zachowanie Te instrukcje wykazują różne zachowanie w zależności od konfiguracji zasobów systemowych. W obecnym modelu mogą być one dotknięte konfiguracją rejestru relokacji (wrażliwe na lokalizację) lub bieżącym trybem wykonywania procesora (wrażliwe na tryb).
- Instrukcje nieszkodliwe Te instrukcje nie są ani wrażliwe na sterowanie, ani wrażliwe na zachowanie.
UWAGA Niektóre z oryginalnych definicji odzwierciedlają aspekty architektur, które istniały w czasie publikacji pracy. Dla uproszczenia niektóre definicje zastąpiono mniej precyzyjnymi.
VMM jest definiowany jako część oprogramowania działająca w trybie nadzorcy i składa się z następujących modułów:
- Dispatcher Jest to punkt wejścia obsługi pułapki i wywołuje albo alokator, albo interpreter w zależności od źródła pułapki.
- Allocator Jest wywoływany przez dyspozytora, gdy VM próbuje wykonać instrukcję wrażliwą na sterowanie. Alokator zarządza zasobami systemu, izolując zasoby VMM od maszyn wirtualnych i te przypisane do maszyn wirtualnych od siebie.
- Interpreter Jest wywoływany przez dyspozytora, gdy VM próbuje wykonać instrukcję uprzywilejowaną. Interpreter symuluje zachowanie błędnej instrukcji, tak jakby była wykonywana natywnie.
VM jest definiowany jako środowisko wirtualne — a dokładniej jako „wydajny, odizolowany duplikat rzeczywistej maszyny”. Maszyny wirtualne działają w trybie użytkownika i prezentują następujące właściwości:
- Equivalence Programy działające na maszynie wirtualnej powinny wykazywać identyczne zachowanie jak wykonywanie natywne.
- Wydajność Nieszkodliwe instrukcje powinny być wykonywane bezpośrednio przez
CPU. Programy uruchamiane na maszynie wirtualnej powinny wykazywać „w najgorszym przypadku tylko niewielkie spadki prędkości”.
- Kontrola zasobów Programy uruchamiane na maszynie wirtualnej nie mogą uzyskać dostępu do zasobów, które nie zostały wyraźnie przydzielone przez maszynę wirtualną lub które w jakikolwiek sposób wpływają na inne zasoby systemu.
Z tych definicji wynikają trzy twierdzenia wirtualizacji:
- Dla dowolnego komputera można skonstruować maszynę wirtualną, jeśli zestaw jego wrażliwych instrukcji jest podzbiorem zestawu instrukcji uprzywilejowanych.
- Komputer jest rekurencyjnie wirtualizowalny, jeśli (a) jest wirtualizowalny i (b) można skonstruować dla niego maszynę wirtualną bez zależności czasowych.
- Hybrydową maszynę wirtualną (HVM) można skonstruować dla dowolnego komputera, w którym zestaw wrażliwych instrukcji użytkownika jest podzbiorem zestawu instrukcji uprzywilejowanych.
Pierwsze twierdzenie ma ważne implikacje dla właściwości równoważności i kontroli zasobów. Jeśli zbiór wrażliwych instrukcji (związek instrukcji wrażliwych na sterowanie i wrażliwych na zachowanie) jest instrukcjami uprzywilejowanymi, wówczas każda próba wykonania wrażliwej instrukcji przez maszynę wirtualną spowoduje pułapkę w dyspozytorze maszyny wirtualnej. Dyspozytor wywoła alokator, jeśli pułapka pochodzi z instrukcji wrażliwej na sterowanie (właściwość kontroli zasobów jest zachowana) lub interpreter, jeśli pułapka pochodzi z instrukcji wrażliwej na zachowanie (właściwość równoważności jest zachowana). Nieszkodliwe instrukcje są albo bezpośrednio wykonywane przez procesor, albo obsługiwane przez interpreter, jeśli są instrukcjami uprzywilejowanymi (właściwość równoważności jest zachowana). Ten rodzaj implementacji maszyny wirtualnej jest znany jako „pułapka i emulator”, a architektura jest uważana za „klasycznie wirtualizowalną”, jeśli maszynę wirtualną można w pełni zaimplementować w ten sposób. Drugie twierdzenie odnosi się do komputera rekurencyjnie wirtualizowalnego, obecnie nazywanego „wirtualizacją zagnieżdżoną”. Podczas gdy teoretycznie środowisko wirtualne dostarczane przez maszynę wirtualną powinno być duplikatem rzeczywistej maszyny, w praktyce nie zawsze tak jest. Zamiast tego może reprezentować ograniczony podzbiór lub podobną rodzinę komputerów. Przykładem z tamtego okresu jest CP-67 działający na IBM S/360-67, który obsługiwał stronicowanie, ale udostępniał środowisko wirtualne S/360-65 bez obsługi stronicowania. Brak stronicowania nie pozwalał na rekurencyjne uruchamianie CP-67, do czego wymagał modyfikacji. Nawet jeśli VMM zapewnia środowisko wirtualne ze wszystkimi wymaganymi przez siebie funkcjami, nadal musi działać wydajnie w tym środowisku. W trzecim twierdzeniu napotykamy kilka nowych definicji: instrukcja wrażliwa na użytkownika jest definiowana jako instrukcja, która jest wrażliwa, gdy jest wykonywana w trybie użytkownika; podobnie instrukcja wrażliwa na nadzorcę jest wrażliwa, gdy jest wykonywana w trybie nadzorcy. Wreszcie, HVM jest definiowany jako mniej wydajna implementacja VMM, w której cały kod wykonywany w trybie wirtualnego nadzorcy jest interpretowany. Twierdzenie to łagodzi wymagania pierwszego twierdzenia, dzięki czemu niektóre istniejące wówczas architektury mogą je spełnić.