Прыжок с изменением нуля на x86 очищает очередь предварительной выборки инструкций?

На x86 кто-то может подтвердить, очищает ли очередь смещения нуля (т. Е. Скачок, который не изменяет значения в CS или IP) очистку очереди предварительной инструкции?

1 ответ

Решение

Переход к следующему оператору, который в любом случае был бы выполнен, очищает очередь предварительной выборки инструкций на любом процессоре Intel x86, в котором он есть. Это было обычным делом в самом изменяющемся коде, чтобы гарантировать, что измененный код был фактически выполнен. Intel зашла так далеко, что документировала использование перехода как средства, обеспечивающего правильное выполнение автоматически модифицируемого кода даже на современных процессорах.

Из Руководства разработчика программного обеспечения для архитектуры Intel 64 и IA-32, том 3: Руководство по системному программированию:

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.)

Другие вопросы по тегам