【发布时间】: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