Ответ 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 в основном ниже различий между режимом пользователя/ядра (за исключением механизмов, которые он обеспечивает для проверки безопасности, в основном различных колец).