首页 文章

x86上的零更改跳转是否清除了指令预取队列?

提问于
浏览
5

在x86上,有人可以确认零位移跳跃(即不改变CS或IP值的跳转)是否会清除指令预取队列?

1 回答

  • 6

    跳转到本来会执行的下一个语句会清除任何具有一个的Intel x86 CPU上的指令预取队列 . 在自修改代码中这样做是很常见的,以确保实际执行修改后的代码 . 英特尔甚至采用跳转作为手段来确保即使在现代CPU上也能正确执行自修改代码 .

    来自Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3: System Programming Guide

    8.1.3处理自身和交叉修改代码......随着处理器微体系结构变得更加复杂并开始在退出点之前推测性地执行代码(如在P6和更新的处理器系列中),关于应该执行哪些代码的规则,修改前或修改后,变得模糊 . 要编写自修改代码并确保其符合IA-32体系结构的当前和未来版本,请使用以下编码选项之一:(*选项1 *)
    将修改后的代码(作为数据)存储到代码段中;
    跳转到新代码或中间位置;
    执行新代码;

    (选项2是使用序列化指令而不是跳转,但早期的x86 CPU上不存在这些指令 . )

相关问题