En el microprocesador 80386 y posteriores, el modo virtual 8086 (también llamado modo real virtual , modo V86 o VM86 ) permite la ejecución de aplicaciones en modo real que no pueden ejecutarse directamente en modo protegido mientras el procesador está ejecutando un sistema operativo en modo protegido. Es una técnica de virtualización de hardware que permitió que el chip 386 emulara varios procesadores 8086. Surgió a partir de las dolorosas experiencias con el modo protegido 80286 , que por sí mismo no era adecuado para ejecutar bien aplicaciones en modo real concurrentes. [1] John Crawford desarrolló el bit de modo virtual en el conjunto de registros, allanando el camino hacia este entorno. [2]
El modo VM86 utiliza un esquema de segmentación idéntico al del modo real (por razones de compatibilidad), que crea direcciones lineales de 20 bits de la misma manera en que se crean las direcciones físicas de 20 bits en el modo real, pero están sujetas al mecanismo de paginación de memoria del modo protegido .
El modo virtual 8086 es un modo para una tarea en modo protegido . En consecuencia, el procesador puede cambiar entre tareas VM86 y no VM86, lo que permite la multitarea en aplicaciones heredadas ( DOS ).
Para utilizar el modo 8086 virtual, un sistema operativo configura un monitor de modo 8086 virtual, que es un programa que administra el programa de modo real y emula o filtra el acceso a los recursos de hardware y software del sistema. El monitor debe ejecutarse en el nivel de privilegio 0 y en modo protegido. Solo el programa 8086 se ejecuta en modo VM86 y en el nivel de privilegio 3. Cuando el programa de modo real intenta hacer cosas como acceder a ciertos puertos de E/S para usar dispositivos de hardware o acceder a ciertas regiones en su espacio de memoria, la CPU atrapa estos eventos y llama al monitor V86, que examina lo que el programa de modo real está intentando hacer y actúa como un proxy para interactuar con el hardware, emula la función prevista a la que el programa de modo real estaba intentando acceder o finaliza el programa de modo real si está intentando hacer algo que no se puede permitir o que no se puede admitir adecuadamente (como reiniciar la máquina, configurar una pantalla de video en un modo que no es compatible con el hardware y no se emula, o escribir sobre el código del sistema operativo).
El monitor V86 también puede denegar el permiso con delicadeza emulando el fallo de una operación solicitada; por ejemplo, puede hacer que una unidad de disco siempre parezca no estar lista cuando, de hecho, ni siquiera ha comprobado la unidad, sino que simplemente no permitirá que el programa de modo real acceda a ella. Además, el monitor V86 puede hacer cosas como asignar páginas de memoria, interceptar llamadas e interrupciones y adelantarse al programa de modo real, lo que permite que los programas de modo real realicen varias tareas al mismo tiempo, como los programas de modo protegido. Al interceptar la E/S de hardware y software del programa de modo real y rastrear el estado que espera el programa V86, puede permitir que varios programas compartan el mismo hardware sin interferir entre sí. [a] Por lo tanto, el modo V86 proporciona una forma de que los programas de modo real diseñados para un entorno de una sola tarea (como DOS [b] ) se ejecuten simultáneamente en un entorno de múltiples tareas.
Se utiliza para ejecutar ciertos programas DOS en FlexOS 386 (desde 1987), Concurrent DOS 386 (desde 1987), Windows/386 2.10 (desde 1987), DESQview 386 (desde 1988), Windows 3.x (desde 1990), Multiuser DOS (desde 1991), Windows for Workgroups 3.1x (desde 1992), OS/2 2.x (desde 1992), 4690 OS (desde 1993), REAL/32 (desde 1995) ejecutándose en modo mejorado 386 así como en Windows 95 , 98 , 98 SE y ME a través de máquinas virtuales DOS , en SCO UNIX a través de Merge , y en Linux a través de DOSEMU . (Otros programas DOS que utilizan el modo protegido se ejecutan utilizando el modo de usuario bajo el emulador). NTVDM en sistemas operativos basados en Windows NT x86 también utilizan el modo VM86, [3] pero con un acceso directo al hardware muy limitado. Algunos cargadores de arranque (por ejemplo, GRUB ) utilizan el modo protegido y ejecutan las llamadas de interrupción del BIOS en modo Virtual 8086. [4] [5]
El problema más común al ejecutar código 8086 desde el modo protegido es el direccionamiento de la memoria , que es totalmente diferente entre el modo protegido y el modo real . Como se mencionó, al trabajar en el modo VM86, el mecanismo de segmentación se reconfigura para que funcione como en el modo real, pero el mecanismo de paginación sigue activo y es transparente para el código del modo real; por lo tanto, la protección de la memoria sigue siendo aplicable, al igual que el aislamiento del espacio de direcciones.
Cuando se producen interrupciones (hardware, software e instrucciones int), el procesador desactiva el modo VM86 y vuelve a funcionar en modo totalmente protegido para gestionar la interrupción. Además, antes de atender la interrupción, los registros DS, ES, FS y GS se colocan en la nueva pila y se ponen a cero.
La arquitectura Pentium agregó una serie de mejoras al modo virtual 8086. Sin embargo, Intel las documentó recién a partir del P6 (microarquitectura) posterior ; [6] su nombre formal más reciente es Extensiones del modo virtual 8086, abreviado VME [7] (la documentación más antigua puede usar "mejoras del modo virtual 8086" como la expansión del acrónimo VME). [6] Algunos chips Intel 486 posteriores también lo admiten. [8] [9] Las mejoras abordan principalmente la sobrecarga de virtualización del 8086, con un enfoque particular en las interrupciones (virtuales). [6] [10] Antes de que las extensiones se documentaran públicamente en la documentación P6, la documentación oficial hacía referencia al famoso Apéndice H , que se omitió de la documentación pública y se compartió solo con socios seleccionados bajo NDA .
La activación de VME se realiza configurando el bit número 0 (valor 0x1) de CR4 . Debido a que las mejoras de aceleración de interrupciones de VME se encontraron útiles para tareas no protegidas por VM86, también se pueden habilitar por separado configurando solo el bit número 1 (valor 0x2), que se llama PVI (interrupciones virtuales en modo protegido). [6] [9] La detección de si un procesador admite VME (incluido PVI) se realiza utilizando la instrucción CPUID , con un valor EAX inicial de 0x1, probando el valor del segundo bit (bit número 1, valor 0x2) en el registro EDX, que se configura si el procesador admite VME. [11] [6] En Linux, este último bit se informa como el indicador vme en el archivo /proc/ cpuinfo , en la sección "indicadores".
En el modo 8086 virtual, la idea básica es que cuando IOPL es menor que 3, las instrucciones PUSHF/POPF/STI/CLI/INT/IRET tratarán el valor de VIF en el registro EFLAGS de 32 bits real como el valor de IF en el registro FLAGS de 16 bits simulado (PUSHFD/POPFD de 32 bits continúa con falla GP). VIP causará una falla GP en la configuración de IF simulada, lo que indica al SO que procese cualquier interrupción pendiente. PVI es la misma idea, pero solo afecta a las instrucciones CLI/STI.
Se ha descubierto que las CPU AMD Ryzen de primera generación presentan una implementación de VME defectuosa. [12] La segunda generación Ryzen (serie 2000) ha solucionado este problema. [13]
El modo virtual 8086 no está disponible en el modo largo x86-64 , aunque todavía está presente en procesadores con capacidad x86-64 que se ejecutan en modo heredado .
Intel VT-x recupera la capacidad de ejecutar el modo 8086 virtual desde el modo largo x86-64, pero esto debe hacerse mediante la transición del procesador (físico) al modo raíz VMX e iniciando un procesador lógico (virtual) que se ejecute en modo 8086 virtual. [14]
Los procesadores Intel Westmere y posteriores generalmente [15] pueden iniciar el procesador virtual directamente en modo real usando la función de "invitado sin restricciones" (que requiere tablas de páginas extendidas ); este método elimina la necesidad de recurrir al modo virtual 8086 anidado simplemente para ejecutar el BIOS heredado para el arranque. [16] [17]
AMD-V también puede hacer modo virtual 8086 en invitados, pero también puede simplemente ejecutar el invitado en "modo real paginado" usando los siguientes pasos: crea un invitado en modo SVM (Máquina Virtual Segura) con CR0.PE=0, pero CR0.PG=1 (es decir, con el modo protegido deshabilitado pero la paginación habilitada), lo cual normalmente es imposible, pero está permitido para invitados SVM si el host intercepta fallas de página. [18]
{{cite journal}}
: Requiere citar revista |journal=
( ayuda )una entrada de VM solo se permite a los invitados con paginación habilitada que estén en modo protegido o en modo virtual-8086. La ejecución de invitados en otros modos operativos del procesador debe ser manejada especialmente por el VMM; consulte también CS 686: Tema especial: Intel EM64T y extensiones VT (primavera de 2007), lección 24 sobre cómo hacer esto desde Linux (no es que el código esté bastante desactualizado, por lo que podría no funcionar tal como está con los núcleos actuales). Puede encontrar código más actualizado aquí. También tenga en cuenta que este código de muestra es más complicado que arrancar estrictamente el procesador lógico en modo 8086 virtual; su objetivo final es realizar algunas llamadas a BIOS en modo real.
de procesadores Intel que admiten VT-x pero no EPT
Para facilitar la virtualización del modo real, la instrucción VMRUN puede cargar legalmente un valor CR0 de invitado con PE = 0 pero PG = 1. Asimismo, se permite que la instrucción RSM regrese al modo real paginado. Este modo de procesador se comporta en todos los sentidos como el modo real, con la excepción de que se aplica la paginación. La intención es que el VMM ejecute el invitado en modo real paginado en CPL0 y con fallas de página interceptadas. El VMM es responsable de configurar una tabla de páginas de sombra que asigna la memoria física del invitado a las direcciones físicas del sistema adecuadas. El comportamiento de ejecutar un invitado en modo real paginado sin interceptar fallas de página al VMM no está definido.