确定LBR堆栈何时已满

时间:2013-01-28 03:41:45

标签: c linux x86 kernel-module msr

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

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

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

到目前为止,我能够找到的最接近的事情是在IA32_DEBUGCTL MSR上设置第8位,这样每次检测到分支时都会抛出一个中断。不幸的是,每次发生分支时写入磁盘会产生比我们想要的更多的性能影响。我们更愿意在每次LBR堆栈满时而不是在每个单独的分支上批量写入数据。有没有我缺少的替代方案,或者只是必须咬紧牙关并在每个分支后写入磁盘?

由于

1 个答案:

答案 0 :(得分:2)

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

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

相关问题