Есть ли способ запустить простой бинарный файл Linux в симуляторе Simics из командной строки?
Что-то вроде
simics -some-flags ./a.out
Есть ли способ запустить простой бинарный файл Linux в симуляторе Simics из командной строки?
Что-то вроде
simics -some-flags ./a.out
Из вопроса неясно, каков предполагаемый вариант использования.
Если цель состоит в том, чтобы загрузить и запустить бинарный файл Linux в смоделированной системе, после того как система Linux загрузится с запросом, наиболее эффективным способом будет использование комбинации функций 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]
}
Теперь в 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, так и на реальном оборудовании (все еще в режиме «голого железа»).
Такой подход к «голому железу» мне подойдет, но я не смог его запустить: ./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 ``` и скрипт: ``` ```
Не удается заставить работать «%bp.hap.run-until name = X86_HLT_Instr»: ошибка синтаксического анализа: пустое пространство имен [/home/kcc/simics-projects/t1/t1.simics:5] ошибка синтаксического анализа команды Ошибка — прерывание сценарий.
Для всех, кто придет и увидит это позже, обратите внимание, что другой поток решил, что указанное выше использование kcc "%bp.hap.run-until" является опечаткой. Не должно быть %, так как его не было в исходной вещи, упомянутой Ковалекс.
Как объяснено в ответе Ковалекс, предполагаемое использование ближе к голому металлу. Я задал еще один вопрос о голом железе, здесь: coderhelper.com/questions/68294465/…