【问题标题】:Does a zero change jump on x86 clear the instruction prefetch queue?x86 上的零变化跳转是否会清除指令预取队列?
【发布时间】:2017-04-05 21:05:58
【问题描述】:

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

【问题讨论】:

    标签: assembly x86


    【解决方案1】:

    跳转到无论如何都会执行的下一条语句确实会清除任何具有该指令的 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 架构的未来版本,请使用以下编码选项之一:

    (* OPTION 1 *)
    Store modified code (as data) into code segment;
    Jump to new code or an intermediate location;
    Execute new code;
    

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

    【讨论】:

    • 有趣的事实:你无法测试你是否满足纸上的 ISA 要求(除非你有一个物理的古老 CPU 可以测试),因为现代 x86 CPU 具有更强的窥探能力使用管道核子检测和处理自修改代码。 Observing stale instruction fetching on x86 with self-modifying code。在 现代 乱序 CPU 上,SMC 始终可以正常工作,无需跳转。但是,是的,ISA 规则说任何跳转都是安全的,所以这就是你应该做的(除非你无论如何都要使用序列化 insn。)
    猜你喜欢
    • 2021-11-16
    • 1970-01-01
    • 2015-01-07
    • 2011-06-20
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2015-05-15
    相关资源
    最近更新 更多