Hiho,
da bin ich wieder
Also, bei mir hab ich ein ziemlich einfaches Heap System eingebaut. Erstmal die HEAP struct:
struct HEAP
{
DWORD dwFlags;
DWORD dwSize;
DWORD dwPageSize;
struct HEAP *psNext;
};
Es funktioniert also wie eine einfach verkettete Liste. Wenn du jetzt mittels HeapAlloc Speicher haben willst, durchsucht die Funktion alle vorhandenen Blöcke, und schaust ob zwischen dwPageSize und dwSize genug Platz ist, eine neue Heapstruct+Speicher anzulegen, soll heißen, wenn ein Block noch Speicher hat, den zu nutzen. Wird da nichts gefunden, wird nach nicht gesuchten Blöcken gesucht(mittels dwFlags,dazu später). Wird auch da nichts gefunden, werden einfach die passendene Anzahl Pages (VirtualAlloc) geholt, am Anfang der Pages wird die struct geschrieben, und der Heapspeicher folgt danach. Zurückgegeben wird dann immer
(void*) (psHeap+sizeof(struct HEAP));
HeapFree setzt die Flags des Blockes (die Heapstruct liegt ja direkt vor dem Heapbuffer) auf Null.
Als letzte Funktion gibt es noch HeapClean (unter Win32 heißt die ein bisschen anders), und die räumt einfach alle unbenutzten Blöcke auf(gibt deren Speicher frei, und löscht sie aus der Liste). Und hier krankt mein Ansatz, der ganze Vorgang ist ziemlich schwer zu realisieren, hab die Funktion auch noch nicht implementiert...
Ein anderer Ansatz wäre, eine verkettete Liste aus Pages zu machen. Also, wenn eine Page 4096 Bytes fasst, und die Heapstruct 16 Byte groß ist, kann man ja 255 heapstructs + prev/next zeiger in eine Page packen, und darüber die Heapblöcke verwalten... Die heapstruct müsste dann nurnoch über einen blockzeiger erweitert werden. Der Vorteil wäre, das die HeapClean Funktion jetzt viel einfacher zu realisieren wäre, Nachteil aber, das es lange dauert, bis man zu einem Zeiger(von HeapAlloc zurückgegeben) die passende Heapstruct findet (Alle heap pages durchgehen, und vergleichen...). Musst du selber entscheiden, welche Variante du wählst, wobei meine Ansätze doch eher einfach sind, gibt noch viele andere Prinzipe...
Wichtig ist nurnoch das die Heap Funktionen als libs in Userprozesse eingebunden werden, das einzige Kernelinterface für Speicher sollten die VirtualAlloc,VirtualFree,... Funktionen sein, damit einige Programme( wie .z.b viele aktuelle Spiele) ihre eigenen, schnelleren Heap Funktionen nutzen können!
Hoffe, es ist einigermaßen verständlich geworden...
MfG GhostCoder