【问题标题】:Determining When the LBR Stack is Full确定 LBR 堆栈何时满
【发布时间】:2013-01-11 09:14:18
【问题描述】:

我将从我参与的项目的一些背景开始。我们正在尝试编写一个 Linux 内核模块(在 3.5 内核中),它将启用最后一个分支记录 (LBR) 功能较新的 x86 处理器并将分支数据写入硬盘上的文件以供以后分析。

我们目前已经能够启用 LBR,并且可以看到 LBR 栈顶指针在检测到分支时发生变化(因此我们知道 LBR 已启用)。

我们的问题出现在我们无法弄清楚如何确定 LBR 堆栈何时变满以便我们可以从中读取数据并将其写入硬盘。理想情况下,我们希望在 LBR 中启用一个选项,以便在 LBR 堆栈接近满时抛出异常,并编写一个检索信息的处理程序。

到目前为止,我能找到的最接近的方法是设置 IA32_DEBUGCTL MSR 上的第 8 位,它可以在每次检测到分支时引发中断。不幸的是,每次发生分支时写入磁盘会产生比我们想要的更多的性能影响。我们宁愿在每次 LBR 堆栈满时分批写入数据,而不是在每个单独的分支上写入数据。有没有我遗漏的替代方案,还是我们只需要在每个分支之后硬着头皮写到磁盘?

谢谢

【问题讨论】:

  • 我应该提一下,在再次查看英特尔文档后,BTINT 位(我上面提到的第 8 位)仅在使用 BTS 时可用。当 BTS 缓冲区快满时,它会抛出一个中断,而不是像我最初想象的那样在每个分支上,并且它与 LBR 堆栈没有任何交互。

标签: c linux x86 kernel-module msr


【解决方案1】:

当您想开始记录时,您应该能够读取 TOS,然后在中断期间检查 TOS 是否等于此原始值,以确定堆栈是否已满新记录,并且每个完整堆栈仅执行一次磁盘写入.如果您愿意丢失一些早期记录,另一种选择是仅在 TOS 等于值范围内的某个任意值时才写入磁盘,从而导致每个完整堆栈一次写入磁盘。

一个问题可能是我们将中断本身推入 LBR 堆栈,因为它们被视为跳转,但我不确定这将如何根据不同的权限级别工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-20
    • 2021-05-31
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2015-07-09
    • 2011-02-04
    • 2014-12-14
    相关资源
    最近更新 更多