Wirtualny tryb 8086
Część serii o trybach |
mikroprocesorowych dla architektury x86 |
---|
|
Pierwsza obsługiwana platforma pokazana w nawiasach |
W mikroprocesorze 80386 i nowszych tryb wirtualny 8086 (zwany także wirtualnym trybem rzeczywistym , trybem V86 lub VM86 ) umożliwia wykonywanie aplikacji trybu rzeczywistego , które nie mogą działać bezpośrednio w trybie chronionym , gdy procesor działa w trybie chronionym system operacyjny . Jest to sprzętowa technika wirtualizacji , która umożliwiła emulację wielu procesorów 8086 przez układ 386. Wynikało to z bolesnych doświadczeń z tryb chroniony 80286 , który sam w sobie nie był odpowiedni do prawidłowego uruchamiania współbieżnych aplikacji w trybie rzeczywistym. John Crawford opracował bit trybu wirtualnego w zestawie rejestrów, torując drogę do tego środowiska.
Tryb VM86 wykorzystuje schemat segmentacji identyczny jak tryb rzeczywisty (ze względu na kompatybilność), który tworzy 20-bitowe adresy liniowe w taki sam sposób, jak 20-bitowe adresy fizyczne są tworzone w trybie rzeczywistym, ale podlegają mechanizmowi stronicowania pamięci w trybie chronionym .
Przegląd
Wirtualny tryb 8086 to tryb zadania w trybie chronionym . W rezultacie procesor może przełączać się między zadaniami VM86 i innymi niż VM86, umożliwiając starszym aplikacjom wielozadaniowość ( DOS ).
Aby korzystać z wirtualnego trybu 8086, system operacyjny konfiguruje wirtualny monitor trybu 8086, który jest programem zarządzającym programem w trybie rzeczywistym i emulującym lub filtrującym dostęp do zasobów sprzętowych i programowych systemu. Monitor musi działać na poziomie uprawnień 0 i w trybie chronionym. Tylko program 8086 działa w trybie VM86 i na poziomie uprawnień 3. Kiedy program w trybie rzeczywistym próbuje uzyskać dostęp do określonych portów we/wy w celu użycia urządzeń sprzętowych lub uzyskać dostęp do określonych regionów w swojej przestrzeni pamięci, procesor przechwytuje te zdarzenia i wywołuje monitor V86, który sprawdza, co próbuje zrobić program trybu rzeczywistego, i albo działa jako proxy do interfejsu ze sprzętem, emuluje zamierzoną funkcję, do której program w trybie rzeczywistym próbował uzyskać dostęp, albo kończy działanie programu w trybie rzeczywistym, jeśli próbuje zrobić coś, co nie może być dozwolone lub nie może być odpowiednio obsługiwane (takie jak ponowne uruchomienie komputera, ustawienie wyświetlania wideo w trybie, który nie jest obsługiwany przez sprzęt i nie jest emulowany lub nadpisanie kodu systemu operacyjnego).
Monitor V86 może również delikatnie odmówić pozwolenia, emulując niepowodzenie żądanej operacji — na przykład może sprawić, że dysk zawsze będzie wyglądał na niegotowy, podczas gdy w rzeczywistości nawet go nie sprawdził, ale po prostu nie zezwoli programowi w trybie rzeczywistym aby uzyskać do niego dostęp. Ponadto monitor V86 może wykonywać takie czynności, jak strony pamięci map, przechwytywać wywołania i przerwania oraz wyprzedzać program w trybie rzeczywistym, umożliwiając programom w trybie rzeczywistym wielozadaniowość, podobnie jak programy w trybie chronionym. Przechwytując sprzętowe i programowe wejścia/wyjścia programu działającego w trybie rzeczywistym i śledząc stan oczekiwany przez program V86, może umożliwić wielu programom współdzielenie tego samego sprzętu bez wzajemnego zakłócania się. Tak więc tryb V86 umożliwia programom działającym w trybie rzeczywistym, zaprojektowanym dla środowiska jednozadaniowego (takiego jak DOS), uruchamianie współbieżne w środowisku wielozadaniowym.
Stosowanie
Służy do wykonywania niektórych programów DOS w FlexOS 386 (od 1987), Concurrent DOS 386 (od 1987), Windows/386 2.10 (od 1987), DESQview 386 (od 1988), Windows 3.x (od 1990), Multiuser DOS (od 1991), Windows for Workgroups 3.1x (od 1992), OS/2 2.x (od 1992), 4690 OS (od 1993), REAL/32 (od 1995) działający w trybie rozszerzonym 386 oraz w Okna 95 , 98 , 98 SE i ME przez wirtualne maszyny DOS , w SCO UNIX przez Merge , aw Linuksie przez DOSEMU . (Inne DOS , które używają trybu chronionego, działają w trybie użytkownika w emulatorze). NTVDM w x86 Systemy operacyjne Windows NT również używają trybu VM86, ale z bardzo ograniczonym bezpośrednim dostępem do sprzętu. Niektóre programy ładujące (np. GRUB ) używają trybu chronionego i wykonaj wywołania przerwań BIOS-u w trybie Virtual 8086.
Adresowanie pamięci i przerwania
Najczęstszym problemem związanym z uruchamianiem kodu 8086 z trybu chronionego jest adresowanie pamięci , które jest zupełnie inne w trybie chronionym iw trybie rzeczywistym . Jak wspomniano, pracując w trybie VM86, segmentacji jest rekonfigurowany tak, aby działał tak, jak w trybie rzeczywistym, ale mechanizm stronicowania jest nadal aktywny i jest przezroczysty dla kodu trybu rzeczywistego; w związku z tym ochrona pamięci jest nadal stosowana, podobnie jak izolacja przestrzeni adresowej.
W przypadku wystąpienia przerwań (sprzętowych, programowych i instrukcji int) procesor wyłącza tryb VM86 i powraca do pracy w trybie w pełni chronionym, aby obsłużyć przerwanie. Ponadto przed obsługą przerwania rejestry DS, ES, FS i GS są umieszczane na nowym stosie i zerowane.
Rozszerzenia trybu Virtual-8086 (VME)
Architektura Pentium dodała szereg ulepszeń do wirtualnego trybu 8086. Zostały one jednak udokumentowane przez firmę Intel dopiero od późniejszej P6 (mikroarchitektura) ; ich nowsza oficjalna nazwa to Virtual-8086 Mode Extensions, w skrócie VME (starsza dokumentacja może używać „ulepszeń trybu Virtual 8086” jako rozszerzenia akronimu VME). Obsługują go również niektóre późniejsze układy Intel 486. Ulepszenia dotyczą głównie narzutu związanego z wirtualizacją 8086, ze szczególnym uwzględnieniem przerwań (wirtualnych). Zanim rozszerzenia zostały publicznie udokumentowane w dokumentacji P6, oficjalna dokumentacja odnosiła się do słynnego dodatku H , który został pominięty w dokumentacji publicznej i udostępniony tylko wybranym partnerom w ramach NDA .
Aktywacja VME odbywa się poprzez ustawienie bitu o numerze 0 (wartość 0x1) CR4 . Ponieważ ulepszenia przyspieszenia przerwań VME okazały się przydatne w przypadku zadań niechronionych przez VM86, można je również włączyć oddzielnie, ustawiając tylko bit numer 1 (wartość 0x2), który jest nazywany PVI (Protected Mode Virtual Interrupts). Wykrywanie, czy procesor obsługuje VME (w tym PVI) odbywa się za pomocą CPUID , z początkową wartością EAX równą 0x1, poprzez testowanie wartości drugiego bitu (bit numer 1, wartość 0x2) w rejestrze EDX, który jest ustawiany, jeśli VME jest obsługiwany przez procesor. W Linuksie ten ostatni bit jest zgłaszany jako vme flag w pliku /proc/ cpuinfo , w sekcji „flagi”.
W wirtualnym trybie 8086 podstawową ideą jest to, że gdy IOPL jest mniejszy niż 3, instrukcje PUSHF/POPF/STI/CLI/INT/IRET będą traktować wartość VIF w rzeczywistym 32-bitowym rejestrze EFLAGS jako wartość IF w symulowany 16-bitowy rejestr FLAGS (32-bitowy PUSHFD/POPFD kontynuuje błąd GP). VIP spowoduje błąd GP przy ustawieniu symulowanego IF, kierując system operacyjny do przetwarzania wszelkich oczekujących przerwań. PVI to ten sam pomysł, ale dotyczy tylko instrukcji CLI/STI.
AMD Ryzen pierwszej generacji mają wadliwą implementację VME. Ryzen drugiej generacji (seria 2000) rozwiązał ten problem.
Obsługa 64-bitów i VMX
Tryb Virtual 8086 nie jest dostępny w trybie long x86-64 , chociaż jest nadal obecny na procesorach zgodnych z x86-64 działających w starszym trybie .
Intel VT-x przywraca możliwość uruchamiania wirtualnego trybu 8086 z trybu długiego x86-64, ale trzeba to zrobić poprzez przejście (fizycznego) procesora do trybu root VMX i uruchomienie samego logicznego (wirtualnego) procesora działającego w wirtualnym 8086 tryb.
Westmere i nowsze procesory Intel zwykle mogą uruchamiać procesor wirtualny bezpośrednio w trybie rzeczywistym, korzystając z funkcji „nieograniczonego gościa” (która sama wymaga rozszerzonych tabel stron ); ta metoda eliminuje potrzebę uciekania się do zagnieżdżonego trybu wirtualnego 8086 po prostu w celu uruchomienia starszego systemu BIOS w celu rozruchu.
AMD-V może również obsługiwać wirtualny tryb 8086 w gościach, ale może też po prostu uruchomić gościa w „stronicowanym trybie rzeczywistym”, wykonując następujące czynności: tworzysz gościa w trybie SVM (Secure Virtual Machine) z CR0.PE=0, ale CR0.PG=1 (to znaczy z wyłączonym trybem chronionym, ale włączonym stronicowaniem), co jest zwykle niemożliwe, ale jest dozwolone dla gości SVM, jeśli host przechwytuje błędy stronicowania.