fat-lobyte hat geschrieben:Dirty Oerti hat geschrieben:Alle modernen Betriebssysteme, oder zumindest die häufigst benutzten, haben 2 Segemente:
Ein Code-Segment von 0 bis 4GB sowie ein Daten-Segment von 0 bis 4GB.
Kommt daher, dass Segmentierung eigntl nicht mehr zum Adressschutz verwendet wird.
Dazu dient nun Paging.
Wie kann man Paging zum Adressschutz verwenden?
Nunja:
Jeder Prozess hat seine eigenen 4GB, denkt er zumindest.
Die Teile der 4GB, die benutzt werden, sind auch im physikalischen Speicher geladen.
Versucht der Prozess nun auf anderen Speicher zuzugreifen, resultiert das in einem Page Fault und der Prozess bekommt eine neue, LEERE Page (im phys Speicher).
Ein Prozess hat gar nicht die Möglichkeit, auf den physikalischen Speicher zuzugreifen.
Somit bekommt ein Prozess nur die Teile des physikalischen Speichers zu sehen, die ihm auch gehören.
Das ist im Übrigen auch einer der Vorteile, weswegen Paging verwendet wird.
Es bietet besseren Schutz als Segmentierung.
fat-lobyte hat geschrieben:
Dirty Oerti hat geschrieben:Außerdem ist ein Segment zu verschieben eine nahezu unmögliche Aufgabe. Zumindest, wenn das Segment nicht gerade klein ist.
Habe ich etwa geschrieben dass ein Segment verschoben wird?
Achso. Du hattest nur etwas über Verschiebbarkeit von Segmenten geschrieben. Also ein Punkt in dieser Liste.
Egal^^
fat-lobyte hat geschrieben:
Dirty Oerti hat geschrieben:Was ich nur sagen wollte:
Der Adressraum ist nicht mehr aufgeteilt in einzelne Segmente.
Die Segmente überlagern sich komplett und benutzen alle den kompletten Adressraum.
Ich meinte auch eigentlich nicht wirklich "Segmente", das Wort wahr vielleicht unglücklich gewählt. Was ich meinte war eher die funktionelle Aufteilung. Die gibt es ja noch immer, oder? Es gibt doch noch immer einen Bereich im Speicher, wo der Code gespeichert wird, oder? Bei meinen letzten versuchen da reinzuschreiben gabs noch nen Segfault - also nicht schreibbar. Es gibt auch noch immer einen Bereich wo Statische Daten gespeichert werden? Und das letzte mal als ich geschaut habe, gabs den Stack und den Heap auch noch. Soweit ich weiß sind das zwar alles nicht mehr richtige "Segmente", aber die Aufteilung gibt es noch: jeder dieser Bereiche haben bestimmte Adressbereiche, wo die Daten "bevorzugt" gespeichert werden. Bei ELF Beispielsweise beginnt das Code nicht-Segment meistens irgendwo bei 0x80000000, der Stack irgendwo bei 0xbf000000 + einen Zufallswert.
Wie würdest du diese Bereiche, die wahrscheinlich früher einmal wirklich "Segmente" waren dann Nennen?
Die Adressen, von denen du sprichst, sind alle virtuell. Du, bzw der Prozess, hat keinerlei Kontrolle darüber, wo die Daten/Code wirklich liegen oder wie sie im Speicher verteilt sind.
Es gibt natürlich noch einen Bereich im Speicher, in den der Code kommt, und einen, in den die Daten kommen.
So sieht es zumindest für den Prozess aus.
In Wirklichkeit kann das bunt gemsicht sein.
Das Problem liegt wahrscheinlich wirklich darin, dass wir mit Segmenten etwas unterschiedliches meinen.
Du meinst die Segmente, die für den Prozess intern gelten und vom Linker (denke ich, oder?) geregelt werden.
Ich meinte die Segmente, die in der sog GDT bzw LDT eingetragen sind und so etwas wie primitives, und langsames Paging waren.
Nur mit "Pages" von variabler Größe (meist größer als 4KB..).
Außerdem bestand trotzdem die Möglichkeit, auf Segmente anderer Prozesse zuzugreifen.
Wie ich das dann nennen würde?
Keine Ahnung.
*edit*
Es wird hier nur der „Adressraum“ eines Prozesses behandelt, also der Virtuelle Speicher.
Oh, ähm: Das habe ich nicht gesehen.
*/edit*