Симуляторы компьютерных систем: виды и уровни детализации

Технические статьи

Симуляторы компьютерных систем: виды и уровни детализации

8 июня, 2020

Последние десять лет я работаю с симуляторами – программными моделями различных устройств, от телефонов до серверов. Наиболее часто симуляция применяется в сфере производства чипов и вообще оборудования, разработки ПО и исследований в самых различных областях, например, в телекоммуникациях. Симуляция встраиваемых систем может быть выгодна во многих других отраслях, таких как медицина и автомобилестроение, ведь в принципе можно создать модель любого устройства. Когда оборудование, чип или встраиваемая система еще не существуют или по тем или иным причинам недоступна, симуляция позволяет разрабатывать и аппаратное и программное обеспечение одновременно, что значительно ускоряет вывод устройства на рынок.

Существуют различные симуляторы, их также часто называют виртуальными машинами и гипервизорами. Например, это Parallels Studio, Workstation от VmWare, для Linux используются KVM и QEMU, еще есть VirtualBox, VCS от Synopsys и Mentor Graphics Questa. Мне приходилось сталкиваться с этими симуляторами, а также я долгое время работал с симулятором Simics от Intel и Wind River. В своих статьях я хотел бы поделиться опытом и рассказать о том, что такое симуляция и чем она может быть полезна для клиентов из самых разных отраслей.

Airbnb в симуляции – гость и хост

Внутри симулятора запускается так называемый «гостевой код», это может быть «гостевая программа» или целая «гостевая операционная система». Сама симулируемая система – это «гость», а компьютер, где запускается симулятор, – «хост». Операционная система, работающая на хосте, в которой запускается симулятор, называется «хостовой ОС».

Simulator: guest & host

Таким образом, симулятор, реализующий определенный набор инструкций гостевой системы, моделирует их, используя имеющиеся в наличии средства хостовой системы.

Симуляция и эмуляция – какое название правильное?

Модель может повторять устройство с разной степенью точности и детализации. Часто речь идет о симуляции только внешнего поведения системы, доступного программному коду. Коду «все равно», как именно внутри реализована та или иная инструкция процессора, – главное, чтобы работало. Такой вариант симуляции распространен, прост в разработке и является довольно быстрым, вычислительных мощностей даже обычных пользовательских компьютеров хватает для его беспроблемной реализации.

Однако этого недостаточно, если мы хотим узнать, например, сколько времени будет выполняться программа на реальной аппаратуре. Для этого необходимо моделирование не только внешнего поведения, но и повторение внутренней структуры и логики работы. Это тоже может быть выполнено с разной степенью детализации и точности. Такие модели правильнее называть эмуляторами, которые действительно эмулируют устройство, а не «симулируют» результаты.

Создание эмуляторов гораздо сложнее из-за большего объема функциональности, которую необходимо реализовывать в модели. Также они функционируют намного медленнее по сравнению с симуляторами внешнего поведения устройства. С эмуляторами речь вообще не идет о запуске Windows – это может занять годы. Никто не занимается созданием программного эмулятора целиком всей платформы – это очень долго и дорого. Вместо этого эмулируются отдельные компоненты системы, такие как тот же центральный процессор, и на нем запускается лишь часть симуляционного процесса. Возможны различные гибридные схемы, когда часть симулятора является верхнеуровневой моделью, часть низкоуровневой, часть в ПЛИС, а часть вообще реальное железо.

Simulator, emulator graph

4 уровня детализации моделей
  • Бинарный интерфейс приложений (ABI)

На самом высоком уровне абстракции находится реализация определенного ABI (Application Binary Interface). В двух словах ABI описывает бинарный интерфейс взаимодействия двух программ – как правило, пользовательской программы и библиотеки или ОС. ABI покрывает соглашения о вызовах (как передавать параметры и возвращать значения), размеры типов данных, выполнение системных вызовов. Как это работает? Например, если программе, написанной для Linux, необходимо создать дополнительный тред (от англ. thread – нить) выполнения, то вызывается функция pthread_create(). А что, если сделать библиотеку с такой функцией в Windows и реализовать необходимые механизмы связывания приложения и библиотеки (динамической линковки)? В таком случае можно будет запускать Linux приложения из Windows. Windows будет «симулировать» Linux. Именно это и было сделано в Windows subsystem for Linux в Windows 10, что позволяет запускать немодифицированные бинарные Linux приложения в Windows.

  • Уровень архитектуры набора команд (ISA)

