En informática , un emulador es un hardware o software que permite que un sistema informático (llamado host ) se comporte como otro sistema informático (llamado guest ). Un emulador normalmente permite que el sistema host ejecute software o utilice dispositivos periféricos diseñados para el sistema guest. La emulación se refiere a la capacidad de un programa informático en un dispositivo electrónico de emular (o imitar) otro programa o dispositivo.
Muchas impresoras , por ejemplo, están diseñadas para emular impresoras HP LaserJet , ya que gran parte del software está escrito para impresoras HP. Si una impresora que no es de HP emula una impresora HP, cualquier software escrito para una impresora HP real también se ejecutará en la emulación de impresora que no es de HP y producirá una impresión equivalente. Desde al menos la década de 1990, muchos entusiastas y aficionados a los videojuegos han utilizado emuladores para jugar a juegos arcade clásicos de la década de 1980 utilizando el código de máquina y los datos originales de los juegos de la década de 1980, que son interpretados por un sistema de la era actual, y para emular consolas de videojuegos antiguas (consulte emulador de consola de videojuegos ).
Un emulador de hardware es un emulador que toma la forma de un dispositivo de hardware. Los ejemplos incluyen la tarjeta compatible con DOS instalada en algunas computadoras Macintosh de la década de 1990 , como Centris 610 o Performa 630 , que les permitía ejecutar programas de software de computadora personal (PC) y emuladores de hardware basados en matrices de puertas programables en campo . La tesis de Church-Turing implica que, teóricamente, cualquier entorno operativo puede emularse dentro de cualquier otro entorno, suponiendo que se ignoren las limitaciones de memoria. Sin embargo, en la práctica, puede ser bastante difícil, particularmente cuando el comportamiento exacto del sistema a emular no está documentado y debe deducirse mediante ingeniería inversa . Tampoco dice nada sobre las restricciones de tiempo; si el emulador no funciona tan rápido como lo hacía usando el hardware original, el software dentro de la emulación puede funcionar mucho más lentamente (posiblemente activando interrupciones del temporizador que alteran el comportamiento).
"¿Puede un Commodore 64 emular MS-DOS ?" Sí, es posible que un [Commodore] 64 emule un IBM PC [que utiliza MS-DOS], en el mismo sentido en que es posible sacar agua del lago Michigan con una cucharilla .
— Carta a Compute! y respuesta editorial, abril de 1988 [1]
La mayoría de los emuladores simplemente emulan una arquitectura de hardware: si se requiere el firmware o software del sistema operativo para el software deseado, también se debe proporcionar (y puede emularse). Entonces, tanto el sistema operativo como el software serán interpretados por el emulador, en lugar de ser ejecutados por el hardware nativo. Aparte de este intérprete para el lenguaje de la máquina binaria emulada , también se debe proporcionar otro hardware (como dispositivos de entrada o salida) en forma virtual; por ejemplo, si la escritura en una ubicación de memoria específica debe influir en lo que se muestra en la pantalla, entonces esto debería emularse. Si bien la emulación podría, si se lleva al extremo, llegar al nivel atómico, basando su salida en una simulación del circuito real de una fuente de energía virtual, esta sería una solución muy inusual. Los emuladores generalmente se detienen en una simulación de las especificaciones de hardware documentadas y la lógica digital. La emulación suficiente de algunas plataformas de hardware requiere una precisión extrema, hasta el nivel de ciclos de reloj individuales, características no documentadas, elementos analógicos impredecibles y errores de implementación. Este es particularmente el caso de los ordenadores domésticos clásicos como el Commodore 64 , cuyo software a menudo depende de trucos de programación de bajo nivel altamente sofisticados inventados por programadores de juegos y la " demoscene ".
En contraste, algunas otras plataformas han tenido muy poco uso de direccionamiento de hardware directo, como un emulador para la PlayStation 4. [2] En estos casos, una simple capa de compatibilidad puede ser suficiente. Esto traduce las llamadas del sistema para el sistema externo en llamadas del sistema para el sistema anfitrión, por ejemplo, la capa de compatibilidad de Linux utilizada en *BSD para ejecutar software nativo de Linux de código cerrado en FreeBSD y NetBSD . [3] Por ejemplo, mientras que el procesador gráfico de Nintendo 64 era completamente programable, la mayoría de los juegos usaban uno de los pocos programas prefabricados, que en su mayoría eran autónomos y se comunicaban con el juego a través de FIFO ; por lo tanto, muchos emuladores no emulan el procesador gráfico en absoluto, sino que simplemente interpretan los comandos recibidos de la CPU como lo haría el programa original. Los desarrolladores de software para sistemas integrados o consolas de videojuegos a menudo diseñan su software en emuladores especialmente precisos llamados simuladores antes de probarlo en el hardware real. Esto es para que el software pueda ser producido y probado antes de que el hardware final exista en grandes cantidades, de modo que pueda ser probado sin tomarse el tiempo de copiar el programa a depurar a bajo nivel y sin introducir los efectos secundarios de un depurador . En muchos casos, el simulador es producido realmente por la empresa que proporciona el hardware, lo que teóricamente aumenta su precisión. Los emuladores de coprocesadores matemáticos permiten que los programas compilados con instrucciones matemáticas se ejecuten en máquinas que no tienen el coprocesador instalado, pero el trabajo extra realizado por la CPU puede ralentizar el sistema. Si un coprocesador matemático no está instalado o presente en la CPU, cuando la CPU ejecuta cualquier instrucción del coprocesador realizará una interrupción determinada (coprocesador no disponible), llamando a las rutinas del emulador matemático. Cuando la instrucción se emula con éxito, el programa continúa ejecutándose.
La simulación lógica es el uso de un programa de computadora para simular el funcionamiento de un circuito digital como un procesador. [4] Esto se realiza después de que se haya diseñado un circuito digital en ecuaciones lógicas, pero antes de que el circuito se fabrique en hardware.
La simulación funcional es el uso de un programa informático para simular la ejecución de un segundo programa informático escrito en lenguaje ensamblador simbólico o lenguaje de compilación , en lugar de en código binario de máquina . Al utilizar un simulador funcional, los programadores pueden ejecutar y rastrear secciones seleccionadas del código fuente para buscar errores de programación (bugs), sin generar código binario. Esto es distinto de simular la ejecución de código binario, que es emulación de software. El primer simulador funcional fue escrito por Autonetics alrededor de 1960 [ cita requerida ] para probar programas en lenguaje ensamblador para su posterior ejecución en la computadora militar D-17B . Esto hizo posible que los programas de vuelo se escribieran, ejecutaran y probaran antes de que se hubiera construido el hardware de la computadora D-17B. Autonetics también programó un simulador funcional para probar programas de vuelo para su posterior ejecución en la computadora militar D-37C .
Los emuladores de consolas de videojuegos son programas que permiten que una computadora personal o una consola de videojuegos emule otra consola de videojuegos. Se utilizan con mayor frecuencia para jugar videojuegos antiguos de la década de 1980 a la década de 2000 en computadoras personales modernas y consolas de videojuegos más contemporáneas. También se utilizan para traducir juegos a otros idiomas, para modificar juegos existentes y en el proceso de desarrollo de demostraciones caseras y en la creación de nuevos juegos para sistemas más antiguos. Internet ha ayudado a la difusión de los emuladores de consolas, ya que la mayoría, si no todos, no estarían disponibles para la venta en puntos de venta minorista. Algunos ejemplos de emuladores de consola que se han lanzado en las últimas décadas son: RPCS3 , Dolphin , Cemu , PCSX2 , PPSSPP , ZSNES , Citra , ePSXe , Project64 , Visual Boy Advance , Nestopia y Yuzu .
Debido a su popularidad, los emuladores han sido suplantados por malware. La mayoría de estos emuladores son para consolas de videojuegos como Xbox 360, Xbox One, Nintendo 3DS, etc. Generalmente, estos emuladores hacen afirmaciones que actualmente son imposibles, como poder ejecutar juegos de Xbox One y Xbox 360 en un solo programa. [5]
A medida que las computadoras y las redes informáticas globales continuaron avanzando y los desarrolladores de emuladores se volvieron más hábiles en su trabajo, el tiempo entre el lanzamiento comercial de una consola y su emulación exitosa comenzó a reducirse. Las consolas de quinta generación , como Nintendo 64 , PlayStation y las portátiles de sexta generación , como Game Boy Advance , vieron un progreso significativo hacia la emulación durante su producción. Esto llevó a un esfuerzo por parte de los fabricantes de consolas para detener la emulación no oficial, pero los fracasos constantes como Sega v. Accolade 977 F.2d 1510 (9th Cir. 1992), Sony Computer Entertainment, Inc. v. Connectix Corporation 203 F.3d 596 (2000) y Sony Computer Entertainment America v. Bleem 214 F.3d 1022 (2000), [6] han tenido el efecto opuesto. Según todos los precedentes legales, la emulación es legal dentro de los Estados Unidos. Sin embargo, la distribución no autorizada de código protegido por derechos de autor sigue siendo ilegal, según los derechos de autor específicos del país y la ley internacional de derechos de autor según el Convenio de Berna . [7] [ se necesita una mejor fuente ] Según la ley de los Estados Unidos, obtener una copia del BIOS de la máquina original es legal según la sentencia Lewis Galoob Toys, Inc. v. Nintendo of America, Inc. , 964 F.2d 965 (9th Cir. 1992) como uso legítimo siempre que el usuario haya obtenido una copia de la máquina comprada legalmente. Sin embargo, para mitigar esto, varios emuladores para plataformas como Game Boy Advance son capaces de ejecutarse sin un archivo BIOS, utilizando una emulación de alto nivel para simular subrutinas BIOS con un pequeño costo en la precisión de la emulación. [ cita requerida ]
Los emuladores de terminal son programas de software que proporcionan a los ordenadores y dispositivos modernos acceso interactivo a aplicaciones que se ejecutan en sistemas operativos de ordenadores mainframe u otros sistemas host como HP-UX u OpenVMS . Los terminales como el IBM 3270 o el VT100 y muchos otros ya no se producen como dispositivos físicos. En su lugar, el software que se ejecuta en los sistemas operativos modernos simula un terminal "tonto" y es capaz de representar los elementos gráficos y de texto de la aplicación host, enviar pulsaciones de teclas y procesar comandos utilizando el protocolo de terminal adecuado. Algunas aplicaciones de emulación de terminal incluyen Attachmate Reflection , IBM Personal Communications y Micro Focus Rumba.
Otros tipos de emuladores incluyen:
La sección de este artículo denominada "Estructura y organización" necesita citas adicionales para su verificación . ( junio de 2008 ) |
Por lo general, un emulador se divide en módulos que corresponden aproximadamente a los subsistemas del ordenador emulado. Lo más frecuente es que un emulador esté compuesto por los siguientes módulos:
Los buses a menudo no se emulan, ya sea por razones de rendimiento o de simplicidad, y los periféricos virtuales se comunican directamente con la CPU o el subsistema de memoria.
Es posible reducir la emulación del subsistema de memoria a una simple matriz de elementos, cada uno de ellos con el tamaño de una palabra emulada; sin embargo, este modelo falla muy rápidamente en cuanto alguna ubicación en la memoria lógica del ordenador no coincide con la memoria física . Este es claramente el caso siempre que el hardware emulado permita una gestión avanzada de la memoria (en cuyo caso, la lógica de la MMU puede estar incorporada en el emulador de memoria, convertirse en un módulo propio o, a veces, integrarse en el simulador de la CPU). Sin embargo, incluso si el ordenador emulado no cuenta con una MMU, normalmente hay otros factores que rompen la equivalencia entre la memoria lógica y la física: muchas arquitecturas (si no la mayoría) ofrecen E/S mapeadas en memoria ; incluso aquellas que no lo tienen suelen tener un bloque de memoria lógica mapeado en la ROM , lo que significa que el módulo de matriz de memoria debe descartarse si se va a emular la naturaleza de sólo lectura de la ROM. Características como la conmutación de bancos o la segmentación también pueden complicar la emulación de memoria. Como resultado, la mayoría de los emuladores implementan al menos dos procedimientos para escribir y leer desde la memoria lógica, y es el deber de estos procedimientos mapear cada acceso a la ubicación correcta del objeto correcto.
En un sistema de direccionamiento de límite base donde la memoria desde la dirección 0 hasta la dirección ROMSIZE-1 es memoria de solo lectura, mientras que el resto es RAM, algo similar a los siguientes procedimientos sería típico:
void WriteMemory ( palabra Dirección , palabra Valor ) { palabra DirecciónReal ; DirecciónReal = Dirección + RegistroBase ; si (( DirecciónReal < RegistroLímite ) && ( DirecciónReal > TAMAÑOROM )) { Memoria [ DirecciónReal ] = Valor ; } de lo contrario { RaiseInterrupt ( INT_SEGFAULT ); } }
palabra ReadMemory ( palabra Dirección ) { palabra DirecciónReal ; DirecciónReal = Dirección + RegistroBase ; si ( DirecciónReal < RegistroLímite ) { devolver Memoria [ DirecciónReal ]; } de lo contrario { RaiseInterrupt ( INT_SEGFAULT ); devolver NULL ; } }
El simulador de CPU es a menudo la parte más complicada de un emulador. Muchos emuladores se escriben utilizando simuladores de CPU "preempaquetados" para concentrarse en la emulación buena y eficiente de una máquina específica. La forma más simple de un simulador de CPU es un intérprete , que es un programa de computadora que sigue el flujo de ejecución del código del programa emulado y, para cada instrucción de código de máquina encontrada, ejecuta operaciones en el procesador host que son semánticamente equivalentes a las instrucciones originales. Esto es posible asignando una variable a cada registro y bandera de la CPU simulada. La lógica de la CPU simulada puede entonces traducirse más o menos directamente a algoritmos de software, creando una reimplementación de software que básicamente refleja la implementación de hardware original.
El siguiente ejemplo ilustra cómo se puede realizar una simulación de CPU mediante un intérprete. En este caso, se comprueba si hay interrupciones antes de ejecutar cada instrucción, aunque este comportamiento es poco frecuente en los emuladores reales por razones de rendimiento (generalmente es más rápido utilizar una subrutina para realizar el trabajo de una interrupción).
void Execute ( void ) { if ( Interrupt != INT_NONE ) { SuperUser = TRUE ; WriteMemory ( ++ StackPointer , ProgramCounter ); ProgramCounter = InterruptPointer ; } switch ( ReadMemory ( ProgramCounter ++ )) { /* * El manejo de cada instrucción válida * va aquí... */ default : Interrupt = INT_ILLEGAL ; } }
Los intérpretes son muy populares como simuladores de ordenador, ya que son mucho más sencillos de implementar que las soluciones alternativas que requieren menos tiempo, y su velocidad es más que adecuada para emular ordenadores de hace más de una década en máquinas modernas. Sin embargo, la penalización de velocidad inherente a la interpretación puede ser un problema cuando se emulan ordenadores cuya velocidad de procesador está en el mismo orden de magnitud que la máquina anfitriona [ dudoso – discutir ] . Hasta no hace muchos años, la emulación en tales situaciones era considerada completamente impráctica por muchos [ dudoso – discutir ] .
Lo que permitió superar esta restricción fueron los avances en las técnicas de recompilación dinámica [ dudoso – discutir ] . La traducción simple a priori del código del programa emulado a código ejecutable en la arquitectura del host suele ser imposible por varias razones:
Varias formas de recompilación dinámica, incluida la popular técnica del compilador Just In Time (JIT) , intentan evitar estos problemas al esperar hasta que el flujo de control del procesador salte a una ubicación que contenga código sin traducir, y solo entonces ("justo a tiempo") traduce un bloque del código en código host que se puede ejecutar. El código traducido se mantiene en una caché de código [ dudoso – discutir ] , y el código original no se pierde ni se ve afectado; de esta manera, incluso los segmentos de datos pueden ser traducidos (sin sentido) por el recompilador, lo que no resulta más que una pérdida de tiempo de traducción. La velocidad puede no ser deseable ya que algunos juegos antiguos no fueron diseñados teniendo en cuenta la velocidad de las computadoras más rápidas. Un juego diseñado para una PC de 30 MHz con un temporizador de nivel de 300 segundos de juego solo puede darle al jugador 30 segundos en una PC de 300 MHz. Otros programas, como algunos programas DOS, pueden incluso no ejecutarse en computadoras más rápidas. En particular, al emular computadoras que eran "de caja cerrada", en las que los cambios en el núcleo del sistema no eran típicos, el software puede usar técnicas que dependen de características específicas de la computadora en la que se ejecuta (por ejemplo, la velocidad de su CPU) y, por lo tanto, el control preciso de la velocidad de emulación es importante para que dichas aplicaciones se emulen correctamente.
La mayoría de los emuladores no emulan, como se mencionó anteriormente, el bus principal del sistema ; por lo tanto, cada dispositivo de E/S se trata a menudo como un caso especial y no se proporciona una interfaz consistente para los periféricos virtuales. Esto puede resultar en una ventaja de rendimiento, ya que cada módulo de E/S se puede adaptar a las características del dispositivo emulado; sin embargo, los diseños basados en una API de E/S estándar y unificada pueden rivalizar con estos modelos más simples, si están bien pensados, y tienen la ventaja adicional de proporcionar "automáticamente" un servicio de complemento a través del cual se pueden usar dispositivos virtuales de terceros dentro del emulador. Una API de E/S unificada puede no reflejar necesariamente la estructura del bus de hardware real: el diseño del bus está limitado por varias restricciones eléctricas y una necesidad de gestión de concurrencia de hardware que en su mayoría se puede ignorar en una implementación de software.
Incluso en los emuladores que tratan cada dispositivo como un caso especial, suele haber una infraestructura básica común para:
La emulación es una estrategia en pos de la preservación digital y la lucha contra la obsolescencia . La emulación se centra en recrear un entorno informático original, lo que puede llevar mucho tiempo y ser difícil de lograr, pero es valioso debido a su capacidad de mantener una conexión más cercana con la autenticidad del objeto digital, el sistema operativo o incluso la plataforma de juegos. [8] La emulación aborda el entorno de hardware y software original del objeto digital y lo recrea en una máquina actual. [9] El emulador permite al usuario tener acceso a cualquier tipo de aplicación o sistema operativo en una plataforma actual , mientras que el software se ejecuta como lo hacía en su entorno original. [10] Jeffery Rothenberg, uno de los primeros defensores de la emulación como estrategia de preservación digital , afirma que "el enfoque ideal proporcionaría una única solución extensible y a largo plazo que se pueda diseñar de una vez por todas y aplicar de manera uniforme, automática y en sincronía organizada (por ejemplo, en cada ciclo de actualización) a todos los tipos de documentos y medios". [11] Además, afirma que esto no solo debería aplicarse a sistemas obsoletos, sino que también debería poder adaptarse a futuros sistemas desconocidos. [12] En términos prácticos, cuando una determinada aplicación se lanza en una nueva versión, en lugar de abordar problemas de compatibilidad y migración para cada objeto digital creado en la versión anterior de esa aplicación , se podría crear un emulador para la aplicación , permitiendo el acceso a todos dichos objetos digitales.
Debido a que utiliza principalmente formatos digitales, el arte de los nuevos medios depende en gran medida de la emulación como estrategia de conservación. Artistas como Cory Arcangel se especializan en resucitar tecnologías obsoletas en sus obras de arte y reconocen la importancia de un proceso descentralizado y desinstitucionalizado para la conservación de la cultura digital. En muchos casos, el objetivo de la emulación en el arte de los nuevos medios es preservar un medio digital para que pueda guardarse indefinidamente y reproducirse sin errores, de modo que no haya que depender de un hardware que envejece y se vuelve obsoleto. La paradoja es que la emulación y el emulador tienen que funcionar en las computadoras del futuro. [13]
Las técnicas de emulación se utilizan habitualmente durante el diseño y desarrollo de nuevos sistemas. Facilitan el proceso de desarrollo al proporcionar la capacidad de detectar, recrear y reparar fallas en el diseño incluso antes de que el sistema esté realmente construido. [14] Es particularmente útil en el diseño de sistemas multinúcleo , donde los errores de concurrencia pueden ser muy difíciles de detectar y corregir sin el entorno controlado que proporciona el hardware virtual. [15] Esto también permite que el desarrollo del software se realice antes de que el hardware esté listo, [16] lo que ayuda a validar las decisiones de diseño y brinda un poco más de control.
La palabra "emulador" fue acuñada en 1963 en IBM [17] durante el desarrollo de la línea de productos NPL ( IBM System/360 ), utilizando una "nueva combinación de software , microcódigo y hardware ". [18] Descubrieron que la simulación utilizando instrucciones adicionales implementadas en microcódigo y hardware, en lugar de simulación de software utilizando solo instrucciones estándar, para ejecutar programas escritos para computadoras IBM anteriores aumentó drásticamente la velocidad de simulación. Anteriormente, IBM proporcionó simuladores para, por ejemplo, el 650 en el 705. [19] Además de los simuladores, IBM tenía características de compatibilidad en el 709 y 7090 , [20] para lo cual proporcionó a la computadora IBM 709 un programa para ejecutar programas heredados escritos para el IBM 704 en el 709 y más tarde en el IBM 7090. Este programa utilizó las instrucciones agregadas por la característica de compatibilidad [21] para atrapar instrucciones que requerían un manejo especial; Todas las demás instrucciones 704 se ejecutaron de la misma manera en un 7090. La función de compatibilidad en el 1410 [22] solo requirió configurar un interruptor de palanca de consola, no un programa de soporte.
En 1963, cuando se utilizó por primera vez el microcódigo para acelerar este proceso de simulación, los ingenieros de IBM acuñaron el término "emulador" para describir el concepto. En la década de 2000, se ha vuelto común utilizar la palabra "emular" en el contexto del software. Sin embargo, antes de 1980, "emulación" se refería solo a la emulación con asistencia de hardware o microcódigo, mientras que "simulación" se refería a la emulación pura de software. [23] Por ejemplo, un ordenador especialmente construido para ejecutar programas diseñados para otra arquitectura es un emulador. Por el contrario, un simulador podría ser un programa que se ejecuta en un PC, de modo que se puedan simular en él viejos juegos de Atari. Los puristas siguen insistiendo en esta distinción, pero actualmente el término "emulación" a menudo significa la imitación completa de una máquina ejecutando código binario, mientras que "simulación" a menudo se refiere a la simulación por ordenador , donde se utiliza un programa de ordenador para simular un modelo abstracto. La simulación por computadora se utiliza en prácticamente todos los dominios científicos y de ingeniería, y la informática no es una excepción, con varios proyectos que simulan modelos abstractos de sistemas informáticos, como la simulación de redes , que tanto práctica como semánticamente difiere de la emulación de redes. [24]
La virtualización de hardware es la virtualización de computadoras como plataformas de hardware completas, ciertas abstracciones lógicas de sus componentes o solo la funcionalidad requerida para ejecutar varios sistemas operativos . La virtualización oculta las características físicas de una plataforma informática a los usuarios, presentando en su lugar una plataforma informática abstracta. [25] [26] En sus orígenes, el software que controlaba la virtualización se llamaba "programa de control", pero con el tiempo se prefirieron los términos " hipervisor " o "monitor de máquina virtual". [27] Cada hipervisor puede administrar o ejecutar múltiples máquinas virtuales .
{{cite book}}
: CS1 maint: others (link)