PAT

Aus Lowlevel
Wechseln zu: Navigation, Suche

Mit der Page Attribute Table ist es möglich, das Caching von Pages genauer einzustellen.

Mögliche x86-Cachemodi

Folgende Cachemodi (Memory Types) existieren auf x86-Systemen:

  • UC: Strong Uncacheable (nichts wird gecachet)
  • UC-: Uncacheable (wie UC, kann über die MTRRs allerdings zu Write Combining überschrieben werden)
  • WP: Write Protected (nur Lesezugriffe werden gecachet)
  • WT: Write Through (Lesezugriffe werden gecachet, Schreibzugriffe werden sowohl in den Cache als auch in den Speicher geschrieben)
  • WC: Write Combining (aufeinander folgende Schreibzugriffe werden in einem WC-Puffer kombiniert und dann gemeinsam in den Speicher geschrieben)
  • WB: Write Back (Lese- und Schreibzugriffe werden gecachet)

Für normalen Speicher eignet sich WB, für MMIO-Bereiche je nachdem UC, UC-, WP oder WT. WC eignet sich besonders für Framebuffer.

Page-Level-Caching ohne PAT

Normalerweise gibt es für jede Page genau zwei Bits, die dafür genutzt werden können: CD (Cache Disable) und WT (Write Through). Je nach Kombination ergeben sich die folgenden Möglichkeiten:

CD WT Bedeutung
0 0 WB
0 1 WT
1 0 UC-
1 1 UC

Page-Level-Caching mit PAT

Um die anderen oben genannten Cachemodi zu verwenden, müssen entweder die MTRRs oder die PAT benutzt werden. Die PAT ist eine Tabelle, die die Werte der PAT-, CD- und WT-Bits einer Page ihrem Cachemode zuordnet. Dabei werden diese drei Bits zu einem Wert von 0 bis 7 kombiniert, der dann auf einen PAT-Eintrag zeigt, welcher den Cachemodus enthält. Dabei ist WT Bit 0 (das niederwertigste Bit), CD Bit 1 und PAT Bit 2 (das höchstwertige Bit).

Die acht PAT-Einträge werden im IA32_PAT-MSR gesetzt (Index 0x277). Sein Aufbau ist wie folgt:

Bits Bedeutung
0 – 2 Cachemode für PAT-Eintrag 0 (PAT=0, CD=0, WT=0)
3 – 7 reserviert
8 – 10 Cachemode für PAT-Eintrag 1 (PAT=0, CD=0, WT=1)
11 – 15 reserviert
16 – 18 Cachemode für PAT-Eintrag 2 (PAT=0, CD=1, WT=0)
19 – 23 reserviert
24 – 26 Cachemode für PAT-Eintrag 3 (PAT=0, CD=1, WT=1)
27 – 31 reserviert
32 – 34 Cachemode für PAT-Eintrag 4 (PAT=1, CD=0, WT=0)
35 – 39 reserviert
40 – 42 Cachemode für PAT-Eintrag 5 (PAT=1, CD=0, WT=1)
43 – 47 reserviert
48 – 50 Cachemode für PAT-Eintrag 6 (PAT=1, CD=1, WT=0)
51 – 55 reserviert
56 – 58 Cachemode für PAT-Eintrag 7 (PAT=1, CD=1, WT=1)
59 – 63 reserviert

Die Kodierung der Cachemodi ist wie folgt:

Wert Bedeutung
0 UC
1 WC
2 reserviert
3 reserviert
4 WT
5 WP
6 WB
7 UC-

Wird ein reservierter Modus ausgewählt oder ein reserviertes Bit im MSR gesetzt, so wird ein GPF ausgelöst.

Beim Booten sind die acht PAT-Einträge wie folgt belegt:

Eintrag Cachemodus
0 WB
1 WT
2 UC-
3 UC
4 WB
5 WT
6 UC-
7 UC

Dies führt genau zur oben genannten Defaultbelegung der CD- und WT-Bits. Das PAT-Bit wird ignoriert.

Unterstützung des Prozessors

Die PAT ist seit Pentium-III-Prozessoren vorhanden. Ob eine CPU das Feature unterstützt, kann mittels des CPUID-Befehls getestet werden.