Физическая или виртуальная адресация используется в процессорах x86/x86_64 для кэширования в L1, L2 и L3?

Какая адресация используется в процессорах x86/x86_64 для кэширования в L1, L2 и L3 (LLC) - физическом или виртуальном (с использованием PT/PTE и TLB) и каким-то образом PAT (таблица атрибутов страницы) влияет на него?

И есть ли разница между драйверами (пространство ядра) и приложениями (пользовательское пространство) в этом случае?


Короткий ответ - Intel использует виртуально проиндексированные, физически помеченные (VIPT) кеши L1: Что будет использоваться для обмена данными между потоками, выполняются на одном ядре с HT?

  • L1 - Виртуальная адресация (в кеше 8-way для определения Set требуется низкий 12 bits, который одинаковый в virt и физическом)
  • L2 - Физическая адресация (требуется доступ к TLB для Virt-2-Phys)
  • L3 - Физическая адресация (требуется доступ к TLB для Virt-2-Phys)

Ответ 1

Ответ на ваш вопрос - это зависит. Это строго решение для проектирования процессора, которое уравновешивает компромисс между производительностью и сложностью.

Возьмем, к примеру, недавние процессоры Intel Core - они физически помечены и фактически проиндексированы (по крайней мере, согласно http://www.realworldtech.com/sandy-bridge/7/). Это означает, что кэши могут выполнять только поиск в чистом физическом адресном пространстве, чтобы определить, есть ли строка или нет. Однако, поскольку L1 32k, 8-way ассоциативный, это означает, что он использует 64 набора, поэтому вам нужно только биты адреса 6-11, чтобы найти правильный набор. Как бы то ни было, виртуальные и физические адреса в этом диапазоне одинаковы, поэтому вы можете искать DTLB параллельно с чтением набора кеша - известного трюка (см. http://en.wikipedia.org/wiki/CPU_cache для хорошего объяснения).

В теории можно создать виртуальный индекс + виртуальный тегированный кеш, который бы устранил необходимость прохождения преобразования адресов (поиск в TLB, а также переходы по страницам в случае пропусков TLB). Однако это вызовет многочисленные проблемы, особенно с использованием псевдонимов памяти - случай, когда два виртуальных адреса сопоставляются с одним и тем же физическим.

Скажем, что core1 имеет виртуальные адр-байты A в таком полностью виртуальном кэше (он сопоставляется с физическим addr C, но мы еще не выполнили эту проверку). core2 записывает в виртуальный addr B, которые сопоставляются с одним и тем же физическим addr C - это означает, что нам нужен какой-то механизм (обычно это "snoop", термин, придуманный Джим Гудман), который идет и делает недействительной эту строку в core1, управляя слиянием данных и управлением согласованностью если нужно. Тем не менее, core1 не может ответить на этот snoop, поскольку он не знает о виртуальном добавлении B и не сохраняет физический адр C в виртуальном кэше. Таким образом, вы можете видеть, что у нас есть проблема, хотя это в основном относится к строгим системам x86, другие архитектуры могут быть более слабыми и позволяют более простое управление такими кэшами.

Что касается других вопросов - нет реальной связи с PAT, о которой я могу думать, кеш уже разработан и не может меняться для разных типов памяти. Тот же ответ на другой вопрос - HW в основном ниже различий между режимом пользователя/ядра (за исключением механизмов, которые он обеспечивает для проверки безопасности, в основном различных колец).