command-line-interface - 从命令行执行模拟下的二进制文件?
问题描述
有没有办法在 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 和真实硬件上运行(仍处于裸机模式)。
推荐阅读
- android - Android:在 Glide 中预加载/缓存图像,加载时图像闪烁
- c - 如何使用 node.js N-API 函数检查 napi_number 类型的 napi_value 是整数还是小数,
- javascript - 将 JSON 数组拆分为每行一个对象
- django - 使用 python 在 Django 中发送电子邮件的多个电子邮件配置(如果管理员有多个电子邮件,则管理员需要选择)
- r - 如何修复“评估错误(expr,envir,enclos):找不到对象'SUBJECT'”?
- haskell - 理解函数签名中的类型相等
- angular - 找不到 [object Module] 的 ngmodule 元数据
- php - 在 jquery 中序列化表单数据会产生不必要的符号。如何避免它们?
- elasticsearch - elasticsearch 重新索引文档减少可用空间
- javascript - 从异步函数中获取常量值