Почему CLFLUSH существует в x86?
Недавно я узнал о нападении с помощью молотка. Чтобы выполнить эту атаку, программист должен очистить всю иерархию кэша ЦП для определенного количества адресов.
Мой вопрос: почему CLFLUSH необходим в x86? Каковы причины того, чтобы когда-либо использовать эту инструкцию, если все кэши L* действуют прозрачно (т.е. не требуется явная аннулирование кэша)? Кроме того: разве процессор не может спекулировать шаблонами доступа к памяти и, таким образом, вообще игнорировать инструкцию?
1 ответ
Я думаю, в основном для таких странных вещей, как кешируемые регионы MMIO.
Skylake представила слабо упорядоченную высокопроизводительную CLFLUSHOPT, поскольку она полезна для энергонезависимого хранилища, подключенного непосредственно к иерархии памяти. Очистка кеша гарантирует, что данные записываются в реальную память, а не остаются грязными в процессоре.
Это потенциально также имеет значение для DMA, не связанного с кэшем, для устройств, если что-то еще можно сделать в x86. (Вероятно, нет; я думаю, что все DMA сейчас связано с кэшем.)
Я не эксперт в этом, и это не означает, что это полный ответ, охватывающий все варианты использования.