Wirtualny tryb 8086 - Virtual 8086 mode

W 80386 mikroprocesor , a później, w trybie wirtualnym 8086 (zwany również wirtualnego trybie rzeczywistym , V86 trybu lub vm86 ) umożliwia wykonanie trybu rzeczywistego zastosowania, które w stanie biegu bezpośredniego w trybie chronionym , gdy procesor jest uruchomiony zabezpieczonego systemu operacyjnego trybu. Jest to technika wirtualizacji sprzętu , która umożliwiła emulację wielu procesorów 8086 przez układ 386; wyłonił się z bolesnych doświadczeń z trybem chronionym 80286 , który sam w sobie nie był odpowiedni do prawidłowego uruchamiania równoległych aplikacji trybu rzeczywistego.

Tryb VM86 wykorzystuje schemat segmentacji identyczny jak w trybie rzeczywistym (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 jest trybem dla zadania w trybie chronionym . W konsekwencji procesor może przełączać się między zadaniami VM86 i innymi niż VM86, umożliwiając wielozadaniowość starszych aplikacji ( DOS ).

Aby użyć trybu wirtualnego 8086, system operacyjny konfiguruje monitor w trybie wirtualnym 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 iw trybie chronionym. Tylko program 8086 działa w trybie VM86 i na poziomie uprawnień 3. Kiedy program trybu rzeczywistego próbuje wykonać takie czynności, jak dostęp do określonych portów we / wy w celu użycia urządzeń sprzętowych lub dostępu do określonych regionów w swojej przestrzeni pamięci, procesor przechwytuje te zdarzenia i wywołuje monitor V86, który sprawdza, co program trybu rzeczywistego próbuje zrobić i działa jako proxy do połączenia ze sprzętem, emuluje zamierzoną funkcję, do której program w trybie rzeczywistym próbował uzyskać dostęp, lub kończy działanie programu w trybie rzeczywistym, jeśli próbuje zrobić coś, na co nie można zezwolić lub które nie może być odpowiednio obsługiwane (np. ponowne uruchomienie komputera, ustawienie wyświetlania wideo w tryb, który nie jest obsługiwany przez sprzęt i nie jest emulowany, lub nadpisywanie 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 nie sprawdził dysku, ale po prostu nie zezwoli na program 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 wywłaszczać program w trybie rzeczywistym, umożliwiając wielozadaniowość programów w trybie rzeczywistym, podobnie jak programy w trybie chronionym. Przechwytując sprzętowe i programowe operacje wejścia / wyjścia programu trybu rzeczywistego i śledząc stan, którego oczekuje program V86, może pozwolić wielu programom na współdzielenie tego samego sprzętu bez zakłócania się nawzajem. Tak więc tryb V86 umożliwia równoczesne uruchamianie programów trybu rzeczywistego zaprojektowanych dla środowiska jednozadaniowego (takiego jak DOS) 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 386 Enhanced Mode oraz w Windows 95 , 98 , 98 SE i ME przez wirtualne maszyny DOS , w SCO UNIX przez Merge , aw Linuksie przez DOSEMU . (Inne programy DOS , które używają trybu chronionego, są uruchamiane w trybie użytkownika w emulatorze.) NTVDM w systemach operacyjnych opartych na x86 Windows NT również używa 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 wykonują wywołania przerwań BIOS 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 między trybem chronionym a trybem rzeczywistym . Jak wspomniano, działając w trybie VM86, mechanizm 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; tak więc ochrona pamięci jest nadal stosowana, podobnie jak izolacja przestrzeni adresowej.

Gdy wystąpią przerwania (sprzęt, oprogramowanie i instrukcja int), procesor wyłącza tryb VM86 i powraca do pracy w trybie w pełni chronionym, aby obsłużyć przerwanie. Ponadto przed obsłużeniem przerwania rejestry DS, ES, FS i GS są umieszczane na nowym stosie i zerowane.

Rozszerzenia trybu wirtualnego 8086 (VME)

Architektura Pentium dodała szereg ulepszeń do wirtualnego trybu 8086. Zostały one jednak udokumentowane przez firmę Intel dopiero począwszy od kolejnego P6 (mikroarchitektura) ; ich nowsza nazwa formalna to Virtual-8086 Mode Extensions, w skrócie VME (starsza dokumentacja może wykorzystywać „Virtual 8086 mode enhancements” jako rozszerzenie akronimu VME). Obsługują go również niektóre późniejsze układy Intel 486. Ulepszenia dotyczą głównie narzutu wirtualizacji 8086, ze szczególnym uwzględnieniem (wirtualnych) przerwań. Zanim rozszerzenia zostały publicznie udokumentowane w dokumentacji P6, oficjalna dokumentacja odwoływała się do słynnego Załącznika 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 numer 0 (wartość 0x1) w CR4 . Ponieważ ulepszenia przyspieszenia przerwań VME okazały się przydatne dla zadań chronionych przed VM86, można je również włączyć osobno, ustawiając tylko bit numer 1 (wartość 0x2), który nazywa się PVI (Protected Mode Virtual Interrupts). Wykrywanie, czy procesor obsługuje VME (w tym PVI), odbywa się za pomocą instrukcji 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 flaga vme w pliku / proc / cpuinfo , w sekcji „flagi”.

W wirtualnym trybie 8086 podstawową ideą jest to, że gdy IOPL jest mniejsze 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 w ustawieniu symulowanego IF, kierując system operacyjny do przetwarzania oczekujących przerwań. Punkt załamania niwelety to ten sam pomysł, ale wpływa tylko na instrukcje CLI / STI.

Stwierdzono, że procesory AMD Ryzen pierwszej generacji mają wadliwą implementację VME. Ryzen drugiej generacji (seria 2000) rozwiązał ten problem.

Obsługa 64-bitowych i VMX

Wirtualny tryb 8086 nie jest dostępny w trybie długim x86-64 , chociaż nadal jest obecny w procesorach obsługujących x86-64 działających w trybie starszym .

Dodanie VT-x dodało z powrotem możliwość uruchamiania wirtualnego trybu 8086 z trybu długiego x86-64, ale musi to być zrobione poprzez przejście (fizycznego) procesora do trybu głównego VMX i uruchomienie samego logicznego (wirtualnego) procesora w wirtualnym trybie 8086.

Procesory firmy Westmere i późniejsze firmy Intel zwykle mogą uruchamiać procesor wirtualny bezpośrednio w trybie rzeczywistym przy użyciu 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.

Zobacz też

Uwagi

Bibliografia