Üblicherweise hören Beschreibungen der Funktionsweise eines Prozessors an dieser Stelle auf, aber im Interesse der Vollständigkeit wollen wir hier doch einmal ein wenig tiefer in die Materie schauen; das Laden der Instruktion aus dem Speicher in ein Register ist nämlich an sich ein interessanter Vorgang.
Nehmen wir einmal an, die Instruktion wird aus dem Level-1-Cache geladen (was in der Regel auch der Fall ist). Der Cache ist aus sogenannten SRAM-Zellen aufgebaut; das sind im Grunde Flipflops mit einer speziellen Steuerelektronik. Untenstehende Abbildung (entnommen aus der Wikipedia) zeigt eine derartige Zelle, die ein einzelnes Bit speichern kann.
Die Zelle besitzt die 3 Anschlüsse WL (Word Line), BL und BL. WL dient zur Aktivierung der Zelle – solange an WL 0 anliegt, geben BL und BL eine 0 aus. Soll nun der Wert des in der Zelle gespeicherten Bits ausgelesen werden, wird WL auf 1 geschaltet, woraufhin an BL der gespeicherte Wert (0 oder 1) anliegt (an BL entsprechend der invertierte Wert). Zum Schreiben eines Wertes in die Zelle reicht es, den gewünschten Wert an BL anzulegen (an BL wiederum entsprechend den invertierten Wert) und WL anschließend wieder auf 1 zu setzen (für die technisch Versierteren: damit das funktioniert, muss die an BL/BL angelegte Spannung größer sein als die in den Transistoren gespeicherte, um den aktuellen Wert zu überschreiben). Schaltet man mehrere dieser Zellen in einer zweidimensionalen Matrix (also einem Gitter) zusammen, so kann man damit auch größere Werte speichern – und so sind auch Caches aufgebaut. Üblicherweise hat das Gitter dabei so viele Spalten, wie ein Byte Bits hat (meistens 8, aber nicht immer) und entsprechend so viele Zeilen, wie Bytes im Cache gespeichert werden sollen. Über das Ansprechen einer bestimmten Zeile kann demzufolge ein Byte aus dem Cache ausgelesen werden. Ein Cache mit 5 Bytes, die jeweils aus 4 Bit bestehen, könnte also folgendermaßen aussehen; die einzelnen Bytes werden jeweils über die Eingänge b1 bis b5 angesprochen, wobei die einzelnen Bits der Zeilen an den Ausgängen o1 bis o4 anliegen (die invertierten Ausgänge der SRAM-Zellen habe ich einmal weggelassen):
Bleibt noch zu klären, wie denn nun eine bestimmte Zeile angesprochen werden kann. Hierfür wird in der Regel ein sogenannter Decoder benutzt (den wir nachher auch noch einmal benötigen werden). Vereinfacht gesagt ist ein Decoder ein Bauelement, welches ein Signal in ein anderes umwandelt. Das wichtigste dabei ist, dass das Eingangs- und das Ausgangssignal nicht die gleiche Länge haben müssen – ein Decoder kann also etwa eine Bitkette (die ja nichts anderes ist als ein Signal) der Länge 2 in eine Bitkette der Länge 4 überführen. Hierbei können natürlich nie sämtliche Bit-Kombinationen an den Ausgängen erreicht werden (bei einem Eingangssignal mit 2 Bit sind eben nur insgesamt 4 Kombinationen möglich), aber das benötigt man auch gar nicht. Da der Aufbau eines Decoders in der Regel von der Signaltransformation abhängt, die er durchführen soll, spare ich mir diesmal das interaktive Bildchen; nur so viel: er lässt sich mit einfachen Grundbauelementen wie UND-Gattern und Invertern bauen. Im Folgenden der schematische Aufbau eines beispielhaften Decoders mit einem 2-Bit-Signal als Eingang und einem 4-Bit-Signal als Ausgang, gleich mit Wertetabelle (Quelle ist mal wieder die Wikipedia):
An dieser Schaltung lässt sich auch gleich sehen, wie ein Decoder helfen kann, einzelne Zeilen in einem Cache anzusprechen, indem er nämlich ein Eingangssignal (die Adresse) immer so transformiert, dass an lediglich einem Ausgang eine 1 anliegt (ein Decoder muss nicht zwangsläufig so arbeiten – die Ausgaben können beliebige Bitketten sein). Mit obigem Decoder könnten 4 Bytes adressiert werden, bei mehr Eingängen dann auch entsprechend mehr Bytes. Formal ausgedrückt: bei einer Adressbreite von n Bits können 2n Bytes adressiert werden; bei den heute üblichen Rechnern mit 32 Bit wären das 232, also etwas mehr als 4 Milliarden Bytes – das entspricht 4 Gigabyte (deswegen bringt es übrigens auch nichts, in einen Rechner mit einem 32-Bit-Betriebssystem mehr als 4 Gigabyte RAM einzubauen – sie können schlicht nicht vollständig adressiert werden).
Kommentare (12)