Bei der Untersuchung von Betriebssystemen (hauptsächlich mit Linux als Referenz) gibt es einige Punkte, die ich in dem von mir untersuchten Material nicht gut erklärt habe.
Programme, die in den Speicher geladen werden, werden häufig als in Segmente von Text, Daten, Stack usw. unterteilt beschrieben, selbst im Kontext von Betriebssystemen wie Linux, wo der virtuelle Speicher rein auf Paging basiert. Ist es so, dass nur das Programm und nicht der Speicher selbst als segmentiert bezeichnet wird? Wenn das so ist, finde ich die Terminologie verwirrend.
Ich habe gesehen, dass malloc unter Linux mit dem Aufruf 'sbrk' implementiert werden kann, der die Größe des Datensegments erhöht. Ist dieses "Datensegment" wieder nur eine Speicherregion, die für Daten nach Konvention und nicht für ein "echtes" Segment verwendet wird? (Zusätzliche Frage: 'sbrk' scheint nicht in der Lage zu sein, die Größe des 'Segments' zu verringern. Bedeutet dies, dass ein Prozess niemals Speicher für das Betriebssystem freigeben kann, außer das Beenden?)
Ich bin auch daran interessiert zu wissen, warum moderne Betriebssysteme keine (paged) Segmentierung verwenden. Würde es bestimmte Arten von Angriffen nicht verhindern, dass der Code in seinem eigenen geschützten Segment liegt, wodurch die Sicherheit erhöht wird? Auf der anderen Seite würde dies z. JIT Compilation unmöglich / schwierig?
Neben "Ja" / "Nein" Antworten auf die obigen Fragen, bin ich an jeder aufschlussreichen Ausarbeitung zu diesem Thema interessiert.
Vielen Dank im Voraus.
Das Segment in "Datensegment" hat nichts mit der Hardware-Segmentierung zu tun, was ein Merkmal von wenig Relevanz für moderne Betriebssysteme ist (d. h. redundant in Bezug auf Paging), die auf Paging angewiesen sind, um virtuellen Speicher zu implementieren. Segmente haben auch schwerwiegende Nachteile im Vergleich zum Paging (z. B. zusammenhängender Speicher in einem Segment muss physikalisch zusammenhängend sein) ohne irgendeinen Vorteil. Unter "Segment" für Benutzer-Space-Programme wird wörtlich ein zusammenhängender Abschnitt des virtuellen Raums des Prozesses verstanden.
Viele Architekturen haben keine Segmentierung mehr. Auf x86 ist die Segmentierung nur eine historische Nutzlast und ist so eingerichtet, dass ein Code- und Datensegment den gesamten Adressraum abdeckt, da die Segmentierung nicht umgangen werden kann.
Ihre Frage zur Freigabe von Speicher, die durch sbrk erhalten wurde, wird hier beantwortet: How speichere ich Speicher, der von sbrk () erhalten wurde?
Tags und Links operating-system virtual-memory memory-segmentation