x86-Programmierung und -Betriebsarten (Teil 5)

Die Testregister TR6 und TR7

Weil die beiden Testregister TR6 und TR7 ausschließlich zum Prüfen des Translation Lookaside Buffer (TLB) implementiert sind, möchten wir sie zusammen mit dem TLB selbst an dieser Stelle erläutern.

Der TLB ist als 4-Wege-Set-Assoziativspeicher implementiert und verwendet eine Random-Ersetzungsstrategie für seine Einträge. Er ist einschließlich der Cache-Steuerung bereits vollständig auf dem 80386-Chip integriert und benötigt somit keinen externen SRAM-Speicher. Ähnlich wie bei anderen Cache-Speichern auch umfasst jeder Eintrag in den vier Sets 0 bis 3 ein 24-Bit-Tag und den eigentlichen 12-Bit-Cache-Wert. Jedes Set umfasst acht Einträge, der ganze TLB kann also 32 Einträge aufnehmen und ist insgesamt 144 Bytes groß. 32 Einträge für jeweils eine 4-KByte-Page bedeuten, dass 128 KByte Speicher vom TLB abgedeckt wird. Jedes Tag (zu 24 Bits) speichert die 20 höherwertigen Bits der linearen Adresse (also DIR- und Page-Anteil), ein Gültigkeitsbit und drei Attributbits. Der Dateneintrag enthält die 12 höherwertigen Bits der zugeordneten physikalischen Adresse.

Wenn bei einem Page-Table-Zugriff die physikalische Adresse des Page Frame bereits im TLB gespeichert ist, verwendet der Prozessor sie intern, um die physikalische 32-Bit-Adresse zu erzeugen. Ansonsten muss der Prozessor den Page-Table-Eintrag erst aus dem Speicher einlesen. Für den TLB gibt Intel beim 80386 eine 98-prozentige Trefferwahrscheinlichkeit an, das heißt 98 Prozent aller Speicherzugriffe auf Code und Daten referieren eine Page, deren Frame-Adresse vom TLB bereitgehalten wird. Zur Prüfung des Translation-Lookaside-Buffers sind die zwei Testregister TR6 und TR7 vorhanden. Sie werden als Test-Command-Register (TR6) und Testdatenregister (TR7) bezeichnet. Im Bild "Testregister" sehen Sie deren Struktur.

Die TLB-Prüfung unterteilt sich in zwei Vorgänge: Einträge in den TLB schreiben und TLB-Einträge lesen (TLB-Lookup ausführen). Die Einträge in den Testregistern haben dabei folgende Bedeutung.

Das Bit C im Test-Command-Register gibt an, ob ein Schreiben in den TLB (C=0) oder ein TLB-Lookup (C=1) ausgeführt werden soll.

Die lineare Adresse stellt das Tag-Feld des TLBs dar. Bei einem Schreiben in den TLB wird dieser linearen Adresse ein TLB-Eintrag zugeordnet, und dem so zugeordneten Eintrag wird der Inhalt von TR6 und TR7 übergeben. Bei einem TLB-Lookup prüft die Testlogik, ob diese lineare Adresse und die Attributbits mit genau einem TLB-Eintrag übereinstimmen. Ist das der Fall, werden die restlichen Felder von TR6 und das Testregister TR7 aus dem ermittelten Eintrag im TLB geladen.

Die Bedeutung von PL ist abhängig von C unterschiedlich. Wird ein Eintrag des TLBs geschrieben (C=0) und ist PL=1, dann legt REP den Assoziativblock des TLBs fest, der beschrieben wird. Ist PL in diesem Fall gelöscht (PL=0), so wählt ein interner Zeiger in der Paging Unit den zu schreibenden TLB-Block aus. Bei einem TLB-Lookup (C=1) gibt der Wert von PL an, ob der Lookup zu einem Treffer (PL=1) oder Fehltreffer (PL=0) geführt hat.

V ist das Gültigkeitsbit für den TLB-Eintrag. Ein gesetztes V-Bit gibt an, dass der Eintrag gültig, ein gelöschtes, dass der Eintrag ungültig ist. Die restlichen Bits des TR6-Registers entsprechen den Attributbits eines Page-Table-Eintrags. D, D stellen das Dirty-Bit, U, U das User/Supervisor-Bit und W, W das Schreibschutzbit für den entsprechenden TLB-Eintrag dar. Die drei Bits sind in normaler und komplementärer Form angegeben (siehe Tabelle). Man erhält dadurch bei Table-Lookups zum Beispiel die Möglichkeit, die Testlogik anzuweisen, den Wert der Bits für einen Lookup zu ignorieren (wenn beide gesetzt sind, findet die Logik immer eine Übereinstimmung). Sind nämlich sowohl das Attributbit als auch das dazu komplementäre gesetzt (=1), dann ermittelt die Logik für das entsprechende Attribut stets einen Treffer. Anders ausgedrückt ist der Attributwert in diesem Fall unerheblich.

Die Prüfung des TLBs erfolgt durch Schreiben und Lesen (TLB-Lookup) der Testregister TR6 und TR7. Um einen TLB-Eintrag für einen Test zu setzen, müssen Sie zunächst TR7 mit den Werten für die physikalische Adresse, PL=1 und REP laden. Anschließend müssen Sie TR6 mit geeigneten Werten für die lineare Adresse und die Attributbits schreiben und das Command-Bit C löschen. Um ein TLB-Lookup auszuführen (das heißt einen TLB-Eintrag zu lesen), laden Sie TR6 mit der entsprechenden linearen Adresse und setzen C. Anschließend lesen Sie die beiden Testregister TR6 und TR7. Das PL-Bit zeigt an, ob ein Treffer (PL=1) oder Fehltreffer (PL=0) erfolgt ist. Im ersten Fall spiegeln die Testregisterwerte den Inhalt des zugehörigen TLB-Eintrags wider. Bei einem Fehltreffer enthalten sie dagegen ungültige Werte.