Выполнение бинарного файла при моделировании из командной строки?
Есть ли способ выполнить простой двоичный файл 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]
}