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
. If hlt
是不可取的,那么 Simics 有所谓的魔法指令- 请包括simics-6.0.xx\src\include\simics\magic-instruction.h
从您的 Simics 安装中,然后使用MAGIC_BREAKPOINT
你的源代码中的宏。然后在上面的脚本中而不是run-until
use 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
to mem.txt
文件。这通常是在批处理模式下运行某些测试并随后探索其日志的最快方法。
最后,可以将应用程序编译为 UEFI 负载并将其与类似的东西配对https://slimbootloader.github.io/supported-hardware/qsp.html https://slimbootloader.github.io/supported-hardware/qsp.html。经过一些努力,它可以在 Simics 和真实硬件上运行(仍处于裸机模式)。