Articulo de referencia

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

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ó emular múltiples procesadores 8086 mediante el chip 386. Surgió de las experiencias negativas con el modo protegido del 80286 , que por sí solo no era adecuado para ejecutar aplicaciones concurrentes en modo real de manera eficiente. [ 1 ] John Crawford desarrolló el bit de modo virtual en el conjunto de registros, allanando el camino a 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 se crean las direcciones físicas de 20 bits en el modo real, pero está sujeto al mecanismo de paginación de memoria del modo protegido .

Descripción general

El modo virtual 8086 es un modo para tareas en modo protegido . En consecuencia, el procesador puede alternar entre tareas VM86 y no VM86, lo que permite la multitarea en aplicaciones heredadas ( DOS ).

Para usar el modo virtual 8086, el 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 con nivel de privilegio 0 y en modo protegido. Solo el programa 8086 se ejecuta en modo VM86 y con nivel de privilegio 3. Cuando el programa en modo real intenta realizar acciones como acceder a ciertos puertos de E/S para usar dispositivos de hardware o acceder a ciertas regiones de su espacio de memoria, la CPU intercepta 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 a la que el programa en modo real intentaba acceder o finaliza el programa en modo real si está intentando hacer algo que no está permitido o no está adecuadamente soportado (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 sobrescribir código del sistema operativo).

El monitor V86 también puede denegar permisos de forma gradual emulando el fallo de una operación solicitada ; por ejemplo, puede hacer que una unidad de disco aparezca siempre como no lista cuando, de hecho, ni siquiera la ha comprobado, sino que simplemente no permitirá que el programa en modo real acceda a ella. Además, el monitor V86 puede realizar acciones como mapear páginas de memoria, interceptar llamadas e interrupciones y abortar el programa en modo real, lo que permite que los programas en modo real se ejecuten en multitarea como los programas en modo protegido. Al interceptar la 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 lo 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 de 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), 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 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 sistemas operativos basados ​​en Windows NT x86 también usa el modo VM86, [ 3 ] pero con un acceso directo al hardware muy limitado. Algunos cargadores de arranque (por ejemplo, GRUB ) usan el modo protegido y ejecutan las llamadas de interrupción de la BIOS en modo Virtual 8086. [ 4 ] [ 5 ]

Direccionamiento de memoria e interrupciones

El problema más común al ejecutar código 8086 en modo protegido es el direccionamiento de 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 sigue activo y es transparente para el código en modo real; por lo tanto, la protección de memoria sigue siendo aplicable, al igual que el aislamiento del espacio de direcciones.

