Autor Thema: malloc und free  (Gelesen 4162 mal)

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« am: 13. August 2009, 12:37 »
Hallo zusammen,

ich bin gerade dabei meine Speicherverwaltung umzuschreiben.
Habe bisher ein malloc und ein kmalloc.
Das ist mir aber zu kompliziert.
Am liebsten hätte ich einfach ein malloc aus der stdlibc, leider habe ich jetzt nur ein Problem.
Ich muss dann ja zwischen Kernel und Userspace unterscheiden.
Wie kann ich das am besten machen?
Ich möchte malloc nicht immer erst einen syscall ausführen lassen um zu wissen in welchem Adressraum man ist.
Eine zusammenhängende Freispeicherliste zwischen Kernel und Userspace ist genau so bescheiden...

Habt ihr da eine Idee?

gruß
rizor
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 13. August 2009, 12:56 »
Ich verwende ein minimal angepasstest dlmalloc:
* memory.c
* memory.h
Dieses malloc verwendet (so wie ich es konfiguriert habe) die Funktion sbrk, welche wiederum eine Funktion namens _LIBOS_allocPage aufruft. Letztere ist für Kernel und Userspace separat implementiert:
* Kernel: allocpages.cpp
* Userspace: malloc.c
Der Code von malloc und sbrk wird für kernel und userspace separat kompiliert (da eventuell unterschiedliche Flags verwendet werden) und dann wird halt gegen die richtige _LIBSOS_allocPage gelinkt.

Das alles kann man vom Prinzip natürlich auch mit einer Indirektion weniger machen.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 13. August 2009, 15:22 »
Mir ist grad noch eine Möglichkeit eingefallen.
Wenn ich einen Task initialisiere könnte ich doch bevor ich in die main-Methode springe malloc initialisieren (was ja an sich sowieso gemacht wird) und eine Adresse mit übergeben.
Der Kernel weiß ja am besten in welchem Adressraum ein Task liegt.

Könnte das auch funktionieren?
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

 

Einloggen