如何使用linux性能工具perf记录cr3寄存器值?

问题描述

perf 能够记录多个字段,例如 addr、ip、timestamp。它还可以记录在 https://github.com/torvalds/linux/blob/master/tools/perf/arch/x86/util/perf_regs.c 处看到的通用寄存器。但是我找不到任何关于使用 perf 记录控制寄存器的相关文档。那么我怎样才能使用 perf 来实现呢?还有其他可用的工具吗?

解决方法

您无法使用 perf 工具记录控制寄存器值。您可以使用 --intr-regs 选项采样的寄存器列表仅限于 here 列出的寄存器。您可以通过查看 here 来确认这一点。

perf events 模块可以访问的寄存器取决于体系结构,如 herehere 所示。此 commit 引入了将选择性寄存器状态包含到 perf record/script 输出中。这意味着,所有 perf 将仅限于使用已指定的寄存器,仅此而已。

还有其他问题/答案here,它们告诉您一些编写程序/内核模块以访问控制寄存器的方法。最重要的是,您可以使用 QEMU(在 TCG 模式下)并在 VM 内运行您的程序。然后,您可以定期打印寄存器状态(在每个 TB 的末尾 - 您将看到所有寄存器值)。也有指定的模拟器,如 GDB,可能会对您有所帮助。

编辑 -

有一种方法可以记录 cr3 寄存器值。您可以使用 IntelPT 在程序执行期间记录程序的控制流信息。 IntelPT 在 PIP 数据包的帮助下跟踪对 CR3 寄存器的更改。您可以使用 IntelPT 生成的轨迹来跟踪和确定 CR3 值。