gpt4 book ai didi

c - 确定 LBR 堆栈何时已满

转载 作者:太空宇宙 更新时间:2023-11-04 09:47:40 25 4
gpt4 key购买 nike

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

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

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

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

谢谢

最佳答案

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

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

关于c - 确定 LBR 堆栈何时已满,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14555147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com