首页 > 解决方案 > 从命令行执行模拟下的二进制文件?

问题描述

有没有办法在 Simics 模拟下从命令行执行一个简单的 Linux 二进制文件?

就像是

simics -some-flags ./a.out

标签: command-line-interfacesimics

解决方案


现在 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 个字节转储0x40001000mem.txt文件中。这通常是在批处理模式下运行一些测试并稍后探索其日志的最快方法。

最后,可以将应用程序编译为 UEFI 有效负载,并将其与https://slimbootloader.github.io/supported-hardware/qsp.html之类的东西配对。通过一些努力,它可以在 Simics 和真实硬件上运行(仍处于裸机模式)。


推荐阅读