Hallo,
die L1-Caches werden manchmal doppelt getagt, soll heißen das virtuelle und physische Adressen als Tag gespeichert werden (ich glaube AMD hat das bei den Athlons angefangen). Damit wird der L1-Cache mit der virtuellen Adresse durchsuchbar und man spart sich das umsetzen per MMU. L2, und alles dahinter, hat normalerweise so lange Latenzen (oft über 10 Takte) das die MMU-Umsetzung auch schon gelaufen sein kann ohne zusätzlich Performance zu kosten (schließlich wurde der L1-Cache bereits durchsucht bevor der L2 überhaupt angesprochen wird), ich wüste nicht das schon mal L2-Cache virtuell getagt wurde, das würde einfach nur Transistoren kosten ohne Performance zu bringen. Die virtuellen Tags müssen natürlich bei einem Kontextwechsel gelöscht werden. Ob der Cache z.B. in der Lage ist zu einer vorhandenen Cache-Line die nur physisch getagt ist die von der MMU ermittelte virtuelle Adresse einfach dazu zu packen ohne an den Daten zu spielen (Write-Back und erneutes Einlesen) weiß ich nicht. Das währe interessant wenn 2 Prozesse gemeinsamen Speicher haben der natürlich immer an der selben physischen Adresse liegt aber an verschieden virtuellen Adressen eingeblendet wird und zufällig eben direkt von dem einen zum anderen Prozess umgeschaltet wird. Manche Soft-CPUs verwenden auch nur virtuelle Tags und haben die MMU hinter dem Cache, das bedeutet aber das der Cache bei einem Kontextwechsel immer invalidiert werden muss und das funktioniert nur beim Code-Cache vernünftig, dort gibt es ja keine modifizierten Cache-Lines.
Ob die Intel-CPUs virtuelle Adressen als L1-Cache-Tag benutzen weiß ich nicht, das stelle ich mir im Zusammenspiel mit Hyper-Threading kompliziert vor, schließlich müsste man dann ja zu jedem virtuellem Tag auch speichern zu welchen CPU-Thread (also zu welchem Kontext) das Tag gehört. Trotzdem sollte das lösbar sein.
Ich bin mir nicht sicher aber bei den dicken PowerPC-CPUs von IBM kann der L1-Cache in kleine Bereiche zerteilt werden um diese den einzelnen CPU-Threads pro Kern (beim Power7 sind es 4) direkt zuzuordnen, damit währe dann klar für welchen Kontext ein virtuelles Tag gültig ist, wobei ich nicht weiß ob die PowerPC-CPUs überhaupt virtuelle Cache-Tags beherrschen.
Fazit: virtuelle Cache-Tags werden benutzt aber nur sehr selten (ist eben etwas knifflig). Typischerweise werden Caches physisch getagt.
Grüße
Erik