Почему CPUID + RDTSC ненадежен? - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь профилировать код для времени выполнения на процессоре x86-64.Я имею в виду этот технический документ Intel, а также прошел через другие темы SO, обсуждающие тему использования RDTSCP против CPUID + RDTSC здесь и здесь .

В вышеупомянутом техническом описании метод, использующий CPUID + RDTSC, называется ненадежным и также доказывается с помощью статистики.

Что может быть причиной ненадежности CPUID + RDTSC?

Кроме того, графики на рис. 1 (график поведения минимального значения) и на рис. 2 (график поведения отклонения) в одной и той же белой книге имеют шаблон «прямоугольная волна». Чем объясняется такая закономерность?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Другой причиной ненадежности CPUID + RDTSC является атака по боковому каналу виртуальной машины.

Когда выполнение инструкции CPUID внутри виртуальной машины приведет к выходу VM, это происходит, так что виртуальная машина будет обрабатывать CPUID так, как он хочети манипулировать инструкцией CPUID.
выполняя эту манипуляцию, добавляя дополнительное время, и используя RDTSC, будет возвращено «высокое» значение, поскольку «вся манипуляция CPUID VM» выполняется в это время.
Это значение затем может быть использовано,чтобы обнаружить, что мы работаем внутри ВМ.

Такое поведение может быть предотвращено виртуальной машиной, которая может масштабировать или виртуализировать TSC, делая ненадежным RDTSC

Обнаружение издержек выхода из виртуальной машины

0 голосов
/ 24 декабря 2018

Я думаю, они обнаружили, что CPUID внутри интервала измерения вызывает дополнительную изменчивость общего времени.Их предлагаемое исправление в 3.2 Улучшения с использованием инструкции RDTSCP подчеркивает тот факт, что в указанном интервале нет CPUID, когда они используют CPUID / RDTSC для запуска и RDTSCP / CPUID для остановки.

Возможно, они могли бы обеспечить EAX = 0 или EAX = 1 перед выполнением CPUID, чтобы выбрать лист данных CPUID для чтения (http://www.sandpile.org/x86/cpuid.htm#level_0000_0000h), в случае, если время CPUID зависит от того, какой запрос вы делаете.Кроме этого, я не уверен, почему это так.


Обратите внимание, что встроенный ассемблер в официальном документе Intel отстой: эти инструкции mov не нужны, если вы используете правильные выходные ограничения, такие как "=a"(low), "=d"(high). * * * * * * * * * * * * * * * * * * * * * *

.
...