本文介绍了从命令行执行模拟中的二进制文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

类似于

simics -some-flags ./a.out

推荐答案

现在SIMICS中没有现成的应用程序模式(或系统调用模式)。

根据需要,可以使用_start作为入口点,或许还可以使用链接器脚本来设置自定义布局,在没有标准库的情况下将有效负载编译为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指令。如果不需要hlt,则Simics有所谓的魔术指令-请包含Simics安装中的simics-6.0.xxsrcincludesimicsmagic-instruction.h,然后在源代码中使用MAGIC_BREAKPOINT宏。然后,在上面的脚本中,不使用run-until使用enable-magic-breakpoint-Simics在模拟过程中任何时候点击魔术指令都会停止。

您可以在同一脚本中手动将$elf_file设置为应用程序路径,也可以在命令行中调用Simics时将$elf_file设置为应用程序路径,如下所示:

./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

这会将物理地址=0x40001000处的1000个字节转储到mem.txt文件。这通常是以批处理模式运行某些测试并稍后浏览其日志的最快方式。

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

这篇关于从命令行执行模拟中的二进制文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-23 07:09