Forum: Compiler & IDEs Malloc und Free emulieren


von Michael (Gast)


Lesenswert?

Hallo zusammen,

ich möchte die Funktionen malloc und free emulieren. Also im Grunde 
möchte ich einen fest Speicherbereich reservieren und auf diesem 
Speicherbereich sollen dann die Funktionen userMalloc(...) und 
userFree(...) arbeiten.

Nun ist das sicherlich nicht sonderlich schwer. Ich möchte mich aber 
dennoch vorher erkundigen, ob sowas schon mal jemand gemacht hat und mir 
den Code zur Verfügung stellen kann.

Vielen Dank!
Michael

von troll (Gast)


Lesenswert?

Ich meine im K&R findet sich eine einfache Version.

von Ralf G. (ralg)


Lesenswert?

Michael schrieb:
> ich möchte die Funktionen malloc und free emulieren.

Michael schrieb:
> im Grunde möchte ich

Michael schrieb:
> mir den Code zur Verfügung stellen

:-)

Wenn du besser sein willst als der Compilerbauer...
So ein selbstgebasteltes malloc/free richtet man am speziellen 
Anwendungsfall aus.

von mac4ever (Gast)


Lesenswert?

Michael schrieb:
> Nun ist das sicherlich nicht sonderlich schwer. Ich möchte mich aber
> dennoch vorher erkundigen, ob sowas schon mal jemand gemacht hat und mir
> den Code zur Verfügung stellen kann.

Sonderlich schwer ist das definitiv nicht.
1. Speicherbereich partitionieren
2. Bitmap für die Speicherblockverwendung definieren
3. dynamische Liste erstellen, die Pointer und Größe der allokierten 
Speicherbereiche verwaltet.

malloc() durchsucht Liste und Bitmap nach dem nächsten leeren Bereich, 
der genügend allokierbaren Speicher zu Verfügung stellt und bindet 
diesen entsprechend in die Liste + Bitmap ein

free() entfernt den Eintrag aus der Liste, korrigiert diese und setzt 
die entsprechenden Felder im Bitmap zurück.


So würde ich es umsetzen ... ohne konkret über Randbedingungen 
nachzudenken.

von Rolf M. (rmagnus)


Lesenswert?

Michael schrieb:
> Hallo zusammen,
>
> ich möchte die Funktionen malloc und free emulieren.

Aus welchem Grund? Gibt es für deine Zielarchitektur keins?

> Also im Grunde möchte ich einen fest Speicherbereich reservieren und auf
> diesem Speicherbereich sollen dann die Funktionen userMalloc(...) und
> userFree(...) arbeiten.

Also eben genau das, was malloc/free macht. Implementationen davon 
findet man mit ein wenig Googelei. Es gibt aber unterschiedliche 
Implementationen, je nach Anforderung an Speicherverbrauch und 
Performance.

von Michael (Gast)


Lesenswert?

Hallo,

troll schrieb:
> Ich meine im K&R findet sich eine einfache Version.

guter Tipp:
http://zanasi.chem.unisa.it/download/C.pdf

Auf Seite 149 habe ich ein Beispiel gefunden. Ich werde dieses heute mal 
ausprobieren und kurz Rpckmeldung geben!

Vielen Dank!

von Peter D. (peda)


Lesenswert?

Michael schrieb:
> ich möchte die Funktionen malloc und free emulieren.

Was stört Dich denn an den Compilerfunktionen?

Bzw. um welchen Compiler, welches Target geht es überhaupt?

von Axel S. (a-za-z0-9)


Lesenswert?

Michael schrieb:

> ich möchte die Funktionen malloc und free emulieren.

Nein, möchtest du nicht.

> Also im Grunde
> möchte ich einen fest Speicherbereich reservieren und auf diesem
> Speicherbereich sollen dann die Funktionen userMalloc(...) und
> userFree(...) arbeiten.

Du willst also eine eigene malloc() Implementierung.

Da würde sich als erstes die Frage stellen: warum? Paßt dir was an der 
(den) vorhandenen nicht? Oder geht es um den Lerneffekt? NIH?

Es gibt außerhalb des embedded Bereichs jede Menge malloc() 
Implementationen mit verschiedenen, teilweise widersprüchlichen 
Zielstellungen.

- Speichereffizienz (wenig Overhead)
- Laufzeiteffizienz (*alloc in O(1))
- fragmentierungsfrei (oder zumindest ~arm)
- threadfreundlich
- mit eingebautem Validator

siehe z.B. http://en.wikipedia.org/wiki/C_dynamic_memory_allocation

Außerhalb der embedded-Welt ist der Allocator meist in einer dynamisch 
geladenen Bibliothek und kann dann z.B. durch einen Preload-Mechanismus 
ausgetauscht werden ohne das Programm anfassen zu müssen.

Im embedded Bereich sind malloc() & Co eher ungern gesehene Gäste. Zum 
einen läuft da typischerweise nur eine einzige Applikation, so daß man 
den Speicher auch gleich statisch allozieren kann. Das ist dann nicht 
nur schnell(er) sondern auch automatisch frei von Laufzeitfehlern.

Außerdem läuft embedded Kram meist sehr lange ohne Restart, so daß 
Fragmentation ein echtes Problem darstellt.

Zusammenfassend würde ich sagen, daß die Entwicklung eines eigenen 
Speicherallokators ganz allgemein schon eine anspruchsvolle Aufgabe ist 
und für embedded Software nochmal einen Zacken schärfer. Angesichts der 
erschlagenden Fülle an existierenden Implementierungen bräuchte man auch 
wirklich einen exotischen Sonderwunsch, um eine weitere, eigene 
Implementierung zu rechtfertigen.


XL

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.