PAT
Mit der Page Attribute Table ist es möglich, das Caching von Pages genauer einzustellen.
Inhaltsverzeichnis
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.

