Un simulador de conjunto de instrucciones (ISS) es un modelo de simulación , generalmente codificado en un lenguaje de programación de alto nivel , que imita el comportamiento de un mainframe o microprocesador al "leer" instrucciones y mantener variables internas que representan los registros del procesador .
La simulación de instrucciones es una metodología empleada por una de varias razones posibles:
- Para simular el código de máquina de otro dispositivo de hardware o computadora completa para compatibilidad ascendente , un simulador de sistema completo generalmente incluye un simulador de conjunto de instrucciones.
- Por ejemplo, el IBM 1401 se simuló en el IBM / 360 posterior mediante el uso de emulación de microcódigo .
- Para monitorear y ejecutar las instrucciones del código de máquina (pero tratadas como un flujo de entrada) en el mismo hardware para propósitos de prueba y depuración, por ejemplo, con protección de memoria (que protege contra desbordamiento accidental o deliberado del búfer ).
- Para mejorar el rendimiento de la velocidad, en comparación con un simulador de ciclo más lento con precisión, de las simulaciones que involucran un núcleo de procesador donde el procesador en sí no es uno de los elementos que se verifican; en diseño de lenguaje de descripción de hardware usando Verilog donde la simulación con herramientas como ISS [ cita requerida ] se puede ejecutar más rápido por medio de " PLI " (no confundir con PL / 1 , que es un lenguaje de programación ).
Implementación
Un ISS a menudo se proporciona con (o es él mismo) un depurador para que un ingeniero / programador de software depure el programa antes de obtener el hardware de destino. GDB es un depurador que tiene ISS compilado. A veces 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 ejecute el programa de monitoreo pasando el nombre del programa de destino como un parámetro de entrada adicional.
Luego, el programa de destino se carga en la memoria, pero el control nunca se pasa al código. En su lugar, se calcula el punto de entrada dentro del programa cargado y se establece una palabra de estado de pseudoprograma (PSW) en esta ubicación. Un conjunto de pseudo registros se establece en lo que habrían contenido si el programa hubiera recibido el control directamente.
Puede ser necesario modificar algunos de estos para que apunten a otros pseudo "bloques de control" según el hardware y el sistema operativo. También puede ser necesario restablecer la lista de parámetros original para "eliminar" el parámetro de nombre de programa agregado anteriormente.
A partir de entonces, la ejecución procede de la siguiente manera:
- Determine la longitud de la instrucción en la ubicación pseudo PSW (inicialmente la primera instrucción en el programa de destino). Si el desplazamiento de esta instrucción dentro del programa coincide con un conjunto de puntos de "pausa" dados previamente, establezca el motivo de "Pausa", vaya a 7.
- "Obtenga" la instrucción de su ubicación original (si es necesario) en la memoria del monitor. Si "trace" está disponible y "on", almacene el nombre del programa, el desplazamiento de la instrucción y cualquier otro valor.
- Dependiendo del tipo de instrucción, realice comprobaciones previas a la ejecución y ejecútelas. Si la instrucción no puede continuar por alguna razón (instrucción no válida, modo incorrecto, etc.), vaya al 7. Si la instrucción está a punto de alterar la memoria, verifique que el destino de la memoria exista (para este hilo ) y sea lo suficientemente grande. Si está bien, cargue los pseudo registros apropiados en los registros reales temporales, realice un movimiento equivalente con los registros reales, guarde la dirección y la longitud del almacenamiento alterado si la traza está "activada" y vaya a 4. Si la instrucción es un "registro a registro" operación, cargar pseudo registros en monitores registros reales, realizar la operación, almacenar de nuevo en los respectivos pseudo registros, ir a 4. Si la instrucción es una rama condicional, determinar si se cumple la condición: si no, ir a 4, si la condición ES satisfecha, Calcule la rama a la dirección, determine si es válida (si no es así, establezca error = " Rama salvaje ") y vaya a 7. Si está bien, vaya a 5. Si la instrucción es una llamada al sistema operativo, haga una llamada real desde el programa de monitoreo "simulando" direcciones para devolver el control al programa monitor y luego restablecer los pseudo registros para reflejar la llamada; vaya a 4.
- Agregue la longitud de la instrucción al valor actual de Pseudo PSW.
- Almacene la siguiente dirección en Pseudo PSW.
- Vaya a 1.
- Detener la ejecución.
Para propósitos de prueba y depuración, el programa de monitoreo puede proporcionar facilidades para ver y modificar registros, memoria y ubicación de reinicio u obtener un volcado de mini núcleo o imprimir nombres de programas simbólicos con valores de datos actuales. Podría permitir nuevas ubicaciones de "pausas" condicionales, eliminar pausas no deseadas y cosas por el estilo.
La simulación de instrucciones brinda la oportunidad de detectar errores ANTES de la ejecución, lo que significa que las condiciones siguen siendo exactamente como eran y no las destruye el error. Un muy buen ejemplo del mundo IBM S / 360 es la siguiente secuencia de instrucciones que puede causar dificultades en la depuración sin un monitor de simulación de instrucciones.
LM R14, R12,12 (R13) donde r13 apunta incorrectamente a la cadena de X "00" s BR R14 hace que PSW contenga X "0000002" con verificación de programa "Excepción de operación"* todos los registros de error contienen nulos.
Consecuencias
Gastos generales
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. Verificar ubicaciones de memoria válidas o "pausas" condicionales aumenta considerablemente la sobrecarga, pero las técnicas de optimización pueden reducir esto a niveles aceptables. Para propósitos de prueba, esto normalmente es bastante aceptable ya que se proporcionan poderosas capacidades de depuración que incluyen pasos de instrucción , rastreo y salto deliberado a la rutina de error de prueba (cuando no hay error real). Además, se puede utilizar un seguimiento de instrucciones completo para probar la cobertura del código real (ejecutado) .
Beneficios añadidos
Ocasionalmente, monitorear la ejecución de un programa objetivo puede ayudar a resaltar errores aleatorios que aparecen (o algunas veces desaparecen) durante el monitoreo pero no en la ejecución real. Esto puede suceder cuando el programa de destino se carga en una ubicación diferente a la normal debido a la presencia física del programa de monitoreo en el mismo espacio de direcciones.
Si el programa de destino toma el valor de una ubicación "aleatoria" en la memoria (una que normalmente no es de su propiedad), puede ser, por ejemplo, nulos (X "00") en casi todas las situaciones normales y el programa funciona correctamente. . Si el programa de monitoreo cambia el punto de carga, puede recoger, digamos, X "FF" y la lógica causaría resultados diferentes durante una operación de comparación. Alternativamente, si el programa de monitoreo ocupa ahora el espacio donde se "toma" el valor, pueden ocurrir resultados similares.
Errores de reentrada: el uso accidental de variables estáticas en lugar de la memoria de subprocesos "dinámica" puede causar problemas de reentrada en muchas situaciones. El uso de un programa de monitoreo 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.
Análisis de puntos calientes y uso de instrucciones contando las instrucciones ejecutadas durante la simulación (que coincidirá con el número ejecutado en el procesador real o la ejecución no supervisada), el simulador puede proporcionar una medida de rendimiento relativo entre diferentes versiones del algoritmo y también ser utilizado para detectar "puntos calientes" donde la optimización puede ser dirigida por el programador. En esta función, se puede considerar una forma de análisis de rendimiento, ya que no es fácil obtener estas estadísticas en una ejecución normal y esto es especialmente cierto para los programas de lenguaje de alto nivel que efectivamente 'disfrazan' el alcance de las instrucciones de código de máquina por su naturaleza.
Propósitos educativos
Algunos de estos simuladores de software quedan por utilizarse como herramientas para la enseñanza del lenguaje ensamblador y la arquitectura de conjuntos 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 de incluso diseñar ISA y simularlos. [1]
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 a los programadores a escribir tales simuladores [de lenguaje de máquina] y se ha desperdiciado demasiado tiempo informático usándolos . " [2] En la siguiente sección, sin embargo, el autor da ejemplos de cómo estos simuladores son útiles como rutinas de seguimiento o monitoreo para propósitos de depuración.
Ejemplo
Salida de seguimiento típica de la simulación mediante el programa de monitoreo utilizado para pruebas y depuración:
Programa de compensación de instrucciones montado-Dis registro / almacenamiento (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 = 002C0016SUB1 000124 X'50E0C28A 'ST R14, X'28A' (R12) X'002CE294 '==> X'002C0016'etc ...
Ver también
Simuladores
- ARMulator : simuladores de CPU para la arquitectura ARM , proporcionados por ARM como vehículo de desarrollo de software y de referencia.
- Simulador de arquitectura informática
- CPU Sim : programa basado en Java que permite al usuario diseñar y crear un conjunto de instrucciones y luego ejecutar programas de instrucciones desde el conjunto a través de la simulación.
- Gpsim - simulador de microcontrolador PIC
- INTERP / 8 : Intel 8008 e INTERP / 80 para Intel 8080.
- Little man computer : ejemplo sencillo basado en Java de un simulador de conjunto de instrucciones
- MikroSim : simulador de CPU, que permite la definición del conjunto de instrucciones a nivel de microcódigo para uso educativo
- OVPsim : CPU y simulador de sistema completo, que proporciona más de 170 modelos de procesadores con instrucciones precisas. Permite conjuntos de instrucciones definidos por el usuario.
- Simics : CPU y marco de simulador de sistema completo, que crea modelos completos de hardware moderno complejo.
- Simulador de CPU-OS : simuladores educativos integrados de CPU de tipo RISC y sistema operativo multiproceso.
Otro
- Instrumentación (programación informática)
- Metaprogramación
Referencias
- ^ Almasri, I., Abandah, G., Shhadeh, A. y Shahrour, A. (2011, diciembre). Simulador ISA universal con implementación FPGA de procesador soft. En Ingeniería Eléctrica Aplicada y Tecnologías de Computación (AEECT), 2011 IEEE Jordan Conference on (pp. 1-6). IEEE.
- ^ "El arte de la programación informática", Donald Knuth , 1997, volumen 1, tercera 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 proporciona un ISS para más de 170 variantes de procesador para ARM, ARMv8, MIPS, MIPS64, PowerPC, RISC-V, ARC, Nios-II, MicroBlaze ISA.