Ist Segmentierung noch aktuell?



  • Hallo!

    Ich beschäftige mich jetzt seit ein paar Tagen mit virtuellem Speicher und Paging. Manche Tutorials haben auch das Thema Segmentierung angeschnitten und in einigen wurde angedeutet, dass man früher eher Segmentierung benutzt hat und heute immer mehr Paging benutzt. In ein paar Tutorials stand aber auch, dass Segmentierung und Paging gemeinsam genutzt wird.
    Für mich ist das teilweise jetzt alles etwas wirr.

    Meine Fragen:
    1. Sehe ich das richtig, dass Segmentierung für den Assemblerprogrammierer sichtbar ist (sind das diese DS:foo Dinger?), Paging hingegen völlig unsichtbar?
    2. Wenn ein System Segmentierung UND Paging benutzt, könnte man dan sagen das Segmentierung eine Schicht über Paging ist? (also die Segmente wiederum zusammengesetzt sind aus Pages)
    3. Die wichtigste Frage: Benutzt man heutzutage noch Segmentierung? Oder nur noch den kompletten linearen Adressraum mit Paging?

    Danke :xmas1:



  • Hallo,

    1.: Ja , Ja
    2.: Ja
    3.: Alle modernen (wo ich jetzt mal aktuelle Windowse mit einschließe) Betriebssysteme, die ich kenne, benutzen nur Paging. Segmentierung ist, meines Wissens nach, auch nur auf x86 verwendet worden. Ich glaube die PowerPC-Architektur kann auch Segmente bieten aber das wird von Niemanden benutzt. Alle anderen CPUs, die ich kenne, bieten keine Segmentierung.

    Wenn ich mich recht erinnere benutzt XEN http://xen.org/ im x86-32Bit-Mode Segmente um sich selbst vor den Betriebssystemen zu verbergen.

    Der GCC kennt keine Far-Pointer, also keine segmentierten Speicherzugriffe.
    Ob moderne Executable-Formate wie ELF oder PE-EXE Segmentierung unterstützen, wie z.B. MZ-EXE aus DOS-Zeiten weis ich nicht, aber ich denke mal eher nicht.

    Ich persönlich finde es schade das die Segmentierung ausgestorben ist, damit währen viele Bugs heutiger Programme (z.B. Code-Injection mit Buffer-Overflows) gar nicht möglich. Außerdem kostet Segmentierung weniger Performance als Paging. In einem OS das Segmentierung und Paging verwendet könnte man den Speicher zur Laufzeit im Hintergrund defragmentieren und wenn Paging dann nicht mehr zur Vergrößerung des Arbeitsspeichers benötigt wird das Paging komplett abschalten.

    Grüße
    Erik



  • Heißt das, dass wenn ich auf Vista oder Linux mein C++ Programm übersetze, ich dann im Assemblercode definitiv nirgends mehr ein DS: oder CS: finden werde?



  • Exakt!

    Die Segmentregister werden bei der Befehlsausführung intern zwar noch verwendet aber es wird überall Offset:0 und Size:4GByte reingeladen so das es egal ist. PUSH und POP verwenden immer SS:ESP und MOVS immer ES:EDI << DS:ESI. Aber wie gesagt das ist völlig egal da alle Segmente auf den selben linearen Speicher zeigen.

    Die von Dir gemeinten "Attribute" werden beim Assemblieren in Präfixe umgesetzt die das Default-Segment, welches der Befehl ansonsten automatisch verwendet, überschreiben.

    Daher hat AMD im 64Bit Modus die Segmente wegoptimiert. Dort gibt es keine Segmentierung mehr (Okay es gibt 2 kleine Überbleibsel aber die sind kaum relevant).

    Grüße
    Erik



  • Wow, Danke. Hast mir echt schon viel geholfen! :xmas1:

    Noch eine Frage. Ich habe mir dieses Tutorial durchgelesen: http://www.fh-zwickau.de/doc/prmo/pmtutor/text/ , das ich auch recht gut finde (auch wenn einen als Anfänger die ganzen Details mit Deskriptoren oder LDT und GDT erschlagen und ich nicht alles verstanden habe).
    Auf jeden Fall geht das Tutorial im Kapitel 2.2 ( http://www.fh-zwickau.de/doc/prmo/pmtutor/text/p_all2.htm ) auf die Adressierung des Arbeitsspeicher im Protected Mode ein und es fallen ständig Begriffe wie Deskriptoren, Selektoren (alle verknüpft mit der Thematik Segmentierung) und bei der Umrechung einer virt. Adresse auf eine physikalische Adresse ist auch Segmentierung im Spiel. Ist dann dieses Tutorial für heutige Prozessoren veraltet oder machen die das intern noch immer so und nur der Programmierer bekommt davon nichts mehr mit?



  • ich glaube segmentierung ist immer noch essentiel. sowas wie das no-execution-bit von cpus waere ohne segmente nicht moeglich.

    ich glaube mich wage zu erinnern dass compiler exceptions-scopes mittels segmenten realisieren.
    auf powerpc kann man auch das beschreiben des code (bzw text) segments verbieten genau wie das ausfuehren von code vom stack segment (ich glaube sogar das explizite lesen aus dem code segment, also ausserhalb des program counters).

    aber ich hab mich damit nicht tiefergehend beschaeftigt.



  • Hallo,

    Das NX (AMD-Terminus) bzw. XD (Intel-Terminus) -Bit sitzt in den Page-Deskriptoren und wird für jede Page individuell gesetzt. In den Segmentdescriptoren hätte es auch keine Wirkung da alle Segmente auf den selben linearen Speicher (Offset:0 und Size:4GByte) zeigen. Eine Alternative währe allen Code auf die niedrigen Adressen zu legen und die Code-Segmentgröße entsprechend herrab zu setzen so das der Heap und der Stack außerhalb des Code-Segments liegen aber dann könnte man keine DLLs o.ä. mehr laden.

    @inti22
    Heutige x86 CPUs im 32Bit Modus berechnen die Segment-Adressen immer mit aber da alle Segmente immer auf "gesamten linearen Speicher" stehen hat das keine Wirkung mehr. Die vielen Schutzmechanismen die Intel sich damals für den 386 ausgedacht hat werden damit ausgehebelt und mussten später, über so Krücken wie das NX-Bit, wieder nachgerüstet werden.

    Grüße
    Erik



  • Danke erik_vikinger 👍


Anmelden zum Antworten