FB18 - Das Forum für Informatik

fb18.de / Diplom Informatik / Unterbereich Grundstudium / Technische Informatik

Segmentierung

Segmentierung 2003-10-24 16:28
Anonymer User
Hi,

hab nicht so ganz den Sinn und Zweck von Segmentierung verstanden. Kann mir diesen jemand mal kurz und prägnant (am besten anhand eines Beispiels) erläutern.

Vielen Dank!!!

Re: Segmentierung 2003-10-24 18:00
TriPhoenix
Alsoo…stell dir mal vor du hast einen Speicher. Und möchtest darin Programme laufen lassen und zwar mehrere auf einmal. Dann musst du die ja reinladen. Das Problem ist nun, dass die meisten Programme ja iregdnwie Adressen auf sich bezogen benutzen, z.B. Konstanten und auch vor allem Sprungadressen im Programmcode. Die stehen natürlich im Allgemeinen fest im Code. Das Programm ist z.B. also in der Form auf der Platte gewöhnt, ab Adresse 0 zu liegen. Etwas was 100 Bytes nach Beginn liegt hat also Adresse 100. Sagen wir nun noch das Programm wäre 4000 Bytes lang. Das Prorgamm wird gestartet und liegt glücklich und zufrieden im Speicher ab Adresse 0. Nun willst du aber ein zweites Programm starten, das auch ab Adresse 0 liegen möchte, das geht aber ja garnicht, da liegt schon eines. Du kannst es mindestens ab Adresse 4000 laden. Eine Adresse die das Programm für 100 hält ist also dann real 4100. Nun kann man beim laden natürlcih all diese Stellen im Speicher "Patchen", aber schön ist das auch nicht unbedingt.
Deswegen führst du Segmente ein. So erhält jedes Programmsegment einen Startpunkt, alle Adressen gehen dann relativ zu der Adresse. In unserem Beispiel gibst du dem ersten Programm ein Segment mit der Startadresse 0 und Länge 4000. So greift das Programm weiter normal auf seine Sachen zu.
Das zweite Programm jedoch bekommt ein Segment mit Startadresse 4000 und irgendeiner Länge (wie das Programm halt lang ist). Jetzt kann das Programm weiterhin die Stelle 100 Bytes nach Start mit der Adresse 100 ansprechen. Die CPU sieht ja das dazugehörige Segment und macht wenn das Programm von Adresse 100 redet einfach 4100 draus ohen dass das Programm das merkt. So kannst du Programme an beliebige Orte legen, das Programm kann immer davon ausgehen, ab der Adresse 0 zu liegen.

Ein zweiter nützlicher Punkt ist noch die Sicherheit. Jedes Segment hat eine Länge, greift man darüber hinaus, gibts nen Fehler. Ohne Segmentierung z.B. könnte das erste Programm z.B. durch einen Programmierfehler auf Adresse 4100 anstatt 100 zugreifen. Und schon würde es in den Bereich des zweiten Programmes schreiben. Mit Segmenten fängt die CPU den illegalen Zugriff einfach ab und schützt so die Programme voreinander.

HTH
TriPhoenix

Re: Segmentierung 2003-10-24 23:20
MoKrates
Nun kann man beim laden natürlcih all diese Stellen im Speicher "Patchen", aber schön ist das auch nicht unbedingt.

Wird aber trotzdem gemacht. Erstmal natuerlich beim Compilieren (der Linker macht "relocation"), aber auch der Runtime-Linker macht so etwas. Mit den DLLs (.so's) zB.

MoKrates

Re: Segmentierung 2003-10-24 23:44
TriPhoenix
Nun kann man beim laden natürlcih all diese Stellen im Speicher "Patchen", aber schön ist das auch nicht unbedingt.

Wird aber trotzdem gemacht. Erstmal natuerlich beim Compilieren (der Linker macht "relocation"), aber auch der Runtime-Linker macht so etwas. Mit den DLLs (.so's) zB.

Ich weiß, schöner machts das aber auch nicht [img]http://www.fb18.de/gfx/24.gif[/img]

Re: Segmentierung 2003-10-26 22:37
asdf
hab nicht so ganz den Sinn und Zweck von Segmentierung verstanden.
Ich erkäre mir den Sinn von Segmentierung so, dass man
logisch zusammenhängende Teile eines Programmes von einander
trennt und in Segmente steckt, z.B. den Code-Teil (text) des Programmes in das Codesegement, den Daten-Teil in das Datensegment und den Stack in das Stacksegment.

Re: Segmentierung 2003-10-26 23:33
Alter Sack
hab nicht so ganz den Sinn und Zweck von Segmentierung verstanden.
Ich erkäre mir den Sinn von Segmentierung so, dass man
logisch zusammenhängende Teile eines Programmes von einander
trennt und in Segmente steckt, z.B. den Code-Teil (text) des Programmes in das Codesegement, den Daten-Teil in das Datensegment und den Stack in das Stacksegment.

Okay, um das deutlich zu sagen, ich schließe mich meinen Vorrednern (Tri, Mo, und auch Dir) an.

Wenn Du nachschlagen willst, empfehlen ich Dir die Lektüre von Tanenbaum, et. al. "Computerarchitektur" von 2001, deutsch S. 489ff, da wird klar, daß es um beides geht. Einerseits die Programme mit den gewünschten Adressen zu versorgen, als auch "gierigen" Bereichen, wie Variablen Spielraum zu geben.

Gruß, Dirk

Re: Segmentierung 2003-10-27 01:58
MoKrates
Urspruenglich kommt das doch aus der 16 Bit Welt, als man mehr Speicher hatte, als man mit 16 Bit adressieren konnte (naemlich soviel, dass nobody ought to need more, 640 kb).
Da hatte man immer ein Segmentregister (je nach Maschinenanweisung, SS, ES, CS oder DS) das, um es platt zu sagen mit 16 multipliziert wurde und mit der eigentlichen Adresse addiert wurde, um die eigentliche Adresse zu erhalten. D.h. die Segmente konnten sich alle ueberlagern, was witzige Effekte haben konnte, wenn man nicht genau aufgepasst hat.

MoKrates

Re: Segmentierung 2003-10-27 13:36
TriPhoenix
Urspruenglich kommt das doch aus der 16 Bit Welt, als man mehr Speicher hatte, als man mit 16 Bit adressieren konnte (naemlich soviel, dass nobody ought to need more, 640 kb).
Da hatte man immer ein Segmentregister (je nach Maschinenanweisung, SS, ES, CS oder DS) das, um es platt zu sagen mit 16 multipliziert wurde und mit der eigentlichen Adresse addiert wurde, um die eigentliche Adresse zu erhalten. D.h. die Segmente konnten sich alle ueberlagern, was witzige Effekte haben konnte, wenn man nicht genau aufgepasst hat.

Also die Segmente sind aber älter als der 8086