Нет лучшего решения; однако я хотел бы утверждать, что двойные кавычки могут быть более желательными время от времени:
"
, чтобы идентифицировать прохождение цитируемого текста. Если бы мы использовали одну цитату '
, читатель мог бы неправильно истолковать ее как сокращение. Другой смысл прохода текста, окруженного '
, указывает на «разговорное» значение. Имеет смысл придерживаться уже существующих языков, и это, вероятно, облегчит изучение и интерпретацию кода. "I'm going to the mall"
по сравнению с иначе экранированной версией: 'I\'m going to the mall'
. Тем не менее, как утверждали другие, наиболее важно оставаться последовательным.
Событие производительности dTLB-loads-misses:u
может использоваться для определения, сбрасывает ли clflush
запись TLB, которая отображает указанную строку кэша. Это событие происходит, когда загрузка пропускает все уровни TLB и вызывает просмотр страницы. Это также более широко поддерживается по сравнению с dTLB-stores-misses:u
. В частности, dTLB-loads-misses:u
поддерживается на Intel P4 и более поздних версиях (кроме Goldmont) и на AMD K7 и более поздних версиях.
Код можно найти по адресу https://godbolt.org/z/97XkkF . Он принимает два параметра:
argv[1]
, который указывает, должны ли быть сброшены все строки указанной страницы 4 КБ или только одна строка кэша. argv[2]
, который определяет, использовать ли clflush
или clflushopt
. Тест прост. Он выделяет одну страницу размером 4 КБ и обращается к одному и тому же местоположению большое количество раз, используя инструкцию загрузки. Однако перед каждым доступом выполняется операция очистки кэша, как указано в argv[1]
и argv[2]
. Если очистка вызвала удаление записи TLB, то произойдет событие dTLB-loads-misses:u
. Если количество событий где-то близко к количеству нагрузок, то мы можем заподозрить, что очистка оказала влияние на TLB.
Используйте следующие команды для компиляции и запуска кода:
gcc -mclflushopt -O3 main.c
perf stat -e dTLB-loads-misses:u ./a.out wholePage opt
где wholePage
и opt
могут быть 0 или 1. Таким образом, есть 4 случая для проверки.
Я провел тест на SNB, IVB, HSW, BDW и CFL. На всех процессорах и во всех случаях количество событий очень незначительно. Вы можете запустить тест на других процессорах.
Мне также удалось запустить тест для WBINVD
, вызвав ioctl
в цикле модуля ядра для выполнения инструкции в режиме ядра. Я измерил dTLB-loads-misses:u
, iTLB-loads-misses:u
и icache_64b.iftag_miss:u
. Все они очень незначительны (менее 0,004% от 1 миллиона инструкций по загрузке). Это означает, что WBINVD
не очищает DTLB, ITLB или кэш команд. Он только сбрасывает кеши данных.
invlpg
в clflush
звучит как безумное дизайнерское решение, которое, я думаю, никто не примет. Вы часто хотите сделать недействительными несколько строк на странице. Там также нет очевидной выгоды; очистка TLB также не облегчает реализацию очистки кэша данных.
Даже простое удаление окончательной записи TLB (без необходимости аннулирования какого-либо кэширования каталога страниц) будет слабее, чем invlpg
, но все равно не имеет смысла.
Все современные x86 используют кеши с физическим индексированием / тегами, а не виртуальные. (Кэши L1d VIPT на самом деле являются PIPT со свободной трансляцией индекса, потому что они взяты из битов адреса, которые являются частью смещения на странице.) И даже если кеши были виртуальными, аннулирование записей TLB требует аннулирования виртуальных кешей, но не наоборот. .
Согласно IACA, clflush
составляет только 2 мопа на HSW-SKL и 4 мопа (включая микросинтез) на NHM-IVB. Так что это даже не микрокодирование на Intel.
IACA не моделирует invlpg
, но я предполагаю, что это больше мопсов. (И это привилегировано, так что это не совсем тривиально для тестирования.) Удаленно возможно, что эти дополнительные мопы на pre-HSW были для аннулирования TLB.
У меня нет никакой информации о AMD.
Тот факт, что invlpg
является привилегированным, является еще одной причиной ожидать, что clflush
не будет его надмножеством. clflush
непривилегирован. Предположительно, только из соображений производительности invlpg
ограничен только кольцом 0.
Но invlpg
не будет сбоя страницы, поэтому пользовательское пространство может использовать его для аннулирования записей TLB ядра, задержки процессов в реальном времени и обработчиков прерываний. (wbinvd
является привилегированным по аналогичным причинам: он очень медленный, и я думаю, что он не прерываемый.) clflush
совершает ошибку на недопустимых адресах, поэтому он не откроет эту уязвимость отказа в обслуживании. Вы могли бы clflush
совместно использовать страницу VDSO.
Если только по какой-то причине процессор не хочет, чтобы выставлял invlpg
в пространстве пользователя (переводя его в clflush
), я действительно не понимаю, почему какой-либо поставщик сделал бы это .
С энергонезависимыми модулями DIMM в будущем вычислений, еще менее вероятно, что любые будущие процессоры будут делать слишком медленные циклы для работы с диапазоном памяти clflush
. Вы ожидаете, что большинство программ, использующих NV-хранилище с отображением памяти, будет использовать clflushopt
, но я бы ожидал, что производители процессоров также сделают clflush
максимально быстрым.