Morello指令仿真器(Morello IE)是一个动态二进制翻译工具。它是基于使用DynamoRIO8工具框架将每个Morello指令在运行时翻译成一系列的AArch64指令。该仿真器保持了一致的仿真CPU状态以及仿真内存标签。它还在Morello用户空间应用程序和非Morello系统之间提供了一层兼容性。
Morello IE可以执行混合型和纯cap型Morello应用程序。从2.0版开始,你必须将应用程序链接到Morello-aware C库。例如,你可以使用Musl C库的移植到Morello9。你的应用程序使用的C库应该以PCuABI内核用户接口为目标,如Morello纯能力内核用户Linux ABI规范10所述。
Morello IE实现了PROTO_REL_04版本的Morello ISA。
2.2 组件
Morello IE 包括以下组件:
• 仿真器——实现对Morello 架构的仿真。
• 调试器——提供调试功能,可以访问模拟的CPU 状态和内存功能标签。
• 指令和内存跟踪器、高速缓存模型和统计计数器。
• Morello IE 启动器——该应用程序用于加载所有必需的工具并运行有效载荷。
模拟器
Morello IE 通过用可以本机执行的 AArch64 代码替换它们来实现 Morello 指令。 该实现依赖于仿真器为每个进程线程维护的仿真 CPU 状态。 此状态与实际执行上下文同步,包括硬件寄存器的值和内存中的功能。 模拟器在检测客户端 libmie.so 中实现。
调试器
交互式调试器可以访问每条已执行指令的仿真状态和运行时信息。 它支持
基本命令,例如打印模拟 CPU 状态和各个寄存器、使用基于 PC 的断点以及识别当前执行点的位置(例如,打印回溯)。 调试器提供对模拟器维护的数据的访问,这些数据无法通过 lldb 或 gdb 获得。 有关详细信息,请参阅交互式调试器(第 21 页)。 自 2.0 版以来,调试器作为单独的检测客户端 libdbg.so 实现。
Tracer Instruction and memory access tracer 作为单独的检测客户端 libtracer.so 实现。 您可以独立于指令仿真客户端使用此客户端。 例如,您可以使用它来分析非 Morello AArch64 应用程序,以将结果与同一应用程序的 Morello 版本进行比较。 它允许您捕获已执行指令和内存访问的运行时跟踪。 您可以配置跟踪范围以捕获整个应用程序执行流或感兴趣的特定区域。
Tracer Instrumentation 客户端还包括一个模块,用于在运行时收集各种架构统计信息,包括特定于 Morello 的计数器,以及与基于 DynamoRIO 的
DRCachesim 工具的 CPU 缓存建模相关的数据。 统计-可以使用与指令和内存跟踪相同的方式来限定控制和缓存建模数据的范围(有关更多详细信息,请参阅命令行选项(第 8 页))。
启动器
使用检测运行 Morello 应用程序需要额外的启动器二进制文件。 morelloie 二进制加载仿真和跟踪器客户端,并将应用程序执行暴露给动态二进制翻译工具。
您还可以使用此二进制文件加载其他检测客户端库。 例如,当您将自定义 DynamoRIO 仪器客户端与 Morello 仿真客户端一起使用时,这可能很有用。
2.3 命令行选项
本节概述了 Morello Instruction Emulator 支持的所有命令行选项。 命令行
模板是:
$ morelloie [选项] -- 应用程序 [应用程序参数]
双连字符 -- 用作分隔符。 在 -- 分隔符之前为 morelloie 指定选项,在 -- 分隔符之后为您的应用程序指定参数。
Morello IE 支持 boolean(不需要值)、integer 和 string 类型的命令行选项。 它还支持您可以通过多种方式指定的程序计数器 (PC) 值。
通常,您可以通过直接在选项名称前添加 -no 来反转任何布尔选项。 例如,使用 -no-enable-foo 反转选项 -enable-foo 。 对于有值的选项,用一个空格分隔选项名称和值。
某些选项将 PC 地址 <pc> 作为值。 这可以用多种格式指定。 它可以是十六进制文字(没有 0x 前缀,因为不支持十进制整数作为 PC 地址值)。 例如,-break 200200。 它还可以采用 <symbol> 或 <symbol>+<offset> 的形式,其中 <symbol> 是二进制文件中符号的名称,起始地址用作选项的值, <offset> 是可选的 添加到符号地址开头的无符号十进制偏移量(以字节为单位)。 例如,-fr main -to main+128。
与内存大小相关的选项接受十进制整数形式的值,并以字节为单位进行测量。 例如,-l1-d-size 1024 表示大小为 1024 字节 (1 KiB)。
控制仪表的选项
-v
打印启动器的详细输出。 输出定向到 stderr 。
默认值:抑制详细输出。
-F
使用 fork 系统调用而不是 execve 来启动进程。
默认值:execve 系统调用用于启动新进程。
-fsz <n>
指定检测的最大片段大小。 该选项限制了包含在单个检测代码块中的应用程序指令的数量,并设置了 DynamoRIO 的 max_bb_instrs 选项。 增加此值可能会提高检测性能,但也可能导致超出 DynamoRIO 中的内部代码缓存限制。