Virtuální režim 8086 - Virtual 8086 mode

V mikroprocesoru 80386 a novějším umožňuje virtuální režim 8086 (nazývaný také virtuální reálný režim , režim V86 nebo VM86 ) provádění aplikací v reálném režimu, které nejsou schopny běžet přímo v chráněném režimu, zatímco procesor používá operační systém chráněného režimu. Jedná se o techniku virtualizace hardwaru, která umožnila emulaci více procesorů 8086 procesorem 386; vyplynulo to z bolestivých zkušeností s chráněným režimem 80286 , který sám o sobě nebyl vhodný pro dobré souběžné spouštění aplikací v reálném režimu.

Režim VM86 používá segmentační schéma identické se skutečným režimem (z důvodů kompatibility), které vytváří 20bitové lineární adresy stejným způsobem jako 20bitové fyzické adresy vytvářené v reálném režimu, ale podléhají mechanismu stránkování paměti v chráněném režimu .

Přehled

Virtuální režim 8086 je režim pro úlohu v chráněném režimu . V důsledku toho může procesor přepínat mezi úlohami VM86 a úlohami jiných než VM86, což umožňuje použití starších aplikací ( DOS ) pro více úkolů .

Chcete-li použít virtuální režim 8086, operační systém nastaví monitor režimu virtuálního 8086, což je program, který spravuje program v reálném režimu a emuluje nebo filtruje přístup k hardwarovým a softwarovým prostředkům systému. Monitor musí běžet na úrovni oprávnění 0 a v chráněném režimu. Pouze program 8086 běží v režimu VM86 a na úrovni oprávnění 3. Když se program v reálném režimu pokusí dělat věci, jako je přístup k určitým I / O portům za účelem použití hardwarových zařízení nebo přístup k určitým regionům ve svém paměťovém prostoru, CPU tyto události zachytí a zavolá monitor V86, který zkoumá, o co se program v reálném režimu pokouší, a buď funguje jako proxy pro rozhraní s hardwarem, emuluje zamýšlenou funkci, ke které se program v reálném režimu pokoušel získat přístup, nebo program v reálném režimu ukončí, pokud pokouší se dělat něco, co nelze povolit nebo adekvátně podporovat (například restartovat počítač, nastavit zobrazení videa do režimu, který není podporován hardwarem a není emulován, nebo přepisovat kód operačního systému).

Monitor V86 může také jemně odepřít povolení emulací selhání požadované operace - například může způsobit, že disková jednotka bude vždy vypadat, že není připravena, i když ve skutečnosti jednotku ani nekontrolovala, ale jednoduše nepovolí program v reálném režimu získat přístup. Monitor V86 také umí dělat věci, jako jsou stránky s mapami paměti, zachycovat hovory a přerušení a předcházet programu v reálném režimu, což umožňuje multitaskování programů v reálném režimu jako programů v chráněném režimu. Zachycením hardwarových a softwarových I / O programu v reálném režimu a sledováním stavu, který program V86 očekává, může umožnit více programům sdílet stejný hardware bez vzájemného ovlivňování. Režim V86 tedy poskytuje způsob, jak mohou programy v reálném režimu určené pro prostředí s jedním úkolem (například DOS) běžet souběžně v prostředí multitaskingu.

Používání

Používá se k provádění určitých programů DOS v systémech FlexOS 386 (od roku 1987), Concurrent DOS 386 (od roku 1987), Windows / 386 2.10 (od roku 1987), DESQview 386 (od roku 1988), Windows 3.x (od roku 1990), Multiuser DOS (od roku 1991), Windows for Workgroups 3.1x (od roku 1992), OS / 2 2.x (od roku 1992), 4690 OS (od roku 1993), REAL / 32 (od roku 1995) běžící v 386 vylepšeném režimu i v Windows 95 , 98 , 98 SE a ME prostřednictvím virtuálních strojů DOS , ve SCO UNIX prostřednictvím sloučení a v Linuxu prostřednictvím DOSEMU . (Jiné programy DOS, které používají chráněný režim, se spouštějí pomocí uživatelského režimu pod emulátorem.) NTVDM v x86 operačních systémech založených na Windows NT také používají režim VM86, ale s velmi omezeným přímým přístupem k hardwaru. Některé zavaděče (např. GRUB ) používají chráněný režim a provádějí volání přerušení systému BIOS v režimu Virtual 8086.

