En el microprocesador 80386 y posteriores, el modo 8086 virtual (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ó de las dolorosas experiencias con el modo protegido 80286 , que por sí solo no era adecuado para ejecutar bien aplicaciones concurrentes en modo real. [1]
El modo VM86 usa 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 mecanismo de paginación de memoria del modo protegido .
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 heredadas multitarea ( DOS ).
Para usar el modo 8086 virtual, un sistema operativo configura un monitor de modo 8086 virtual, 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. Solo 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 captura estos eventos y llama al monitor V86, que examina lo que el programa en modo real está tratando de hacer y actúa como un proxy para interactuar con el hardware, emula la función prevista que el programa en modo real estaba tratando de acceder, o termina el programa en modo real si está tratando de 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 está emulado, o escribir sobre el código del sistema operativo).
El monitor V86 también puede denegar el permiso suavemente al emular la falla de una operación solicitada; por ejemplo, puede hacer que una unidad de disco siempre parezca no lista cuando en realidad ni siquiera ha verificado la unidad, pero simplemente no permite el programa en modo real. 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 sean multitarea 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 varios programas compartan el mismo hardware sin interferir entre sí. [a] Por tanto, el modo V86 proporciona una forma para que los programas en modo real diseñados para un entorno de una sola tarea (como DOS [b] ) se ejecuten simultáneamente en un entorno multitarea.
Uso
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), Multiusuario 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 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 bajo el emulador). NTVDM en los sistemas operativos x86 basados en Windows NT también usan el modo VM86, [2] 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 el modo Virtual 8086. [3] [4]
Direcciones e interrupciones de memoria
El problema más común al ejecutar el 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 funcionar como en el modo real, pero el mecanismo de paginación aún está activo y es transparente al 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 ocurren interrupciones (hardware, software e instrucción int), el procesador apaga el modo VM86 y vuelve a funcionar en modo totalmente protegido para manejar la interrupción. Además, antes de dar servicio a 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 8086 virtual. Sin embargo, Intel los documentó a partir de la siguiente P6 (microarquitectura) ; [5] su nombre formal más reciente es Virtual-8086 Mode Extensions, abreviado VME [6] (la documentación anterior puede usar "Virtual 8086 modehancements" como expansión del acrónimo VME). [5] Algunos chips posteriores Intel 486 también lo admiten. [7] [8] Las mejoras abordan principalmente la sobrecarga de virtualización del 8086, con un enfoque particular en las interrupciones (virtuales). [5] [9] Antes de que las extensiones se documentaran públicamente en la documentación P6, la documentación oficial se refería 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 estableciendo el número de bit 0 (valor 0x1) de CR4 . Debido a que las mejoras de 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). [5] [8] 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 (número de bit 1, valor 0x2) en el registro EDX , que se establece si el procesador admite VME. [10] [5] En Linux, este último bit se informa como el indicador vme en el archivo / proc / cpuinfo , en la sección "indicadores".
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 simulado de 16 bits (PUSHFD / POPFD de 32 bits continúa con falla GP). VIP provocará una falla de GP en la configuración de IF simulado, lo que indicará al sistema operativo 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. [11] La segunda generación de Ryzen (serie 2000) ha solucionado este problema. [12]
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 los procesadores con capacidad x86-64 que se ejecutan en modo heredado .
La adición de VT-x ha vuelto a agregar la capacidad de ejecutar el modo 8086 virtual desde el modo largo x86-64, pero debe hacerse mediante la transición del procesador (físico) al modo raíz VMX y lanzando un procesador lógico (virtual) en ejecución. en modo virtual 8086. [13]
Westmere y los procesadores Intel posteriores por lo general [14] pueden iniciar el procesador virtual directamente en modo real utilizando la función de "invitado sin restricciones" (que a su vez requiere tablas de páginas extendidas ); este método elimina la necesidad de recurrir al modo 8086 virtual anidado simplemente para ejecutar el BIOS heredado para el arranque. [15] [16]
Ver también
- IA-32
- lenguaje ensamblador x86
Notas
- ^ Por ejemplo, si un programa escribe en una pantalla, luego otro programa obtiene el control y escribe en la misma pantalla, y luego el primer programa recupera el control, intentará usar la pantalla como si el segundo programa no la hubiera cambiado. El monitor V86 puede interceptar las escrituras de la pantalla, realizar un seguimiento del estado de la pantalla para cada programa y cambiar la pantalla real entre ellos de acuerdo con el programa que el usuario ha seleccionado para interactuar en ese momento. El monitor V86 emula pantallas independientes para cada programa utilizando solo una pantalla real.
- ^ DOS se menciona porque era especialmente la extensa biblioteca de programas DOS existentes que Intel tenía en mente cuando diseñó el modo V86.
Referencias
- ^ Yager, Tom (5 de noviembre de 2004). "Envío de software para hacer el trabajo del hardware" . InfoWorld . Consultado el 27 de enero de 2014 .
- ^ "Arquitectura de la estación de trabajo Windows NT 4.0" .
- ^ Mike Wang. "Proceso de arranque de Grub2" . Cite journal requiere
|journal=
( ayuda ) - ^ "Modo 8086 virtual - OSDev Wiki" . wiki.osdev.org . Consultado el 10 de diciembre de 2020 .
- ^ a b c d e T. Shanley (1998). Arquitectura del sistema Pentium Pro y Pentium II . Addison-Wesley. págs. 427, 465–480. ISBN 978-0-201-30973-7.
- ^ Manual del desarrollador de software de arquitecturas Intel 64 e IA-32, volumen 3 (3A, 3B, 3C y 3D): Guía de programación del sistema . Intel . Mayo de 2020. p. 2-17.
- ^ "Archivo de lista de correo: Re: 2.6.14: ¿CR4 ya no necesita ser inspeccionado en el 486?" . Gossamer-threads.com . Consultado el 20 de febrero de 2014 .
- ^ a b "Interrupciones virtuales del modo protegido de Pentium (PVI)" . Rcollins.org . Consultado el 20 de febrero de 2014 .
- ^ "Extensiones de modo virtual en el procesador Pentium" . Rcollins.org . Consultado el 20 de febrero de 2014 .
- ^ Manual del desarrollador de software de arquitecturas Intel 64 e IA-32, volumen 2 (2A, 2B, 2C y 2D): referencia de conjunto de instrucciones, AZ . Intel . Mayo de 2020. págs. 3–199, 3–221, 3–222.
- ^ Michal Necasek (12 de mayo de 2017). "VME roto en AMD Ryzen" . Museo OS / 2 .
- ^ "Guía de revisión para procesadores AMD Familia 17h Modelos 00h-0Fh" (PDF) . AMD . Junio de 2018.
- ^ Manual del desarrollador de software de arquitecturas Intel 64 e IA-32, Volumen 3B: Guía de programación del sistema, Parte 2 (PDF) . Intel . Septiembre de 2009. p. 29-1. Archivado desde el original (PDF) el 5 de enero de 2010.
Se permite una entrada de VM solo para invitados con paginación habilitada que están en modo protegido o en modo virtual-8086. La ejecución del invitado en otros modos de funcionamiento del procesador debe ser manejada especialmente por el VMM
; consulte también CS 686: Tema especial: Extensiones Intel EM64T y VT (primavera de 2007) , lección 24 cómo hacer esto desde Linux (no es que el código esté bastante anticuado, por lo que es posible que no funcione como está con los núcleos actuales) más actualizado -El código de fecha se puede encontrar aquí . También tenga en cuenta que este código de muestra es más complicado que arrancar estrictamente el procesador lógico en el modo virtual 8086; su objetivo final es realizar algunas llamadas al BIOS en modo real. - ^ "Lista de tecnología de virtualización de Intel" . Ark.intel.com . Consultado el 20 de febrero de 2014 .
Una lista de procesadores Intel que admiten VT-x pero no EPT
- ^ "Intel agregó el modo invitado sin restricciones en la microarquitectura Westmere y las CPU Intel posteriores, utiliza EPT para traducir el acceso de la dirección física del invitado a la dirección física del host. Con este modo, se permite VMEnter sin habilitar paginación".
- ^ "Si el control de ejecución de VM" invitado sin restricciones "es 1, el control de ejecución de VM" habilitar EPT "también debe ser 1"