0

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

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

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

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

谢谢

4

1 回答 1

2

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

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

于 2013-02-04T20:33:05.470 回答