Выполнение бинарного файла при моделировании из командной строки?

Есть ли способ выполнить простой двоичный файл Linux при моделировании из командной строки? Что-то вроде

      simics -some-flags ./a.out

2 ответа

Теперь в Simics прямо из коробки нет режима приложения (или режима системных вызовов).

В зависимости от потребностей, можно скомпилировать полезную нагрузку в ELF-файл без стандартных библиотек, используя в качестве точки входа и, возможно, скрипт компоновщика для настройки пользовательского макета. Это могло сработать как bare-metal режим - Simics имеет load-binary команда для помещения файла ELF в физическую память и возврата его начального адреса - просто установите %rip = <start-address>и запустите симуляцию. Весь сценарий может выглядеть так:

      $start = (load-binary $elf_file)
%rip = $start
%rsp = 0x40001000
bp.hap.run-until name = X86_HLT_Instr

предполагая, что приложение имеет инструкцию в конце своего _start. Если hltнежелательно, тогда в Simics есть так называемая магическая инструкция - включите, пожалуйста, simics-6.0.xx\src\include\simics\magic-instruction.h из вашей установки Simics, а затем используйте MAGIC_BREAKPOINTмакрос в вашем источнике. Затем в приведенном выше сценарии вместо run-until использовать enable-magic-breakpoint- Simics остановится каждый раз, когда попадет в магическую инструкцию во время симуляции.

Вы можете установить $elf_file в путь к приложению вручную в том же скрипте или во время вызова Simics в командной строке, например:

./simics -e \$elf_file=$HOME/my-new-project/a.out ...

В качестве обходного пути можно использовать замену CRT (то есть предоставить настраиваемую стандартную библиотеку). Например, чтобы поддержать printf и друзья, у Simics есть простая модель TTY-консоли, которая принимает байтовые записи в определенное (настраиваемое) место в адресном пространстве, так что putchar можно переопределить для использования этого адреса, а остальные стандартные функции останутся без изменений.

Еще один обходной путь - это печать в память и, в конце концов, выгрузить ее в файл, подобный этому:

(pselect)->physical_memory.save-file mem.txt 0x40001000 1000 -overwrite

Это сбросит 1000 байтов по физическому адресу = 0x40001000 к mem.txtфайл. Обычно это самый быстрый способ запустить какой-либо тест в пакетном режиме, а затем изучить его журналы.

Наконец, можно скомпилировать приложение как полезную нагрузку UEFI и связать его с чем-то вроде https://slimbootloader.github.io/supported-hardware/qsp.html. При определенных усилиях он может работать как на Simics, так и на реальном оборудовании (все еще в режиме «голого металла»).

Из вопроса неясно, каков предполагаемый вариант использования.

Если цель состоит в том, чтобы загрузить и запустить двоичный файл Linux в моделируемой системе, после того, как система Linux загрузится с запросом, наиболее эффективным способом будет использование комбинации функций Simics:

  • Загрузите систему, чтобы запросить
  • Убедитесь, что агент Simics запущен в целевой системе (по умолчанию в образе Linux по умолчанию)
  • Возьмите контрольную точку загруженного состояния системы
  • Создайте новый сценарий Simics, который:
    • Открывает КПП
    • Запускает менеджер агентов Simics в Simics
    • Загружает двоичный файл с помощью агента
    • Запускает его либо с использованием ввода последовательного порта, либо с помощью агента. runкоманда

Сценарий Simics принимает в качестве аргумента имя программы. Тогда вы бы сделали что-то вроде:

      $ ./simics targets/qsp-x86/run-prog.simics prog=a.out

Сценарий будет примерно таким:

      decl {
    param program:  file("*.params") or nil = NIL
    ! Program to run
}

read-configuration "my-booted-checkpoint.ckpt"

$system = board ## Name of the target system in the checkpoint

script-branch "Upload and run" {
    local $con = $system.serconsole.con

    local $a  = (start-agent-manager)
    local $h = ($a.connect-to-agent)
    $h.wait-for-job 
    $h.upload -executable $program "/home/simics/"
    $h.wait-for-job

    $con.input "./%s\n" % [$program]    
}



Другие вопросы по тегам