Virtuellt 8086-läge

I 80386- mikroprocessorn och senare tillåter virtuellt 8086-läge (även kallat virtuellt verkligt läge , V86-läge eller VM86 ) exekvering av reallägesapplikationer som inte kan köras direkt i skyddat läge medan processorn kör ett operativsystem med skyddat läge . Det är en hårdvaruvirtualiseringsteknik som gjorde att flera 8086-processorer kunde emuleras av 386-chippet. Det kom från de smärtsamma upplevelserna med 80286-skyddat läge , som i sig inte var lämpligt för att köra samtidiga real-mode-applikationer bra. John Crawford utvecklade Virtual Mode-biten vid registeruppsättningen, vilket banade vägen till denna miljö.

VM86-läget använder ett segmenteringsschema som är identiskt med det för verkligt läge (av kompatibilitetsskäl), vilket skapar 20-bitars linjära adresser på samma sätt som 20-bitars fysiska adresser skapas i verkligt läge, men är föremål för skyddat läges minnessökningsmekanism .

Översikt

Det virtuella 8086-läget är ett läge för en uppgift i skyddat läge . Följaktligen kan processorn växla mellan VM86 och icke-VM86 uppgifter, vilket möjliggör multitasking legacy ( DOS ) applikationer.

För att använda virtuellt 8086-läge ställer ett operativsystem upp en virtuell 8086-lägesmonitor, vilket är ett program som hanterar real-mode-programmet och emulerar eller filtrerar åtkomst till systemets hårdvara och mjukvaruresurser. Monitorn måste köras på behörighetsnivå 0 och i skyddat läge. Endast 8086-programmet körs i VM86-läge och på behörighetsnivå 3. När real-mode-programmet försöker göra saker som att komma åt vissa I/O-portar för att använda hårdvaruenheter eller komma åt vissa regioner i sitt minnesutrymme, fångar CPU:n dessa händelser och anropar V86-monitorn, som undersöker vad real-mode-programmet försöker göra och antingen fungerar som en proxy för gränssnitt med hårdvaran, emulerar den avsedda funktionen som real-mode-programmet försökte komma åt, eller avslutar real-mode-programmet om den försöker göra något som varken kan tillåtas eller stöds tillräckligt (som att starta om maskinen, ställa in en videoskärm i ett läge som inte stöds av hårdvaran och inte emuleras, eller skriva över operativsystemkod).

V86-monitorn kan också försiktigt neka tillstånd genom att emulera misslyckandet i en begärd operation – till exempel kan den få en diskenhet att alltid verka oklar när den i själva verket inte ens har kontrollerat enheten men helt enkelt inte tillåter real-mode-programmet för att komma åt den. V86-monitorn kan också göra saker som kartminnessidor, avlyssna samtal och avbrott och förebygga real-mode-programmet, vilket gör att real-mode-program kan multitasking som skyddade-mode-program. Genom att avlyssna hård- och mjukvaru-I/O för real-mode-programmet och spåra tillståndet som V86-programmet förväntar sig, kan det tillåta flera program att dela samma hårdvara utan att störa varandra. Så V86-läge ger ett sätt för real-mode-program som är designade för en miljö med en enda uppgift (som DOS) att köras samtidigt i en miljö med flera uppgifter.

Användande

Den används för att köra vissa DOS- program i FlexOS 386 (sedan 1987), Concurrent DOS 386 (sedan 1987), Windows/386 2.10 (sedan 1987), DESQview 386 (sedan 1988), Windows 3.x (sedan 1990), Multiuser DOS (sedan 1991), Windows for Workgroups 3.1x (sedan 1992), OS/2 2.x (sedan 1992), 4690 OS (sedan 1993), REAL/32 (sedan 1995) som körs i 386 Enhanced Mode såväl som i Windows 95 , 98 , 98 SE och ME genom virtuella DOS-maskiner , i SCO UNIX genom Merge och i Linux genom DOSEMU . (Andra DOS- program som använder skyddat läge körs med användarläge under emulatorn.) NTVDM i x86 Windows NT-baserade operativsystem använder också VM86-läge, men med mycket begränsad direkt maskinvaruåtkomst. Vissa starthanterare (t.ex. GRUB ) använder det skyddade läget och kör BIOS-avbrottsanropen i Virtual 8086-läge.

Minnesadressering och avbrott

