Какая польза от инструкции INVD?

x86 INVD аннулирует иерархию кэша, не записывая содержимое обратно в память, по-видимому.

Мне любопытно, что такое инструкция? Учитывая то, что у человека очень мало контроля над тем, какие данные могут быть на разных уровнях кеша, и даже меньший контроль над тем, что может быть уже асинхронно, похоже, это не более чем способ убедиться, что вы просто не знаете, какие данные сохраняется в памяти.

Ответы

Ответ 1

Отличный вопрос!

Один прецедент для такой команды тупого действия, как invd, находится в специализированном или очень раннем блоке начальной загрузки, например, когда присутствие или отсутствие ОЗУ еще не проверено. Поскольку мы можем не знать, присутствует ли RAM, ее размер или даже если определенные ее части функционируют должным образом, или мы не хотим полагаться на нее, иногда полезно, чтобы процессор программировал часть своего собственного кеша для работы в качестве ОЗУ и использовать его как таковой. Это называется Cache-as-RAM (CAR). Во время настройки CAR, при использовании CAR, и во время срыва режима CAR, ядро ​​должно гарантировать, что из этого кеша в память ничего не будет записано.

Кэш-как-RAM

Ввод CAR

Чтобы настроить CAR, CPU должен быть установлен в Режим кэширования без заполнения и должен обозначать диапазон памяти, который будет использоваться для CAR как Write-Back. Это можно сделать с помощью следующих шагов:

  • Настройте MTRR (регистр диапазона типов памяти), чтобы обозначить фрагмент памяти как WB (Write-Back).
  • invd весь кеш, предотвращающий запись в кеш-запись и вызывающий хаос.
  • Установите режим кэширования в Обычный режим кэширования (cr0.CD=0).
  • В режиме обычного кэша "прикоснитесь" ко всем линиям кэширования диапазона памяти, которые будут использоваться как CAR, прочитав его и тем самым заполнив кэш. Заполнение кэширования может выполняться только в режиме обычного кэша.
  • Установите режим кэширования в Режим кэширования без заполнения (cr0.CD=1).

Использование CAR

Мотивация настройки CAR заключается в том, что после установки все обращения (чтение/запись) внутри региона CAR будут касаться кеша и будут не удалять ОЗУ, но содержимое кэша будет адресуемым и действуют так же, как RAM. Поэтому вместо написания кода ассемблера, который когда-либо использует регистры, теперь можно использовать обычный код C, при условии, что стек и локальные/глобальные переменные, к которым он обращается, ограничены внутри области CAR.

Выход из CAR

Когда выйдет CAR, было бы плохо, если бы все записи памяти, сделанные в этой "псевдо-ОЗУ", внезапно вырвались из кеша и уничтожили любой фактический контент по тому же адресу в ОЗУ. Поэтому, когда CAR выйдет, еще раз invd используется для полного удаления содержимого области CAR, а затем настроен режим Normal Cache.

Руководство Intel 80486

Intel ссылается на использование Cache-as-RAM в i486 Справочник по программированию микропроцессоров. Intel 80486 был процессором, который впервые представил инструкцию invd. Раздел 12.2 гласит:

12.2 ЭКСПЛУАТАЦИЯ ВНУТРЕННЕГО КАЧЕСТВА

Программное обеспечение управляет режимом работы кеша. Кэширование может быть включено (его состояние после инициализации reset), кеширование может быть отключено, пока существуют допустимые строки кэша (режим, в котором кеш действует как быстрая внутренняя память), или кеширование может быть полностью отключено.

При отключении кеша должны соблюдаться меры предосторожности. Если CD установлен в 1, процессор i486 не будет читать внешнюю память, если копия все еще находится в кеше. Всякий раз, когда NW установлен в 1, процессор i486 не будет записывать во внешнюю память, если данные находятся в кеше. Это означает, что устаревшие данные могут развиваться в кеш-памяти i486. Эти устаревшие данные не будут записаны во внешнюю память, если позднее NW установлено в 0 или эта строка кэша позже будет перезаписана в результате промаха в кеше. В общем случае кеш должен быть сброшен при отключении.

Можно заморозить данные в кеше, загрузив их с помощью тестовых регистров, когда установлены CD и NW. Это полезно для обеспечения гарантированных кеш-запросов для кода и данных с критическим временем.

Обратите внимание, что все сегменты должны начинаться с 16-байтовых границ, чтобы позволить программам выравнивать код/​​данные в строках кэша.

Примеры использования

Libreboot имеет слайд-колоду, представляющую их реализацию CAR, описывая описанную выше процедуру. Инструкция invd используется на слайде 21.

AMD называет его Cache-as-general-storage в §2.3.3: Использование кэша L2 как общего хранилища во время загрузки.

Другое использование

В некоторых ситуациях, связанных с некогерентностью кэша из-за аппаратного обеспечения DMA (Direct Memory Access), invd также может оказаться полезным.