Autor Thema: malloc/free für gcc-Programme mit Segmentierung und ohne Paging?  (Gelesen 6064 mal)

Sur3

  • Beiträge: 1
    • Profil anzeigen
Gespeichert
Hallo, ich versuche momentan mein OS ohne Paging und nur mit Segmentierung zu schreiben und stehe jetzt vor dem Problem, daß der gcc keine Segmentierung unterstützt, daher fällt mir gerade keine vernünftige Möglichkeit ein malloc/free mit durch gcc kompilierten Programmen zum laufen zu bringen, die einzige Möglichkeit die mir gerade einfällt ist:

1. etwas zusätzlichen Platz für malloc/free für jedes Programm zu allozieren
2. wenn der zusätzliche Platz nicht ausreicht den gesamten Datenbereich des Programmes in einen größeren Bereich zu kopieren

Dies scheint aber extrem ineffektiv zu seien, daher wollte ich mal fragen ob noch jemand eine bessere Möglichkeit ohne Paging und mit Segmentierung kennt, vielleicht übersehe ich irgendwelche Möglichkeiten?

Beste Grüße
Sur3
« Letzte Änderung: 24. October 2015, 16:30 von Sur3 »

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 25. October 2015, 00:01 »
(a) Du kannst in deine Binaries reinschreiben, wieviel Speicher sie maximal belegen dürfen, und reservierst dann den entsprechenden Speicher beim Programmstart vor. Das ist der klassische UNIX-Ansatz, der die Speicherverwaltung auf den BRK/SBRK-Syscalls aufbaut. Wenn hinter dem Programm noch Platz ist, kannst du das Datensegment (und damit den Heap) auch dynamisch vergrößern. Nachteil: Die meisten Programme verschwenden Speicher, und Programme werden - je nach Input - sterben. (Der Stack nutzt übrigens zwingend diesen Ansatz.)

(b) Der Heap muss aber nicht an einem Stück vorliegen und darf damit auch über mehrere Segmente verteilt sein. Du reservierst einfach eine gewisse Menge an Speicher und wenn das Programm zusätzlichen Speicher mittels malloc() anfordert, dann beschaffst du einfach ein zusätzliches Segment mit mehr Speicher. Nachteil: Plötzlich sind deine Pointer nicht mehr linear, sondern bestehen aus Adresse und Segmentnummer. Damit kommt so gut wie kein moderner Compiler klar. (Vielleicht Watcom C/C++?)

(c) Wer braucht schon Speicherschutz für den Heap? Du legst ein globales Segment für den Heap an, und beantwortest alle Anfragen aller Prozesse aus diesem Segment (Memory Pool). Linux auf NOMMU-Architekturen (uClinux) macht das so, um möglichst wenig Speicher zu verschwenden. Nachteil: Wenn dein Heap zu sehr fragmentiert, kannst du nichts dagegen tun.

Dynamischer Speicher ist dynamisch, und damit anwendungs- und datenabhängig. Mit Segmentierung allein wirst du keine gute Lösung mit Speicherschutz bekommen können, solange du nichts über deine Anwendungen weißt.

Beispiel: Speicherfragmentierung auf eingebetteten Systemen ist meist kein Problem, weil Prozesse in der Regel nur beim Systemstart gestartet werden und der Speicherverbrauch relativ statisch ist (solche Systeme sind oft kritisch und dürfen daher keinen out-of-memory wichtiger Dienste erleben und sind daher entsprechend aufgebaut).

 

Einloggen