stringtranslate.com

Modo virtual 8086

En el microprocesador 80386 y posteriores, el modo virtual 8086 (también llamado modo virtual real , 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. [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 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 ( DOS ) multitarea.

Para utilizar el modo virtual 8086, un sistema operativo configura un monitor de 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 sino que simplemente no permitirá 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 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í. [a] Por lo tanto, el modo V86 proporciona una forma para que los programas en modo real diseñados para un entorno de tarea única (como DOS [b] ) se ejecuten simultáneamente en un entorno multitarea.

Uso

Se utiliza para ejecutar ciertos programas de 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 modo mejorado 386 y 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, [3] 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. [4] [5]

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 se producen 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 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) ; [6] su nombre formal más reciente es Extensiones de modo Virtual-8086, abreviado VME [7] (la documentación anterior puede usar "mejoras del modo Virtual 8086" como 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 8086, con un enfoque particular en las interrupciones (virtuales). [6] [10] 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 bajo 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). [6] [9] 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 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 "flags".

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. [12] La segunda generación de Ryzen (serie 2000) ha solucionado este problema. [13]

Compatibilidad con 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 e iniciando un procesador lógico (virtual) que se ejecuta en 8086 virtual. modo. [14]

Los procesadores Westmere y posteriores de Intel generalmente [15] pueden iniciar el procesador virtual directamente en modo real utilizando la función "invitado sin restricciones" (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. [16] [17]

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 los invitados SVM si el host intercepta fallas de página. [18]

Ver también

Notas

  1. ^ Por ejemplo, si un programa escribe en una pantalla, luego otro programa toma 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 en la pantalla, realizar un seguimiento del estado de la pantalla para cada programa y cambiar la pantalla real entre ellos según el programa que el usuario haya seleccionado para interactuar actualmente. El monitor V86 emula visualizaciones independientes para cada programa utilizando únicamente una visualización real.
  2. ^ Se menciona DOS porque era especialmente la extensa biblioteca de programas DOS existentes que Intel tenía en mente cuando diseñaron el modo V86.

Referencias

  1. ^ Yager, Tom (5 de noviembre de 2004). "Envío de software para hacer el trabajo del hardware". InfoMundo . Consultado el 27 de enero de 2014 .
  2. ^ Gnomos, Lee; "Detrás de escena: la creación del 386", Intel Corporation, Special 32-Bit Issue Solutions, noviembre/diciembre de 1985, página 19
  3. ^ "Arquitectura de estación de trabajo Windows NT 4.0". Microsoft .
  4. ^ Mike Wang. "Proceso de arranque de Grub2". {{cite journal}}: Citar diario requiere |journal=( ayuda )
  5. ^ "Modo virtual 8086 - OSDev Wiki". wiki.osdev.org . Consultado el 10 de diciembre de 2020 .
  6. ^ ABCDE T. Shanley (1998). Arquitectura del sistema Pentium Pro y Pentium II. Addison-Wesley. págs. 427, 465–480. ISBN 978-0-201-30973-7.
  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ág. 2-17.
  8. ^ "Archivo de lista de correo: Re: 2.6.14: ¿Ya no es necesario inspeccionar CR4 en el 486?". Gossamer-threads.com . Consultado el 20 de febrero de 2014 .
  9. ^ ab "Interrupciones virtuales en modo protegido Pentium (PVI)". Rcollins.org . Consultado el 20 de febrero de 2014 .
  10. ^ "Extensiones de modo virtual en el procesador Pentium". Rcollins.org . Consultado el 20 de febrero de 2014 .
  11. ^ Manual del desarrollador de software de arquitecturas Intel 64 e IA-32, volumen 2 (2A, 2B, 2C y 2D): referencia del conjunto de instrucciones, AZ. Intel . Mayo de 2020. págs. 3–199, 3–221, 3–222.
  12. ^ Michal Necasek (12 de mayo de 2017). "VME roto en AMD Ryzen". Museo OS/2 .
  13. ^ "Guía de revisión para procesadores 00h-0Fh de los modelos 17h de la familia AMD" (PDF) . AMD . Junio ​​de 2018.
  14. ^ 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 a 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 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 tal como está con los kernels 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 modo virtual 8086; su objetivo final es realizar algunas llamadas al BIOS en modo real.
  15. ^ "Lista de tecnologías de virtualización Intel". Ark.intel.com. Archivado desde el original el 10 de febrero de 2014 . Consultado el 20 de febrero de 2014 . Una lista de procesadores Intel que admiten VT-x pero no EPT
  16. ^ "Intel agregó el modo de invitado sin restricciones en la microarquitectura Westmere y en CPU Intel posteriores, utiliza EPT para traducir el acceso a la dirección física del invitado a la dirección física del host. Con este modo, se permite VMEnter sin habilitar la paginación".
  17. ^ "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"
  18. ^ "Modo real paginado 15.19". Manual del programador de arquitectura AMD64, volumen 2: programación del sistema (PDF) . Apocalipsis 3.38. Micro dispositivos avanzados . Noviembre de 2021. págs. 515–516. Para facilitar la virtualización del modo real, la instrucción VMRUN puede cargar legalmente un valor CR0 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 paginación. La intención es que VMM ejecute el invitado en modo paginado real en CPL0 y con fallas de página interceptadas. El VMM es responsable de configurar una tabla de páginas ocultas que asigna la memoria física del invitado a las direcciones físicas apropiadas del sistema. El comportamiento de ejecutar un invitado en modo real paginado sin interceptar errores de página en el VMM no está definido.