Adresování paměti a přerušení

Nejběžnějším problémem při spuštění kódu 8086 z chráněného režimu je adresování paměti, které je zcela odlišné mezi chráněným režimem a skutečným režimem . Jak již bylo zmíněno, při práci v režimu VM86 je segmentační mechanismus překonfigurován tak, aby fungoval stejně jako v reálném režimu, ale stránkovací mechanismus je stále aktivní a je transparentní pro kód reálného režimu; tedy ochrana paměti je stále použitelné, a proto je izolace adresního prostoru.

Když dojde k přerušení (hardware, software a instrukce int), procesor vypne režim VM86 a vrátí se do práce v plně chráněném režimu, aby zvládl přerušení. Také před obsluhou přerušení jsou registry DS, ES, FS a GS tlačeny na nový zásobník a vynulovány.

Rozšíření režimu Virtual-8086 (VME)

Architektura Pentium přidala do virtuálního režimu 8086 řadu vylepšení. Ty však Intel zdokumentoval teprve od následující P6 (mikroarchitektury) ; jejich novější formální název je Virtual-8086 Mode Extensions, zkráceně VME (starší dokumentace může jako rozšíření zkratky VME používat „vylepšení režimu Virtual 8086“). Některé novější čipy Intel 486 to také podporují. Vylepšení se zaměřují hlavně na režii virtualizace 8086, se zvláštním zaměřením na (virtuální) přerušení. Než byla rozšíření veřejně dokumentována v dokumentaci P6, oficiální dokumentace odkazovala na slavnou přílohu H , která byla z veřejné dokumentace vynechána a sdílena pouze s vybranými partnery v rámci NDA .

Aktivace VME se provádí nastavením bitu číslo 0 (hodnota 0x1) CR4 . Vzhledem k tomu, že vylepšení zrychlení přerušení VME byla shledána užitečnými pro úlohy, které nejsou chráněny pomocí VM86, lze je také povolit samostatně nastavením pouze bitu číslo 1 (hodnota 0x2), který se nazývá PVI (Protected Mode Virtual Interrupts). Zjištění, zda procesor podporuje VME (včetně PVI), se provádí pomocí instrukce CPUID s počáteční hodnotou EAX 0x1, testováním hodnoty druhého bitu (bit číslo 1, hodnota 0x2) v registru EDX, který je nastaven, pokud VME je podporován procesorem. V Linuxu je tento druhý bit hlášen jako příznak vme v souboru / proc / cpuinfo v sekci „příznaky“.

Ve virtuálním režimu 8086 je základní myšlenkou, že když je IOPL menší než 3, budou instrukce PUSHF / POPF / STI / CLI / INT / IRET považovat hodnotu VIF v reálném 32bitovém registru EFLAGS za hodnotu IF v simulovaný 16bitový registr FLAGS (32bitový PUSHFD / POPFD pokračuje v poruše GP). VIP způsobí poruchu GP při nastavení simulovaného IF, což OS nasměruje na zpracování všech nevyřízených přerušení. PVI je stejný nápad, ale má vliv pouze na pokyny CLI / STI.

Bylo zjištěno, že první generace procesorů AMD Ryzen mají nefunkční implementaci VME. Druhá generace Ryzen (série 2000) tento problém vyřešila.

64bitová podpora a podpora VMX

Virtuální režim 8086 není k dispozici v dlouhém režimu x86-64 , i když je stále přítomen v procesorech schopných x86-64 běžících ve starším režimu .

Přidání VT-x přidalo zpět schopnost spouštět virtuální režim 8086 z dlouhého režimu x86-64, ale musí to být provedeno přechodem (fyzického) procesoru do kořenového režimu VMX a spuštěním samotného logického (virtuálního) procesoru ve virtuálním režimu 8086.

Procesory Westmere a novější Intel obvykle mohou spouštět virtuální procesor přímo v reálném režimu pomocí funkce „neomezený host“ (která sama vyžaduje rozšířené tabulky stránek ); tato metoda odstraňuje nutnost uchýlit se k vnořenému virtuálnímu režimu 8086 jednoduše ke spuštění staršího systému BIOS pro spuštění.

Viz také

Poznámky

Reference