Forum: PC-Programmierung Berechnung der Segmentanzahl?


von Tobias Mehrl (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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 :-)

von horst (Gast)


Lesenswert?

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.

von horst (Gast)


Lesenswert?

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 )

von Klaus W. (mfgkw)


Lesenswert?

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.

von Tobias Mehrl (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Tobias Mehrl (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

Tobias Mehrl schrieb:

> Stimmen meine Überlegungen soweit?

Sieht gut aus

von Tobias Mehrl (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.