Det vanligaste problemet med att köra 8086-kod från skyddat läge är minnesadressering som skiljer sig totalt mellan skyddat läge och verkligt läge . Som nämnts, genom att arbeta under VM86-läge, segmenteringsmekanismen för att fungera precis som i verkligt läge, men personsökningsmekanismen är fortfarande aktiv och den är transparent för realmodekoden; sålunda minnesskydd fortfarande tillämpligt, och likaså isoleringen av adressutrymmet.

När avbrott (hårdvara, mjukvara och instruktion) inträffar, stänger processorn av VM86-läget och återgår till arbetet i fullt skyddat läge för att hantera avbrottet. Före service av avbrottet trycks DS-, ES-, FS- och GS-registren på den nya stacken och nollställs.

Virtual-8086 mode extensions (VME)

Pentium-arkitekturen lade till ett antal förbättringar till det virtuella 8086-läget. Dessa dokumenterades dock av Intel först från och med den efterföljande P6 (mikroarkitektur) ; deras nyare formella namn är Virtual-8086 Mode Extensions, förkortat VME (äldre dokumentation kan använda "Virtual 8086 mode enhancements" som VME-akronymexpansion). Vissa senare Intel 486-chips stöder det också. Förbättringarna riktar sig främst till 8086-virtualiseringsoverhead, med särskilt fokus på (virtuella) avbrott. Innan tilläggen dokumenterades offentligt i P6-dokumentationen hänvisade den officiella dokumentationen till den berömda bilagan H , som utelämnades från den offentliga dokumentationen och endast delades med utvalda partners under NDA .

Aktivering av VME görs genom att sätta bitnummer 0 (0x1 i värde) för CR4 . Eftersom förbättringarna av VME-avbrottshastigheten visade sig vara användbara för icke-VM86-skyddade uppgifter, kan de också aktiveras separat genom att endast ställa in bit nummer 1 (0x2 i värde), vilket kallas PVI (Protected Mode Virtual Interrupts). Att upptäcka om en processor stöder VME (inklusive PVI) görs med CPUID- instruktionen, med ett initialt EAX-värde på 0x1, genom att testa värdet på den andra biten (bitnummer 1, 0x2 i värde) i EDX-registret, vilket ställs in om VME stöds av processorn. I Linux rapporteras den sistnämnda biten som vme -flaggan i /proc/ cpuinfo -filen, under avsnittet "flaggor".

I virtuellt 8086-läge är grundidén att när IOPL är mindre än 3, kommer PUSHF/POPF/STI/CLI/INT/IRET-instruktioner att behandla värdet på VIF i det verkliga 32-bitars EFLAGS-registret som värdet på IF i simulerat 16-bitars FLAGS-register (32-bitars PUSHFD/POPFD fortsätter till GP-fel). VIP kommer att orsaka ett GP-fel på inställningen av simulerad IF, vilket leder till att operativsystemet bearbetar eventuella väntande avbrott. PVI är samma idé men påverkar bara CLI/STI-instruktioner.

Första generationens AMD Ryzen- processorer har visat sig ha en trasig VME-implementation. Den andra generationen Ryzen (2000-serien) har åtgärdat problemet.

64-bitars och VMX-stöd

Virtuellt 8086-läge är inte tillgängligt i x86-64 långt läge , även om det fortfarande finns på x86-64-kapabla processorer som körs i äldre läge .

Intel VT-x ger tillbaka möjligheten att köra virtuellt 8086-läge från x86-64 långt läge, men det måste göras genom att övergå den (fysiska) processorn till VMX-rotläge och starta en logisk (virtuell) processor som körs i virtuell 8086 läge.

Westmere och senare Intel-processorer kan vanligtvis starta den virtuella processorn direkt i verkligt läge med hjälp av funktionen "obegränsad gäst" (som i sig kräver utökade sidtabeller ); denna metod tar bort behovet av att tillgripa det kapslade virtuella 8086-läget helt enkelt för att köra det äldre BIOS för uppstart.

AMD-V kan också göra virtuellt 8086-läge i gäster, men det kan också bara köra gästen i "paged real mode" genom att använda följande steg: du skapar en SVM (Secure Virtual Machine)-lägesgäst med CR0.PE=0, men CR0.PG=1 (det vill säga med skyddat läge inaktiverat men sökning aktiverat), vilket vanligtvis är omöjligt, men är tillåtet för SVM-gäster om värden fångar upp sidfel.

Se även

Anteckningar