我将从我参与的项目的一些背景开始。我们正在尝试编写一个 Linux 内核模块(在 3.5 内核中),它将启用一些较新的 x86 处理器中存在的最后分支记录 (LBR) 功能并将分支数据写入硬盘上的文件以供以后分析。
我们目前已经能够启用 LBR,并且可以看到 LBR 堆栈顶部指针在检测到分支时发生变化(因此我们知道 LBR 已启用)。
我们的问题出现在我们无法确定如何确定 LBR 堆栈何时变满,以便我们可以从中读取数据并将其写入硬盘。理想情况下,我们希望在 LBR 中启用一个选项,以便在 LBR 堆栈接近满时抛出异常,并编写一个检索信息的处理程序。
到目前为止,我能找到的最接近的方法是设置 IA32_DEBUGCTL MSR 上的第 8 位,这使得每次检测到分支时都可以引发中断。不幸的是,每次发生分支时都写入磁盘会产生比我们想要的更多的性能影响。我们宁愿在每次 LBR 堆栈满时分批写入数据,而不是在每个单独的分支上写入数据。有没有我遗漏的替代方案,或者我们只需要在每个分支之后硬着头皮写到磁盘?
谢谢