2013-09-26 13 views
14

Welche Adressierung wird in den Prozessoren x86/x86_64 für Caching in den L1, L2 und L3 (LLC) verwendet - physisch oder virtuell (mit PT/PTE und TLB) und irgendwie wirkt sich PAT(page attribute table) darauf aus?Physikalische oder virtuelle Adressierung wird in den Prozessoren x86/x86_64 zum Caching in L1, L2 und L3 verwendet?

Und gibt es in diesem Fall Unterschiede zwischen den Treibern (Kernel-Space) und den Anwendungen (User-Space)?

+0

Sie können den Cache nicht adressieren. Sie können nur Speicher adressieren. Der Cache wird privat von der CPU gehandhabt. –

+1

@Kerrek SB Ja, ich weiß, aber CPU-Cache verwendet TLB und alle Gemeinkosten der virtuellen Adressierung oder nicht? – Alex

Antwort

28

Die Antwort auf Ihre Frage ist - es kommt darauf an. Das ist streng genommen eine CPU-Design-Entscheidung, die den Kompromiss zwischen Leistung und Komplexität ausgleicht.

Zum Beispiel aktuelle Intel Core Prozessoren - sie sind physikalisch markiert und virtuell indiziert (zumindest nach http://www.realworldtech.com/sandy-bridge/7/). Dies bedeutet, dass die Caches nur Nachschlagevorgänge im reinen physischen Adressraum abschließen können, um festzustellen, ob die Zeile vorhanden ist oder nicht. Da L1 jedoch 32k, 8-Wege assoziativ ist, bedeutet dies, dass es 64 Sätze verwendet, so dass Sie nur die Adressbits 6 bis 11 benötigen, um die richtige Menge zu finden. Wie es so ist, sind virtuelle und physikalische Adressen in diesem Bereich gleich, so dass Sie die DTLB parallel zum Lesen eines Cache-Sets suchen können - ein bekannter Trick (siehe - http://en.wikipedia.org/wiki/CPU_cache für eine gute Erklärung).

In der Theorie kann man einen virtuell indexierten + virtuell getaggten Cache erstellen, der die Anforderung der Adressübersetzung (TLB-Lookup und Seitenwanderungen im Falle von TLB-Misses) überflüssig macht. Dies würde jedoch zahlreiche Probleme verursachen, insbesondere beim Speicher-Aliasing - ein Fall, in dem zwei virtuelle Adressen dem gleichen physikalischen zugeordnet werden.

Say Core1 hat virtuelle Adr Eine Caches in einem solchen vollständig virtuellen Cache (es entspricht phys C, aber wir haben diese Prüfung noch nicht gemacht). core2 schreibt in virtuelles addr B, das dem gleichen phys addr C zugeordnet ist - das heißt, wir brauchen einen Mechanismus (normalerweise ein "snoop", ein Begriff, der von Jim Goodman geprägt wurde), der diese Zeile in core1 ungültig macht und die Datenzusammenführung und Kohärenzverwaltung verwaltet wenn benötigt. Jedoch kann core1 auf diesen Snoop nicht antworten, da er nicht über die virtuelle Adresse B weiß und die physikalische Adresse C nicht im virtuellen Cache speichert. Sie sehen also, dass wir ein Problem haben, obwohl dies hauptsächlich für strikte x86-Systeme relevant ist. Andere Architekturen sind möglicherweise laxer und ermöglichen eine einfachere Verwaltung solcher Caches.

In Bezug auf die anderen Fragen - es gibt keine echte Verbindung mit PAT, die ich mir vorstellen kann, ist der Cache bereits entworfen, und kann für verschiedene Speichertypen nicht ändern. Die gleiche Antwort für die andere Frage - die HW ist meistens unter der Unterscheidung zwischen Benutzer/Kernel-Modus (mit Ausnahme der Mechanismen, die es für die Sicherheitsprüfung bietet, meist die verschiedenen Ringe).

+1

Vielen Dank! Und gibt es Ihrer Meinung nach einen Nutzen aus dem Wissen über den Mechanismus auf x86 und ob der I als Entwickler das weiß, kann ich irgendwie die Leistung meines Programms optimieren? – Alex

+2

Absolut, ein SW-Entwickler, der die HW nicht kennt, auf der er läuft, würde es schlecht machen, sie zu optimieren (wenn nötig) oder zu debuggen (wenn nötig). Der Cache-Mapping-Adreßtyp ist in der Tat ein wenig niedriger Pegel, obwohl er eine Schraffur für einige wichtige Optimierungen öffnet, wie zum Beispiel SW-Prefetch-Intrinsics und Cache-aware-Design. Sehen Sie diesen großartigen Beitrag für Beispiele - http://StackOverflow.com/Questions/16699247/what-is-cache-friendly-code. Auch gibt es die Frage der Out-of-Order-Ausführung, die einige Hinweise geben könnte, und natürlich die Vielzahl der Compiler-Optimierungen (nicht HW, aber auch wichtig) – Leeor

+0

Ich meine - profitieren von dem Wissen, dass in x86: "Sie sind physisch markiert und virtuell indiziert " – Alex