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
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
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
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?