Cuando se producen interrupciones (de 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 insertan en la nueva pila y se ponen a cero.

Extensiones del modo Virtual-8086 (VME)

La arquitectura Pentium añadió una serie de mejoras al modo virtual 8086. Sin embargo, Intel solo documentó estas mejoras a partir de la posterior P6 (microarquitectura) ; [ 6 ] su nombre formal más reciente es Virtual-8086 Mode Extensions, abreviado VME [ 7 ] (la documentación antigua puede usar "Virtual 8086 mode enhancements" como expansión del acrónimo VME). [ 6 ] Algunos chips Intel 486 posteriores también lo soportan. [ 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 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 un acuerdo de confidencialidad .

La activación de VME se realiza estableciendo el bit número 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 estableciendo solo el bit número 1 (valor 0x2), que se denomina PVI (Interrupciones Virtuales de 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 simulado de 16 bits (PUSHFD/POPFD de 32 bits continúa con un fallo GP). VIP provocará un fallo GP en la configuración del IF simulado, lo que indica al sistema operativo que procese las interrupciones pendientes. 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 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 sigue presente en los procesadores compatibles con 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 esto debe hacerse mediante la transición del procesador (físico) al modo raíz VMX y el lanzamiento de un procesador lógico (virtual) que se ejecuta en modo virtual 8086. [ 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 la BIOS heredada para el arranque. [ 16 ] [ 17 ]

AMD-V también puede realizar el modo virtual 8086 en invitados, pero también puede simplemente ejecutar el invitado en "modo real paginado" siguiendo estos pasos: se 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 fallos de página. [ 18 ]

Véase también

Notas

  1. Por ejemplo, si un programa escribe en una pantalla, 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 modificado. El monitor V86 puede interceptar las escrituras en la pantalla, mantener un registro del estado de la pantalla para cada programa y alternar 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 una sola pantalla real.
  2. Se menciona DOS porque fue especialmente la extensa biblioteca de programas DOS existentes lo que Intel tuvo 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 . Archivado del original el 18 de octubre de 2014. Recuperado el 27 de enero de 2014 .
  2. Gnomes, Lee; "Entre bastidores: 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 . Archivado del original el 6 de febrero de 2006. Consultado el 28 de diciembre de 2009 .
  4. Mike Wang (21 de junio de 2016). "Proceso de arranque de Grub2" . Archivado del original el 30 de noviembre de 2020. Recuperado el 10 de diciembre de 2020 .{{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  5. "Modo virtual 8086 - Wiki de OSDev" . wiki.osdev.org . Archivado del original el 24 de febrero de 2021. Consultado el 10 de diciembre de 2020 .
  6. 1 2 3 4 5 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 para 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ágs. 2-17 . 
  8. "Archivo de la lista de correo: Re: 2.6.14: ¿Ya no es necesario inspeccionar CR4 en el 486?" . Gossamer-threads.com. Archivado del original el 22-02-2014 . Recuperado el 20-02-2014 .
  9. 1 2 "Interrupciones virtuales del modo protegido de Pentium (PVI)" . Rcollins.org. Archivado del original el 4 de junio de 2013. Recuperado el 20 de febrero de 2014 .
  10. "Extensiones del modo virtual en el procesador Pentium" . Rcollins.org . Consultado el 20 de febrero de 2014 .
  11. Manual del desarrollador de software para 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 . Archivado del original el 9 de octubre de 2020. Consultado el 11 de octubre de 2020 . 
  12. Michal Necasek (12 de mayo de 2017). "VME roto en AMD Ryzen" . Museo OS/2 . Archivado del original el 25 de septiembre de 2018. Recuperado el 25 de septiembre de 2018 .
  13. "Guía de revisión para procesadores AMD Family 17h Models 00h-0Fh" (PDF) . AMD . Junio ​​de 2018.
  14. Manual del desarrollador de software para arquitecturas Intel 64 e IA-32, Volumen 3B: Guía de programación del sistema, Parte 2 (PDF) . Intel . Septiembre de 2009. pág. 29-1 . Archivado del original (PDF) el 5 de enero de 2010. Solo se permite una entrada de máquina virtual 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 de funcionamiento del procesador debe ser gestionada especialmente por el VMM. ; ver también CS 686: Tema especial: Intel EM64T y extensiones VT (Primavera de 2007) Archivado el 20/10/2014 en Wayback Machine , lección 24 cómo hacer esto desde Linux (no es que el código esté bastante desactualizado, por lo que podría no funcionar tal cual con los kernels actuales) se puede encontrar código más actualizado aquí . También tenga en cuenta que este código de ejemplo es más complicado que simplemente arrancar el procesador lógico en modo virtual 8086; su objetivo final es realizar algunas llamadas a la BIOS en modo real.
  15. "Lista de tecnologías de virtualización de Intel" . Ark.intel.com. Archivado del 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 añadió un modo de invitado sin restricciones en la microarquitectura Westmere y en las CPU Intel posteriores. Este modo 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 ejecutar VMEnter sin habilitar la paginación."" (PDF) . Archivado (PDF) del original el 21-02-2014 . Recuperado el 17-02-2014 .
  17. ""Si el control de ejecución de máquina virtual "invitado sin restricciones" es 1, el control de ejecución de máquina virtual "habilitar EPT" también debe ser 1."" (PDF) . Archivado (PDF) del original el 18-04-2013 . Recuperado el 17-02-2014 .
  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 . Archivado (PDF) del original el 30-11-2021 . Recuperado el 10-12-2021 . Para facilitar la virtualización del modo real, la instrucción VMRUN puede cargar legalmente un valor CR0 del invitado con PE = 0 pero PG = 1. Del mismo modo, la instrucción RSM puede volver 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 fallos de página interceptados. 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 apropiadas. El comportamiento de ejecutar una máquina virtual invitada en modo real paginado sin interceptar los fallos de página en el VMM no está definido.