Введение
Инструкционный набор симулятора (ISS) — это модель, обычно реализованная на языке программирования высокого уровня, которая имитирует поведение мэйнфрейма или микропроцессора, "считывая" инструкции и поддерживая внутренние переменные, представляющие регистры процессора. Симуляция инструкций — это методология, применяемая по одной из нескольких причин: для моделирования архитектуры набора команд (ISA) будущего процессора, чтобы обеспечить возможность разработки и тестирования программного обеспечения без ожидания завершения разработки и производства аппаратного обеспечения. Это часто называют "смещением влево" или "поддержкой до производства кремния" в области разработки аппаратного обеспечения. Полный системный симулятор или виртуальная платформа для будущего оборудования обычно включает в себя один или несколько симуляторов набора команд. Для моделирования машинного кода другого аппаратного устройства или целого компьютера с целью обеспечения обратной совместимости. Например, IBM 1401 был эмулирован на более поздней IBM/360 посредством эмуляции микрокода. Для мониторинга и выполнения инструкций машинного кода (рассматриваемых как входной поток) на том же оборудовании в целях тестирования и отладки, например, с использованием защиты памяти (которая предотвращает случайное или намеренное переполнение буфера). Для повышения производительности симуляций, включающих процессорное ядро, где сам процессор не является объектом верификации, по сравнению с более медленным, точно синхронизированным симулятором; в разработке языков описания аппаратуры с использованием Verilog, где симуляция с использованием инструментов, таких как ISS, может выполняться быстрее посредством "PLI" (не путать с PL/1, являющимся языком программирования).
An instruction set simulator (ISS) is a simulation model, usually coded in a high level programming language, which mimics the behavior of a mainframe or microprocessor by "reading" instructions and maintaining internal variables which represent the processor's registers. Instruction simulation is a methodology employed for one of several possible reasons:
To simulate the instruction set architecture (ISA) of a future processor to allow software development and test to proceed without waiting for the development and production of the hardware to finish. This is often known as "shift left" or "pre silicon support" in the hardware development field. A full system simulator or virtual platform for the future hardware typically includes one or more instruction set simulators. To simulate the machine code of another hardware device or entire computer for upward compatibility. For example, the IBM 1401 was simulated on the later IBM/360 through use of microcode emulation. To monitor and execute the machine code instructions (but treated as an input stream) on the same hardware for test and debugging purposes, e. g. with memory protection (which protects against accidental or deliberate buffer overflow). To improve the speed performance—compared to a slower cycle accurate simulator—of simulations involving a processor core where the processor itself is not one of the elements being verified; in hardware description language design using Verilog where simulation with tools like ISS can be run faster by means of "PLI" (not to be confused with PL/1, which is a programming language).
Навес
Количество инструкций, необходимых для выполнения вышеуказанного базового "цикла" (выборка/выполнение/вычисление нового адреса), зависит от аппаратного обеспечения, но на машинах серии IBM S/360/370/390/ES9000 это может быть выполнено примерно за 12-13 инструкций для многих типов инструкций. Проверка допустимости адресов памяти или условные "остановки" значительно увеличивают накладные расходы, однако методы оптимизации позволяют снизить их до приемлемого уровня. Для целей тестирования это обычно вполне допустимо, поскольку предусмотрены мощные средства отладки, включая пошаговое выполнение инструкций, трассировку и преднамеренный переход к подпрограмме обработки ошибок (даже при отсутствии реальной ошибки). Кроме того, полную трассировку инструкций можно использовать для проверки фактического охвата кода (выполненного кода).
Дополнительные преимущества
Иногда мониторинг выполнения целевой программы может помочь выявить случайные ошибки, которые проявляются (или иногда исчезают) во время мониторинга, но не в реальном исполнении. Это может произойти, когда целевая программа загружается по другому адресу, чем обычно, из-за физического присутствия программы мониторинга в том же адресном пространстве. Если целевая программа считывает значение из "случайного" участка памяти (который обычно ей не принадлежит), это может быть, например, нули (X"00") в большинстве случаев, и программа работает корректно. Если программа мониторинга смещает точку загрузки, она может считать, например, X"FF", что приведет к другим результатам при операции сравнения. Альтернативно, если программа мониторинга занимает область памяти, из которой считывается значение, могут возникнуть аналогичные результаты. Ошибки повторного входа: случайное использование статических переменных вместо "динамической" памяти потока может вызывать проблемы повторного входа во многих ситуациях. Использование программы мониторинга может обнаружить их даже без ключа защиты памяти. Незаконные операции: некоторые операционные системы (или аппаратное обеспечение) требуют, чтобы приложение находилось в правильном "режиме" для определенных вызовов операционной системы. Эмуляция инструкций может обнаружить эти условия до выполнения. Анализ "горячих точек" и использование инструкций путем подсчета выполненных инструкций во время эмуляции (что соответствует количеству, выполненному на реальном процессоре или при неконтролируемом исполнении) позволяет симулятору предоставлять как оценку относительной производительности различных версий алгоритма, так и выявлять "горячие точки", для оптимизации которых программист может направить свои усилия. В этом контексте это можно рассматривать как форму анализа производительности, поскольку получить такую статистику при нормальном исполнении непросто, особенно для программ на языках высокого уровня, которые по своей природе "маскируют" объем машинного кода.
Образовательные цели
Некоторые из этих программных эмуляторов до сих пор используются как инструменты для обучения языку ассемблера и архитектуре наборов команд, при этом некоторые из них специально разработаны с использованием многоуровневого моделирования и эмуляции «от ISA к ISA», а также обладают возможностью проектирования собственных ISA и их симуляции.
Критика
В первом томе книги "Искусство компьютерного программирования" Дональд Кнут писал: "По мнению автора, программисты потратили непомерно много времени на написание подобных [машинных] симуляторов, и непомерно много машинного времени было потрачено впустую на их использование". Однако в следующем разделе автор приводит примеры того, как такие симуляторы могут быть полезны в качестве трассировочных или мониторинговых подпрограмм для целей отладки.