有没有办法在 Simics 模拟下从命令行执行一个简单的 Linux 二进制文件?
就像是
simics -some-flags ./a.out
有没有办法在 Simics 模拟下从命令行执行一个简单的 Linux 二进制文件?
就像是
simics -some-flags ./a.out
现在 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
使用- Simics 将在模拟过程中enable-magic-breakpoint
遇到魔法指令时停止。
您可以$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 功能的组合:
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]
}