【问题标题】:how to record cr3 register value using linux performance tools perf?如何使用 linux 性能工具 perf 记录 cr3 寄存器值?
【发布时间】:2021-04-11 01:20:07
【问题描述】:

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

【问题讨论】:

    标签: linux perf


    【解决方案1】:

    您无法使用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 值。

    【讨论】:

    • 我想从虚拟机外部获取 perf-like 事件的 cr3 值。是否有任何其他硬件功能支持此功能?
    • 是的,您可以使用 IntelPT 记录 CR3 值。我在原始答案中添加了一个编辑。请看一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多