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

avatar
kcc
1 июля 2021 в 21:24
179
2
0

Есть ли способ запустить простой бинарный файл Linux в симуляторе Simics из командной строки?

Что-то вроде

simics -some-flags ./a.out
Источник

Ответы (2)

avatar
jakobengblom2
5 июля 2021 в 09:07
0

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

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

  • Загрузите систему, чтобы появился запрос
  • Убедитесь, что Simics Agent запущен в целевой системе (по умолчанию в образе 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]    
}



kcc
8 июля 2021 в 01:18
0

Как объяснено в ответе Ковалекс, предполагаемое использование ближе к голому металлу. Я задал еще один вопрос о голом железе, здесь: coderhelper.com/questions/68294465/…

avatar
Kovalex
2 июля 2021 в 07:46
1

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

В зависимости от потребностей можно скомпилировать полезную нагрузку в ELF-файл без стандартных библиотек, используя _start в качестве точки входа и, возможно, скрипт компоновщика для настройки пользовательского макета. Это может работать как режим 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

при условии, что приложение имеет инструкцию hlt в конце _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, так и на реальном оборудовании (все еще в режиме «голого железа»).

kcc
8 июля 2021 в 00:57
0

Такой подход к «голому железу» мне подойдет, но я не смог его запустить: ./simics t1.simics The frontend object does not implement the processor_info interface required by the command ...simics-test1/t1.simics:1] error in 'load-binary' command Вот как я создаю свой исполняемый файл: ``` $cat small.cc cat small .cc extern "C" void _start() { asm volatile ("mov $42, %rax"); asm изменчивый ("hlt"); } ``` ``` clang -O2 -static -nostdlib small.cc -o small ``` и скрипт: ``` ```

kcc
14 июля 2021 в 06:11
0

Не удается заставить работать «%bp.hap.run-until name = X86_HLT_Instr»: ошибка синтаксического анализа: пустое пространство имен [/home/kcc/simics-projects/t1/t1.simics:5] ошибка синтаксического анализа команды Ошибка — прерывание сценарий.

Jimmy Wu
7 сентября 2021 в 20:36
0

Для всех, кто придет и увидит это позже, обратите внимание, что другой поток решил, что указанное выше использование kcc "%bp.hap.run-until" является опечаткой. Не должно быть %, так как его не было в исходной вещи, упомянутой Ковалекс.