“训练”分支预测器是什么意思?

3
我正在阅读关于一种类似于Spectre的理论CPU漏洞的文章,它指出:
“攻击者需要训练分支预测器,使其可靠地错误预测分支。”
我大致了解什么是分支预测以及它的工作原理,但是“训练”分支预测器是什么意思?这是否意味着偏向某个分支,使其比另一个分支更加计算密集,或者(在循环中)不断要求CPU正确预测特定分支,然后才能继续进行下一个错误预测的分支?

E.g.,

// Train branch predictor
for (int i = 0; i < 512; i++)
{
    if (true){
        // Do some instructions
    } else {
        // Do some other instruction
    }
}

// The branch predictor is now "trained"/biased to predict the first branch?

// Proceed to attack

分支预测器是否使用权重来偏向于根据先前的预测/错误预测而进行单向或另一种方式的预测?
2个回答

4
这意味着创建一个分支,将其别名为你正在攻击的分支(通过将其放置在特定地址,可能与另一个进程中的虚拟地址相同,或者4k或其他2的幂偏移量可能有效),并运行多次以偏向预测器。因此,当使用Spectre进行攻击的分支实际运行时,它将按照你想要的方式进行预测。(或对于间接分支,将跳转到你想要的虚拟地址)。
现代TAGE分支预测器基于分支历史进行索引(即与此分支相关的动态指令流中的其他分支),因此适当的训练可能会很复杂...但在最简单的层面上,是的,具有超过1位状态的分支预测器记住了不仅仅是上一个分支方向。维基百科有一篇大文章介绍了许多不同的分支预测实现,从简单的2级饱和计数器到更高级别的实现。训练它们涉及使您控制的分支重复走相同的路。
具体来说,您需要将类似于这样的汇编代码放在一个循环中(在已知地址处),并不断运行它。
xor   eax,eax    ; eax=0 and thus set ZF
jnz   .target    ; always not-taken

然后目标分支将会掉落并运行Spectre“gadget”,即使它通常不被采用。

1
一个分支预测器通过记住最近的分支目标来工作。最简单的预测形式只是记住上次命中时走了哪个分支;更复杂的预测器存在并且很常见。
"训练"就是简单地填充那个内存。对于简单(1值)预测器,这意味着执行你想要偏向的分支一次。对于复杂的预测器,它将意味着多次执行偏爱的分支,直到处理器可靠地预测所需的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接