Modo virtual 8086
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 ejecuta un sistema operativo en modo protegido. Es una técnica de virtualización de hardware que permitió que el chip 386 emulara múltiples procesadores 8086. Surgió de las dolorosas experiencias con el modo protegido 80286, que por sí solo no era adecuado para ejecutar bien aplicaciones concurrentes en modo real. John Crawford desarrolló el bit de modo virtual en el conjunto de registros, allanando el camino hacia este entorno.
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 que las direcciones físicas de 20 bits se crean en modo real, pero están sujetas al modo protegido. #39;mecanismo de paginación de memoria.
Descripción general
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 aplicaciones multitarea heredadas (DOS).
Para utilizar el modo virtual 8086, un sistema operativo configura un monitor en modo virtual 8086, que es un programa que administra el programa en 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. Sólo el programa 8086 se ejecuta en modo VM86 y en el nivel de privilegio 3. Cuando el programa en 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 en 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 en modo real intentaba acceder o finaliza el programa en modo real si está intentando hacer algo que no se puede permitir ni admitir adecuadamente (como reiniciar la máquina, configurar una pantalla de video en un modo que no es compatible con el hardware y no está emulado, o escribir sobre el código del sistema operativo).
El monitor V86 también puede denegar el permiso suavemente al emular el error de una operación solicitada; por ejemplo, puede hacer que una unidad de disco siempre parezca no estar lista cuando en realidad ni siquiera ha verificado la unidad y simplemente no permitirá la operación real. -modo programa para acceder a él. Además, el monitor V86 puede hacer cosas como mapear páginas de memoria, interceptar llamadas e interrupciones y adelantarse al programa en modo real, permitiendo que los programas en modo real realicen múltiples tareas como programas en modo protegido. Al interceptar las E/S de hardware y software del programa en modo real y rastrear el estado que espera el programa V86, puede permitir que múltiples programas compartan el mismo hardware sin interferir entre sí. Por lo tanto, el modo V86 proporciona una manera de que los programas en modo real diseñados para un entorno de una sola tarea (como DOS) se ejecuten simultáneamente en un entorno multitarea.
Uso
Se utiliza para ejecutar ciertos programas de DOS en FlexOS 386 (desde 1987), DOS concurrente 386 (desde 1987), Windows/386 2.10 (desde 1987), DESQview 386 (desde 1988), Windows 3.x (desde 1990), DOS multiusuario (desde 1991), Windows para trabajo en grupo 3.1x (desde 1992), OS/2 2.x (desde 1992), 4690 OS (desde 1993), REAL/32 (desde 1995) ejecutándose en 386 Enhanced Mode 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 de DOS que usan el modo protegido se ejecutan usando el modo de usuario en el emulador). NTVDM en sistemas operativos x86 basados en Windows NT también usa el modo VM86, pero con 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.
Direccionamiento de memoria e interrupciones
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 modo VM86, el mecanismo de segmentación se reconfigura para funcionar igual que en modo real, pero el mecanismo de paginación aún está activo y es transparente para el código en modo real; por tanto, la protección de la memoria sigue siendo aplicable, al igual que el aislamiento del espacio de direcciones.
Cuando ocurren interrupciones (hardware, software e instrucción int), el procesador apaga el modo VM86 y vuelve a trabajar en modo totalmente protegido para manejar la interrupción. Además, antes de atender la interrupción, los registros DS, ES, FS y GS se insertan en la nueva pila y se ponen a cero.
Extensiones de modo virtual-8086 (VME)
La arquitectura Pentium agregó una serie de mejoras al modo virtual 8086. Sin embargo, Intel solo los documentó a partir del siguiente P6 (microarquitectura); su nombre formal más reciente es Extensiones de modo Virtual-8086, abreviado VME (la documentación anterior puede usar "mejoras del modo Virtual 8086" como expansión del acrónimo VME). Algunos chips Intel 486 posteriores también lo admiten. Las mejoras abordan principalmente la sobrecarga de virtualización 8086, con un enfoque particular en las interrupciones (virtuales). Antes de que las extensiones se documentaran públicamente en la documentación de 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 según la NDA.
La activación de VME se realiza configurando el bit número 0 (valor 0x1) de CR4. Debido a que las mejoras en la aceleración de interrupciones de VME resultaron ú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 denomina PVI (interrupciones virtuales en modo protegido). La detección de si un procesador admite VME (incluido PVI) se realiza mediante 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 establece si VME es soportado por el procesador. En Linux, este último bit se informa como el indicador vme en el archivo /proc/cpuinfo, bajo el título " banderas" sección.
En el modo virtual 8086, 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 real de 32 bits como el valor de IF en el registro FLAGS de 16 bits simulado (PUSHFD/POPFD de 32 bits continúa con falla de GP). VIP provocará una falla de GP en la configuración de IF simulada, lo que indicará al sistema operativo que procese cualquier interrupción pendiente. PVI es la misma idea pero solo afecta las instrucciones CLI/STI.
Se ha descubierto que las CPU AMD Ryzen de primera generación presentan una implementación VME defectuosa. La segunda generación de Ryzen (serie 2000) solucionó este problema.
Soporte de 64 bits y VMX
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 virtual 8086 desde el modo largo x86-64, pero debe hacerse mediante la transición del procesador (físico) al modo raíz VMX y ejecutando un procesador lógico (virtual) en modo virtual 8086.
Los procesadores Intel Westmere y posteriores generalmente pueden iniciar el procesador virtual directamente en modo real utilizando la función "invitado sin restricciones" característica (que a su vez requiere tablas de páginas extendidas); Este método elimina la necesidad de recurrir al modo virtual anidado 8086 simplemente para ejecutar el BIOS heredado para el arranque.
AMD-V también puede utilizar el modo virtual 8086 en invitados, pero también puede ejecutar el invitado en "modo real paginado" siguiendo 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.