stringtranslate.com

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 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 .

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 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.

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), 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]

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 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.

Extensiones de modo virtual 8086 (VME)

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]

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 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]

Véase también

Notas

  1. ^ 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 modificado. 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 con el que el usuario haya seleccionado interactuar en ese momento. El monitor V86 emula pantallas independientes para cada programa utilizando solo una pantalla real.
  2. ^ Se menciona DOS porque era especialmente la extensa biblioteca de programas DOS existentes lo que Intel tenía en mente cuando diseñó el modo V86.

Referencias

  1. ^ Yager, Tom (5 de noviembre de 2004). "Enviar software para que haga el trabajo del hardware". InfoWorld . Consultado el 27 de enero de 2014 .
  2. ^ Gnomes, Lee; "Detrás de escena: la creación del 386", Intel Corporation, número especial de 32 bits, Solutions, noviembre/diciembre de 1985, página 19
  3. ^ "Arquitectura de la estación de trabajo de Windows NT 4.0". Microsoft .
  4. ^ Mike Wang (21 de junio de 2016). "Proceso de arranque de Grub2". {{cite journal}}: Requiere citar revista |journal=( ayuda )
  5. ^ "Modo 8086 virtual - Wiki OSDev" . wiki.osdev.org . Consultado el 10 de diciembre de 2020 .
  6. ^ abcde T. Shanley (1998). Arquitectura de sistemas 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 listas 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 (PVI) de Pentium". 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, A-Z. 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 los procesadores AMD de la familia 17h, modelos 00h-0Fh" (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. 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.
  15. ^ "Lista de tecnologías de virtualización de Intel". Ark.intel.com. Archivado desde el original el 10 de febrero de 2014. Consultado el 20 de febrero de 2014. Lista de procesadores Intel que admiten VT-x pero no EPT
  16. ^ "Intel agregó un modo de invitado sin restricciones en la microarquitectura Westmere y en las 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 VMEter sin paginación habilitada".
  17. ^ "Si el control de ejecución de la máquina virtual "invitado sin restricciones" es 1, el control de ejecución de la máquina virtual "habilitar EPT" también debe ser 1"
  18. ^ "15.19 Modo real paginado". Manual del programador de la arquitectura AMD64, volumen 2: Programación del sistema (PDF) . Rev. 3.38. Advanced Micro Devices . 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 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.