Un simulador de conjunto de instrucciones ( ISS , por sus siglas en inglés) es un modelo de simulación , generalmente codificado en un lenguaje de programación de alto nivel , que imita el comportamiento de una computadora central o un microprocesador "leyendo" instrucciones y manteniendo variables internas que representan los registros del procesador .
La simulación de instrucción es una metodología empleada por una de varias razones posibles:
- Simular la arquitectura del conjunto de instrucciones (ISA) de un futuro procesador permite que el desarrollo y las pruebas de software avancen sin tener que esperar a que finalice el desarrollo y la producción del hardware. Esto se conoce comúnmente como "desplazamiento a la izquierda" o "soporte pre-silicio" en el campo del desarrollo de hardware. Un simulador de sistema completo o plataforma virtual para el futuro hardware suele incluir uno o más simuladores de conjunto de instrucciones.
- Para simular el código máquina de otro dispositivo de hardware o de un ordenador completo para garantizar la compatibilidad con versiones anteriores .
- Por ejemplo, el IBM 1401 se simuló en el posterior IBM/360 mediante el uso de emulación de microcódigo .
- Para supervisar y ejecutar las instrucciones del código máquina (pero tratadas como un flujo de entrada) en el mismo hardware con fines de prueba y depuración, por ejemplo, con protección de memoria (que protege contra desbordamientos de búfer accidentales o deliberados ).
- Para mejorar el rendimiento de velocidad —en comparación con un simulador más lento y preciso a nivel de ciclo— de simulaciones que involucran un núcleo de procesador donde el procesador en sí no es uno de los elementos que se verifican; en el diseño de lenguajes de descripción de hardware usando Verilog donde la simulación con herramientas como ISS se puede ejecutar más rápido mediante " PLI " (que no debe confundirse con PL/1 , que es un lenguaje de programación ).
Implementación
Los simuladores de conjuntos de instrucciones se pueden implementar utilizando tres técnicas principales:
- Interpretación, donde cada instrucción es ejecutada directamente por el ISS.
- La compilación justo a tiempo (JIT) consiste en traducir primero el código que se va a ejecutar al conjunto de instrucciones del ordenador anfitrión. Esto suele ser unas diez veces más rápido que un intérprete bien optimizado.
- La virtualización, donde se utilizan extensiones de procesador para máquinas virtuales para ejecutar instrucciones en el ISS, solo funciona para simulaciones con el mismo conjunto de instrucciones, como ejecutar simuladores x86 en hosts x86 o simuladores ARM en hosts ARM.
Un ISS suele incluir (o ser en sí mismo) un depurador para que un ingeniero de software o programador pueda depurar el programa antes de obtener el hardware de destino. GDB es un depurador que incluye un ISS integrado. En ocasiones, se integra con circuitos periféricos simulados, como temporizadores , interrupciones , puertos serie , puertos de E/S generales , etc., para imitar el comportamiento de un microcontrolador .
La técnica básica de simulación de instrucciones es la misma independientemente del propósito: primero se ejecuta el programa de monitorización pasando el nombre del programa objetivo como parámetro de entrada adicional.
El programa objetivo se carga en la memoria, pero el control nunca se transfiere al código. En su lugar, se calcula el punto de entrada dentro del programa cargado y se establece una palabra de estado de programa (PSW) pseudo en esta ubicación. La palabra de estado de programa (PSW) se compone de un registro de estado y un contador de programa , que indica la siguiente instrucción a ejecutar. [ 1 ] Por lo tanto, es específicamente el contador de programa el que se asigna a esta ubicación. Un conjunto de registros pseudo se configuran con el contenido que tendrían si el programa hubiera recibido el control directamente.
Puede ser necesario modificar algunos de estos parámetros para que apunten a otros "bloques de control" ficticios, dependiendo del hardware y del sistema operativo . También puede ser necesario restablecer la lista de parámetros original para eliminar el parámetro del nombre del programa que se agregó previamente.
Posteriormente, la ejecución procede de la siguiente manera:
- Determinar la longitud de la instrucción en la ubicación pseudo PSW (inicialmente la primera instrucción en el programa objetivo). Si el desplazamiento de esta instrucción dentro del programa coincide con un conjunto de puntos de "pausa" dados previamente, establecer el motivo de la "pausa" y pasar al paso 7.
- "Recupera" la instrucción de su ubicación original (si es necesario) y cárgala en la memoria del monitor. Si la función "trace" está disponible y activada, guarda el nombre del programa, el desplazamiento de la instrucción y cualquier otro valor.
- Según el tipo de instrucción, realice comprobaciones previas a la ejecución y ejecute. Si la instrucción no puede continuar por algún motivo (instrucción no válida, modo incorrecto, etc.), vaya al paso 7. Si la instrucción va a modificar la memoria, compruebe que el destino de memoria existe (para este hilo ) y que tiene un tamaño suficiente. Si OK, cargue los pseudoregistros apropiados en los registros reales temporales, realice el movimiento equivalente con los registros reales, guarde la dirección y la longitud del almacenamiento alterado si el rastreo está "activado" y vaya a 4. Si la instrucción es una operación "de registro a registro", cargue los pseudoregistros en los registros reales del monitor, realice la operación, almacene de nuevo en los pseudoregistros respectivos, vaya a 4. Si la instrucción es una bifurcación condicional, determine si se cumple la condición: si no, vaya a 4, si la condición SE cumple, calcule la bifurcación a la dirección, determine si es válida (si no, establezca el error = " Bifurcación salvaje " y vaya a 7). Si OK, vaya a 5. Si la instrucción es una llamada al sistema operativo , haga la llamada real desde el programa de monitoreo "falsificando" direcciones para devolver el control al programa de monitoreo y luego restablezca los pseudoregistros para reflejar la llamada; vaya a 4.
- Sume la longitud de la instrucción al valor actual de Pseudo PSW.
- Almacenar la siguiente dirección en Pseudo PSW.
- Ve al 1.
- Detengan la ejecución.
Para fines de prueba y depuración, el programa de monitoreo puede proporcionar herramientas para visualizar y modificar registros, memoria y ubicación de reinicio, así como obtener un minivolcado de memoria o imprimir nombres simbólicos de programas con los valores de datos actuales. Podría permitir nuevas ubicaciones de "pausa" condicionales, eliminar pausas no deseadas, etc.
La simulación de instrucciones permite detectar errores ANTES de la ejecución, lo que significa que las condiciones se mantienen intactas y no se ven afectadas por el error. Un buen ejemplo del entorno IBM S/360 es la siguiente secuencia de instrucciones, que puede dificultar la depuración sin un monitor de simulación de instrucciones.
LM R14,R12,12(R13) donde r13 apunta incorrectamente a una cadena de X"00"s BR R14 provoca que PSW contenga X"0000002" con la comprobación del programa "Excepción de operación". * Todos los registros en caso de error contienen valores nulos.
Consecuencias
Arriba
El número de instrucciones para realizar el bucle básico anterior (obtener/ejecutar/calcular nueva dirección) depende del hardware, pero podría lograrse en la gama de máquinas IBM S/360 /370/390/ES9000 en alrededor de 12 o 13 instrucciones para muchos tipos de instrucciones. La comprobación de ubicaciones de memoria válidas o de pausas condicionales aumenta considerablemente la sobrecarga, pero las técnicas de optimización pueden reducirla a niveles aceptables. Para fines de prueba, esto suele ser bastante aceptable, ya que se proporcionan potentes capacidades de depuración que incluyen paso de instrucción , rastreo y salto deliberado a la rutina de prueba de errores (cuando no hay un error real). Además, se puede utilizar un rastreo completo de instrucciones para probar la cobertura de código real (ejecutado) .
Beneficios adicionales
En ocasiones, monitorizar la ejecución de un programa objetivo puede ayudar a detectar errores aleatorios que aparecen (o desaparecen) durante la monitorización, pero no durante la ejecución real. Esto puede ocurrir cuando el programa objetivo se carga en una ubicación distinta a la habitual debido a la presencia física del programa de monitorización en el mismo espacio de direcciones.
Si el programa objetivo obtiene el valor de una ubicación aleatoria en la memoria (que normalmente no le pertenece), este valor podría ser nulo (X"00") en casi cualquier situación normal, y el programa funciona correctamente. Si el programa de monitorización cambia el punto de carga, podría obtener, por ejemplo, X"FF", y la lógica generaría resultados diferentes durante una operación de comparación. De forma similar, si el programa de monitorización ahora ocupa el espacio de donde se obtiene el valor, podrían producirse resultados parecidos.
Errores de reentrada: el uso accidental de variables estáticas en lugar de memoria de subprocesos "dinámica" puede causar problemas de reentrada en muchas situaciones. El uso de un programa de monitorización puede detectarlos incluso sin una clave de protección de almacenamiento .
Operaciones ilegales: algunos sistemas operativos (o hardware) requieren que el programa de aplicación esté en el "modo" correcto para ciertas llamadas al sistema operativo. La simulación de instrucciones puede detectar estas condiciones antes de la ejecución.
Mediante el análisis de puntos críticos y el conteo de instrucciones ejecutadas durante la simulación (que coincidirá con el número de instrucciones ejecutadas en el procesador real o en ejecución no supervisada), el simulador puede proporcionar una medida del rendimiento relativo entre diferentes versiones del algoritmo y también utilizarse para detectar puntos críticos donde el programador puede enfocar la optimización . En este sentido, puede considerarse una forma de análisis de rendimiento, ya que no es fácil obtener estas estadísticas durante la ejecución normal, especialmente en el caso de programas en lenguajes de alto nivel, que, por su naturaleza, ocultan la cantidad de instrucciones de código máquina.
Fines educativos
Algunos de estos simuladores de software siguen utilizándose como herramientas para la enseñanza del lenguaje ensamblador y la arquitectura del conjunto de instrucciones, y algunos están diseñados específicamente utilizando múltiples capas de simulación y simulación de ISA a ISA, con la capacidad incluso de diseñar ISA y simularlas. [ 2 ]
Crítica
En el primer volumen de El arte de la programación informática , Donald Knuth escribió: «En opinión del autor, se ha dedicado demasiado tiempo de los programadores a escribir simuladores [de lenguaje máquina] y se ha desperdiciado demasiado tiempo de computadora al usarlos». [ 3 ] Sin embargo, en la siguiente sección, el autor da ejemplos de cómo dichos simuladores son útiles como rutinas de rastreo o monitoreo para fines de depuración.
Ejemplo
Salida típica de traza de la simulación mediante el programa de monitorización utilizado para pruebas y depuración:
Instrucción de desplazamiento del programa Registro/almacenamiento desensamblado (después de la ejecución) TEST001 000000 X'05C0' BALR R12,0 R12=002CE00A 000002 X'47F0C00E' BC 15,X'00C'(R12) 00000E X'98ECD00C' STM R14,R12,X'00C'(R13) X'002E0008' ==> X'00004CE,002CE008,..etc....' 000012 X'45E0C122' BAL R14,X'122'(R12) R14=002C0016 SUB1 000124 X'50E0C28A' ST R14,X'28A'(R12) X'002CE294' ==> X'002C0016' etc...
Véase también
Simuladores
- ARMulator : simuladores de CPU para la arquitectura ARM , proporcionados por la propia ARM como referencia y herramienta de desarrollo de software.
- Simulador de arquitectura de computadoras
- CPU Sim : programa basado en Java que permite al usuario diseñar y crear un conjunto de instrucciones y luego ejecutar programas de instrucciones a partir de dicho conjunto mediante simulación.
- Gpsim - Simulador de microcontrolador PIC
- INTERP/8 : Intel 8008 e INTERP/80 : para Intel 8080.
- Computadora del hombrecito : un ejemplo sencillo de simulador de conjunto de instrucciones basado en Java.
- MikroSim : simulador de CPU que permite la definición del conjunto de instrucciones a nivel de microcódigo para uso educativo.
- VIP - Simulador de CPU, que permite la definición del conjunto de instrucciones a nivel de microcódigo para uso educativo.
- OVPsim : simulador de CPU y de sistema completo, que proporciona más de 170 modelos de procesadores con precisión de instrucciones. Permite definir conjuntos de instrucciones por el usuario.
- Saturn+ , una versión mejorada de la CPU Saturn y un simulador de sistema para ejecutar RPL en calculadoras gráficas HP más recientes con procesadores basados en ARM fabricados entre 2003 y 2015.
- Simics : plataforma de simulación de CPU y sistemas completos para la creación de modelos completos de hardware moderno complejo.
- Simh : simulación de más de 50 ordenadores históricos, incluyendo sistemas PDP-11 completos con E/S, en desarrollo desde la década de 1960.
- Simulador CPU-OS : simuladores educativos integrados de CPU tipo RISC y sistema operativo multihilo.
Otro
Referencias
- ↑ Hayes, John P. (1978). Arquitectura y organización de computadoras . McGraw-Hill International Book Company. pág. 51. ISBN 0-07-027363-4.
- ↑ Almasri, I., Abandah, G., Shhadeh, A., Shahrour, A. (2011, diciembre). Simulador ISA universal con implementación de procesador blando en FPGA. En Ingeniería eléctrica aplicada y tecnologías informáticas (AEECT), Conferencia IEEE de Jordania de 2011 (págs. 1–6). IEEE.
- ↑ “El arte de la programación informática”, Donald Knuth , 1997, Volumen 1, 3.ª edición, Página 202.
Enlaces externos
- "Mikrocodesimulator MikroSim 2010" . 0/1-SimWare . Consultado el 6 de diciembre de 2010 .
- "Simulación y seguimiento a nivel de instrucción"
- Imperas, archivado el 1 de diciembre de 2019 en Wayback Machine, proporciona un ISS para más de 170 variantes de procesadores para ARM, ARMv8, MIPS, MIPS64, PowerPC, RISC-V, ARC, Nios-II, MicroBlaze ISA.
- Software de simulación
- Depuradores
- Herramientas de prueba de software