Инструкция x86 WBINVD
выполняет обратную запись и делает недействительными все кэши. Это описывается как :
Записывает все измененные строки кэша во внутреннем кэше процессора в основную память и делает недействительными (сбрасывает) внутренние кэши. Затем инструкция выдает цикл шины специальной функции, который предписывает внешним кэшам также записывать измененные данные, а другой цикл шины указывает, что внешние кэши должны быть признаны недействительными.
Важно, что инструкция может быть выполнена только в ring0, то есть в операционной системе. Так что ваши пользовательские программы не могут просто использовать его. В Linux вы можете написать модуль ядра, который может выполнять эту инструкцию по требованию. На самом деле, кто-то уже написал такой модуль ядра: https://github.com/batmac/wbinvd
К счастью, код модуля ядра действительно крошечный, так что вы можете проверить его перед загрузкой кода из незнакомых людей из Интернета в ваше ядро. Вы можете использовать этот модуль (и запустить выполнение команды WBINVD
), прочитав /proc/wbinvd
, например, через cat /proc/wbinvd
.
Однако я обнаружил, что эта инструкция (или, по крайней мере, этот модуль ядра) действительно медленная. На моем i7-6700HQ я измерил его на 750 мкс! Это число мне кажется очень высоким, поэтому я мог ошибиться, измерив это - пожалуйста, имейте это в виду! Объяснение этой инструкции просто сказать:
Количество времени или циклов для завершения WBINVD будет варьироваться в зависимости от размера и других факторов различных иерархий кэша.