Омонимы, когда говорят о виртуальных кэшах, - это когда один виртуальный адрес соответствует нескольким физическим адресам.
Одним из известных решений проблемы омонимов в виртуальном кэше является использование физических тегов для кэша; то есть: проиндексируйте кеш с частью виртуального адреса, но сделайте тег частью физического адреса. Я не понимаю, как это работает.
В моем понимании процессор отправляет виртуальный адрес в кеш. Как процессор узнает, какой физический тег проверять, если он не отправляет какие-либо физические теги в кеш? Например, с обычным физическим кешем, если вы хотите увидеть, существует ли 00001111 в кеше, где 0000 - это биты тега, а 1111 - биты индекса, вы проиндексируете кеш на 1111, и если вы получите попадание, посмотрите, является ли тег для индекса 1111 0000.
Однако, если ваш виртуальный адрес 00001111, что соответствует физическому адресу, скажем, 10101010, процессор отправит 00001111 в виртуальный кеш. Как кеш узнает, какие биты физического тега проверять (1010), если эти теги отсутствуют в виртуальном адресе, отправленном процессором? Откуда физический адрес?
Проще говоря, предположим, что VA 1 сопоставляется с 3 физическими адресами: 2, 3 и 4. Если мой процессор запрашивает кеш с виртуальным адресом 1, как кеш даже узнает, что он должен искать 2, 3 и 4? Разве не неоднозначно, какой физический адрес я пытаюсь найти?