Ich soll folgende Aufgabe bearbeiten. Angenommen es gibt zwei andere 16-bit-Prozessoren, die auch 20-Bit-Adressen erzeugen können. Die 20-Bit Adressen werden auch aus dem Inhalt zweier Register gebildet – aus einem Offset-Register und einem Segmentregister, wobei nur die vier niederwertigsten Bits für die Segmentangabe verwendet werden. Zur Bildung einer 20-Bit Adresse werden die Segmentbits beim Prozessor A als die vier höchstwertigen Bits (Bit 16 bis 19) genommen und die Adressbits 0 bis 15 werden aus dem Offsetregister genommen. Beim Prozessor B werden die Adressbits 0 bis 3 aus dem Segmentregister genommen und die Adressbits 4 bis 19 aus dem Offsetregister. Angenommen, Sie haben nun einen Speicher von nur 32 KB! Wie viele unterschiedliche Segmente können Sie bei Prozessor A bzw. bei Prozessor B definieren und wie groß kann dabei ein Segment maximal werden? Wie würde das beim 8086er aussehen? Was würde sich ändern, wenn der Speicherausbau auf 256 KB erweitert würde. Ich hab leider davon gar keine Ahnung. Ich hab aber jetzt schon einiges über die Segmentadresse und Offsetadresse und phys. Adresse gelesen. Um die phys. Adresse zu bilden, muss man die Segmentadresse mit 16 multiplizieren und die Offsetadresse addieren. Bei mir ist aber bei einem Speicher von 32KB nach der Segmentanzahl gefragt. Wie mache ich das dann?
Tobias Mehrl schrieb: > Um die phys. Adresse zu bilden, muss man die Segmentadresse mit 16 > multiplizieren und die Offsetadresse addieren. Ich denke darum gehts do ch gar nicht. Ein Speicher von 32kByte hat von der Adressierung her 15 Adressleitungen. 2^15 - 1 ergibt 32767 also 32kByte Das hier ist also das RAM
1 | +-------------------------------------------------------+ |
2 | | | |
3 | +-------------------------------------------------------+ |
4 | | | | | | | | | | | | | | | | |
5 | o o o o o o o o o o o o o o o |
6 | A14 A13 A12 A10 A11 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 |
Und an dieses RAM hängst du jetzt CPU A an. Bei CPU A hast du 16 normale Adressleitungen und mit den Leitungen A16 bis A19 wird die Segmentadressierung gemacht. Also zb so
1 | +-------------------------------------------------------+ |
2 | | RAM | |
3 | +-------------------------------------------------------+ |
4 | | | | | | | | | | | | | | | | |
5 | o o o o o o o o o o o o o o o |
6 | A14 A13 A12 A10 A11 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 |
7 | | | | | | | | | | | | | | | | |
8 | S S S S | | | | | | | | | | | | | | | |
9 | A19 A18 A17 A16 A15 A14 A13 A12 A10 A11 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 |
10 | | | | | | | | | | | | | | | | | | | | | |
11 | +---------------------------------------------------------------------------+ |
12 | | CPU A | |
13 | +---------------------------------------------------------------------------+ |
Ich habe die Leitungen, die die Segmentauswahl bewirken mit einem S markiert. Die Frage ist doch jetzt: mit diesen Segmentleitungen, wieviele Segmente kannst du denn im RAM bilden? Na, da die Segmentleitungen überhaupt nicht zum RAM gehen, ja doch wohl offenbar nur eines. Denn die Segmentleitungen haben überhaupt keinen Einfluss darauf, wie das RAM adressiert wird. Und wie gross ist daher dieses eine Segment. Es umfasst offenbar das komplette RAM, ist daher 32kByte gross Was ist mit CPU B. Die jat ihre Verteilung anders. Die Segmentleitungen liegen an anderer Stelle
1 | +-------------------------------------------------------+ |
2 | | RAM | |
3 | +-------------------------------------------------------+ |
4 | | | | | | | | | | | | | | | | |
5 | o o o o o o o o o o o o o o o |
6 | A14 A13 A12 A10 A11 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 |
7 | | | | | | | | | | | | | | | | |
8 | | | | | | | | | | | | S S S S |
9 | A19 A18 A17 A16 A15 A14 A13 A12 A10 A11 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 |
10 | | | | | | | | | | | | | | | | | | | | | |
11 | +---------------------------------------------------------------------------+ |
12 | | CPU A | |
13 | +---------------------------------------------------------------------------+ |
Alle 4 Adressleitungen, bei denen es um Segmentadressierung geht, gehen voll ins RAM rein. D.h. es wird die Maximalzahl an Segmenten, die mit 4 Leitungen ansprechbar sind, erreicht. Mit 4 Leitungen kann man 2^4 also 16 unterschiedliche Kombinationen erreichen, kann daher auch 16 Segmente unterscheidbar machen. Wie gross ist den jedes einzelne dieser Segmente? Nun von den 16 verbleibenden Adressleitungen gehen 11 ins RAM (alle diejenigen, die nicht mit S markiert sind). Mit 11 Leitungen kann man 2^11, also 2048 Adressen ansprechen, also 2kByte. D.h. Jedes Segment ist 2kByte gross. Mit CPU A hat man daher den Speicher in 1 Segment organisiert, welches 32kByte gross ist. 1 * 32 mahct 32 und genau das ist ja dann auch die Größe des RAMS: CPU B hingegen benutzt 16 Segmente, wobei jedes Segment 2k gross, ist. 16 * 2 ergibt wieder 32kByte, also genau die Größe des Speichers der tatsächlich zur Verfügung steht. Und das muss ja auch so sein, denn weder CPU A noch CPU B können Speicher aus dem Hut zaubern. Es sind 32kByte im RAM verfügbar, und die können sie adressieren, egal wie sich diese 32kByte in Segmente und Segmentgröße aufteilt.
Hört sich plausibel an, soweit die Aufgabe stimmt. Aber mir kommt es spanisch vor, daß die Segmentadresse in die unteren Bits der resultierenden Adresse eingehen soll: Tobias Mehrl schrieb: > Beim > Prozessor B werden die Adressbits 0 bis 3 aus dem Segmentregister > genommen und die Adressbits 4 bis 19 aus dem Offsetregister. Das Segmentregister müsste doch den oberen Teil der Gesamtadresse liefern, und das Offset dann im Segment die (Fein-) Adressierung machen, wie es auch bei A der Fall ist?
Klaus Wachtler schrieb: > Hört sich plausibel an, soweit die Aufgabe stimmt. > > Aber mir kommt es spanisch vor, daß die Segmentadresse in die > unteren Bits der resultierenden Adresse eingehen soll: > > Tobias Mehrl schrieb: >> Beim >> Prozessor B werden die Adressbits 0 bis 3 aus dem Segmentregister >> genommen und die Adressbits 4 bis 19 aus dem Offsetregister. > > Das Segmentregister müsste doch den oberen Teil der > Gesamtadresse liefern, und das Offset dann im Segment die > (Fein-) Adressierung machen, wie es auch bei A der Fall ist? Seh ich auch so. Aber ich denke das ist ein konstruiertes Beispiel, bei dem es hauptsählich darum geht, ob der Proband verstanden hat, was er mit den Segmentadressen machen soll und was daraus folgt. Zumindest hab ich noch nie so eine CPU gesehen, was zugegebenermassen nicht viel heißen mag.
Ich denke eher, daß der Aufgabensteller es nicht verstanden hat, oder es irgendwo unterwegs falsch abgeschrieben wurde. Denn eine Segmentierung, mit der man bei festem Segmentregister nicht mehr aufeinanderfolgende Adressen erreichen kann, naja... Genau genommen wäre ja dann das Offsetregister mit den oberen Bits jetzt das Segmentregister, und das bisherige Segmentregister wird zum Offsetregister. Segmentgröße wäre dann 16. Gottseidank nicht meine Aufgabe :-)
Klaus Wachtler schrieb: > Denn eine Segmentierung, mit der man bei festem Segmentregister > nicht mehr aufeinanderfolgende Adressen erreichen kann, naja... Ist nur ein Problem, wenn man sich den Speicher als Array vorstellt, denn tatsächlich kann man aufeinanderfolgende Adressen erreichen. Diese liegen nur nicht hintereinander in deinem gedachten Array. Z.B. das Speichermanagement weist einem Task das Segment 0, dem anderen Task das Segment 1 zu. In beiden wird ein Pointer von 0 hochgezählt. Task eins greift auf Adresse 0, physisch 0, zu, dann auf Adresse 1, physisch 16, ... Task zwei greift auf Adresse 0, physisch 1, zu, dann auf Adresse 1, physisch 17, ... Und siehe da, sie können beide auf die Adressen 0, 1, ... zugreifen ohne sich Sorgen machen zu müssen, wem sie in die Quere kommen. Und solange mindestens 16 Byte zur Verfügung stehen verliert man kein Segment sondern hat nur mehr oder weniger Speicher. Bei CPU A hat man bei beispielsweise 32kByte plötzlich nur noch ein Segment und kann den Speicher nicht mehr in Segmente unterteilen. (Siehe die anschauliche Darstellung von Karl heinz Buchegger.) Klaus Wachtler schrieb: > Ich denke eher, daß der Aufgabensteller es nicht verstanden > hat, oder es irgendwo unterwegs falsch abgeschrieben wurde. Der Aufgabensteller will wohl darauf hinaus, was man alles mit einer Segmentierung anstellen kann, nicht unbedingt wie die "perfekte" Segmentierung aussieht.
Karl heinz Buchegger schrieb: > Aber ich denke das ist ein konstruiertes Beispiel, Das hab ich mir auch gedacht, als ich die Segmentierung von x86ern gesehen habe, wo sich die Segmente überschneiden. Wahrscheinlich ging es damals darum, bei halbleeren Segmenten den restlichen Speicherplatz im nächsten Segment verwerten zu können, und nicht darum, möglichst viel Speicher adressieren zu können. (Soviel Speicher hat doch eh nie jemand. ;-p )
horst schrieb: > Ist nur ein Problem, wenn man sich den Speicher als Array vorstellt, > denn tatsächlich kann man aufeinanderfolgende Adressen erreichen. Diese > liegen nur nicht hintereinander in deinem gedachten Array. Hast recht, das funktioniert natürlich. Da fehlte es mir an Phantasie. Die Rechnung von KHB stimmt dann auch mit 16 * 2kB.
Hallo! Erstmal ein großes Dankeschön an euch für die vielen Antworten. Das hat mich schon mal sehr viel weiter gebracht und ich denke ich hab die "Problematik" soweit auch verstanden. Und, nein, ich hab keinen Fehler "unterwegs beim Abschreiben" gemacht, denn ich hab die Aufgabe als PDF vor mir und hab sie per copy and paste hier reingestellt. Eine Sache verstehe ich trotzdem nicht: Karl heinz Buchegger schrieb: > Nun von den 16 verbleibenden Adressleitungen gehen 11 ins RAM (alle > diejenigen, die nicht mit S markiert sind). Mit 11 Leitungen kann man > 2^11, also 2048 Adressen ansprechen, also 2kByte. D.h. Jedes Segment ist > 2kByte gross. Laut der Zeichnung adressiert die CPU B den RAM mit 15 Leitungen (von A0 bis A14). Sie schreiben aber jetzt, dass von den 16 (!) verbleibenden Leitungen 11 ins RAM gehen...? Wenn die CPU das RAM doch nur mit 15 Leitungen adressieren kann, wie können dann auf einmal 16 Leitungen entstehen? Was ist eigentlich die Adressleitung A15 die (wie Fall A zeigt) weder eine Segmentleitung ist noch mit dem RAM verbunden ist?
Tobias Mehrl schrieb: > Laut der Zeichnung adressiert die CPU B den RAM mit 15 Leitungen (von A0 > bis A14). Sie schreiben aber jetzt, dass von den 16 (!) verbleibenden > Leitungen 11 ins RAM gehen...? Wenn die CPU das RAM doch nur mit 15 > Leitungen adressieren kann, wie können dann auf einmal 16 Leitungen > entstehen? Die 16 ist ein Tippfehler und sollte 15 heissen. Zeichne dir dir Situation auf und zähl mit den Fingern die Leitungen. Das ist die sicherste Variante (ernsthaft: das ist es wirklich, dadurch dass die unterste Leitung die A0 ist, kommt man da schon mal gerne +/-1 durcheinander) > Was ist eigentlich die Adressleitung A15 die (wie Fall A zeigt) weder > eine Segmentleitung ist noch mit dem RAM verbunden ist? Das ist einfach eine Leitung die ins Leere geht. Praktisch bedeutet das, dass dieselbe Speicherzelle im RAM unter 2 verschiedenen Adresse erreichbar ist. Legt die CPU die Adresse 0x8000 auf den Adressbus (ich ignoriere jetzt die Segmente), dann sieht das RAM dasselbe Bitmuster, wie wenn die CPU die Adresse 0x0000 auf den Bus gelegt hätte (und natürlich auch 0x8001 und 0x0001, 0x8002 und 0x0002, ...). D.h. wenn die CPU alle Adresse von 0x0000 bis 0xFFFF durchgeht, dann findet sie den RAM Inhalt 2 mal im Speicher, wobei jeweils alle Zellen deren Adresse sich nur im A15 unterscheiden aus Sicht des RAM immer die gleiche Speicherzelle ist.
In der Aufgabe heißt es ja weiter man solle jetzt den Speicher auf 2^18 = 256 kByte ausbauen. Für den Prozessor A ändert sich ja dann die Anzahl der Adressleitungen. D.h. ich hab jetzt 18 Adressleitungen die ins RAM führen müssen. Der Prozessor selber aber hat weiterhin 20 Adressleitungen, das heißt jetzt, es führen 2 Segmentadressleitungen ins Ram woraus resultiert, dass ich 2^2 (also 4) mögliche unterschiedliche ansprechbare Kominationen bekommen die meine Segmente bilden. Die größe eines jeden Segments berechnet sich dann mit 256kByte/4=64kByte. Jedes der vier Segmente ist dann 64kByte groß. Stimmen meine Überlegungen soweit?
Noch eine kurze Frage: Karl heinz Buchegger schrieb: > Nun von den 16 verbleibenden Adressleitungen gehen 11 ins RAM (alle > diejenigen, die nicht mit S markiert sind). Mit 11 Leitungen kann man > 2^11, also 2048 Adressen ansprechen, also 2kByte. D.h. Jedes Segment ist > 2kByte gross. Wenn mir nun 11 Leitungen bei Prozessor B mit dem 32KB RAM übrig bleiben, kann man 2^11 Adressen ansprechen. (soweit klar...) Woher weiß ich aber dann gleich daraus, dass diese 2048 ansprechbare unterschiedlichen Adressen gleich der Größe der enstehenden Segmente ist? Irgendwie versteh ich das nicht im Fall von 32KB Ram und den 2048 Adressen müsste ich doch die Größe der einzelnen Segmente dann mit 32768KB/2048KB=16KB-Segemtngröße berechnen, oder? Ansonsten würde mein Beispiel für den Fall mit 256KB nicht stimmen...
Tobias Mehrl schrieb: > Irgendwie versteh ich das nicht im Fall von 32KB Ram und den 2048 > Adressen müsste ich doch die Größe der einzelnen Segmente dann mit > 32768KB/2048KB=16KB-Segemtngröße berechnen, oder? Du solltest in die Hardware Entwicklung gehen :-) Die Rechnerbauer hätten ihre liebe Freude mit dir, wenn du in einem 32k RAM 16 gleich große, nicht überlappende Segmente mit jeweils 16k unterbringst. 16 Segmente mit jeweils 16k. das macht dann in Summe 256kByte. Und das alles in inem 32kByte RAM. Nicht schlecht, Herr Specht.
Tobias Mehrl schrieb: > Wenn mir nun 11 Leitungen bei Prozessor B mit dem 32KB RAM übrig > bleiben, kann man 2^11 Adressen ansprechen. (soweit klar...) Woher weiß > ich aber dann gleich daraus, dass diese 2048 ansprechbare > unterschiedlichen Adressen gleich der Größe der enstehenden Segmente > ist? Weil 1 Segment sich dadurch definiert, wieviel Speicher du ohne Umstellen der Segmentleitungen adressieren kannst. Wenn du also die 4 Segmentleitungen auf einen bestimmten Wert einfrierst, wieviele Speicherzellen kannst du dann mit den restlichen Adressleitungen noch ansprechen?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.