Как я написал выше, наиболее распространенным является вариант симуляции на уровне инструкций процессора, так называемый ISA (Instruction Set Architecture), или, точнее, результата их выполнения, то есть без эмуляции всей внутренней логики того, как это происходит в реальном процессоре, и без учета времени выполнения различных инструкций. Именно такие симуляторы называют еще функциональными. Так работают VirtualBox, Vmware Workstation, Wind River Simics, KVM и QEMU. Это позволяет удобно, без лишних дополнительных действий запускать программы, предназначенные для симулируемого устройства. Другими словами, не требуется ни перекомпиляция, ни какие-либо другие манипуляции с запускаемыми программами. В таких случаях говорят, что возможен запуск немодифицированного бинарного кода.

  • Микроархитектура

К более низкоуровневым и детальным уровням симуляции относится уровень микроархитектуры, при котором симулируются реальные внутренние алгоритмы и блоки процессора, такие как декодер инструкций, очереди, блок внеочередной обработки, предсказатель переходов, кэш, планировщик и сами счетные устройства. Такое моделирование позволяет анализировать реальную скорость выполнения программ и, например, оптимизировать их под уже имеющиеся архитектуры. А в случае симуляции прототипов будущих микропроцессоров возможны предсказание и оценка производительности этих устройств.

  • Эмуляция логических элементов

Ниже уровня микроархитектурной симуляции идет уровень эмуляции логических элементов, из которых и состоят современные чипы. Такие эмуляторы бывают и программными, и аппаратными с использованием ПЛИС. Логика ПЛИС описывается с помощью RTL (Register Transfer Level) на языках Verilog, VHDL и др. После компиляции получается образ (bitstream), который потом прошивается в ПЛИС. Причем для этого необязательно пользоваться паяльником и разбираться в электротехнике. Плата подсоединяется к компьютеру, например, по USB или JTAG интерфейсу, а специальный софт от производителя ПЛИС платы выполняет запись. Стоимость таких плат начинается от десяти долларов за простейшие варианты до миллионов долларов для больших ПЛИС стендов размером со шкаф, используемых в крупных компаниях-производителях чипов. В таких компаниях симуляция с использованием ПЛИС является финальной стадией перед передачей RTL в производство.

Если речь идет о несложных устройствах, то, имея на руках образ ПЛИС, можно обратиться в специализированные компании, которые сделают настоящее (не ПЛИС) устройство с запрограммированной логикой.

Simulation levels

Кроме этих уровней моделирования, мне также приходилось сталкиваться с гибридными симуляторами. По сути, они представляют собой соединенные друг с другом симуляторы, моделирующие на разных уровнях разные части системы. Например, необходим анализ пропускной способности новой сетевой карты, работающей вместе с разрабатываемым драйвером для определенной ОС. Такое сетевое устройство, а также ряд смежных устройств, могут быть реализованы сначала на микроархитектурном уровне для предварительного анализа, а потом и в ПЛИС, на уровне логических элементов, для финальных проверок. При этом остальная часть системы, задействованная лишь частично, реализуется на уровне инструкций. Обойтись без нее нельзя, так как она необходима, например, для загрузки ОС, а реализовывать ее на более низком и сложном уровне не имеет смысла.

Эти базовые знания о том, что такое симуляторы и какие они бывают, помогут нам разобраться в деталях реализации полноплатформенных симуляторов, потактовых моделей и работы с трассами, о которых я расскажу в следующей статье.

Алексей Лесных, Менеджер проектов, Auriga

Новости

Auriga вошла в Топ-100 компаний-разработчиков ПО

Auriga вошла в Топ-100 компаний-разработчиков ПО

Auriga была включена в рейтинг ста лучших в мире компаний-разработчиков программного обеспечения на заказ, опубликованный на бизнес-платформе The Manifest. Цель рейтинга – помочь заказчикам найти надежных партнеров

Заказчик оценил проактивный подход Auriga в разработке ПО

Успех разработки программного обеспечения на заказ зависит от целого ряда факторов, включая не только техническую экспертизу и глубокое понимание бизнес-области, но также корпоративную культуру, коммуникативные...

Auriga вошла в Intel IoT Solutions Alliance

Auriga, одна из ведущих компаний-разработчиков программного обеспечения на заказ, вошла в Intel® IoT Solutions Alliance, крупный международный альянс, призванный ускорить инновации в сфере Интернета вещей...

Признанный лидер услуг по разработке ПО:
управление командами и проектами;
разработка новых продуктов, сопровождение, тестирование