0

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

就像是

simics -some-flags ./a.out
4

2 回答 2

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使用- 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 和真实硬件上运行(仍处于裸机模式)。

于 2021-07-02T07:46:13.510 回答
0

从这个问题中不清楚预期的用例是什么。

如果目标是在模拟系统上上传和运行 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]    
}



于 2021-07-05T09:07:18.260 回答