Mit der ''Page Attribute Table'' ist es möglich, das Caching von [[Paging|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 [[MTRR|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: {| {{prettytable}} ! 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: {| {{prettytable}} ! 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: {| {{prettytable}} ! 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: {| {{prettytable}} ! 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#Funktion_0x0000_0001|CPUID-Befehls]] getestet werden.