Ich möchte nun auch noch vorstellen, wie ich es bisher gemacht habe, vielleicht kann das jemand gebrauchen oder mir noch sagen, wo Denkfehler von mir stecken (obwohl ich bisher mit diesem Konzept noch ganz gut fuhr):
Zunächst einmal gibt es in meinem OS bisher keinen allgemeinen Speicherbereich. Da ich noch an meinem Kernel arbeite, sind alle Aussagen über Applikationen bisher reine Spekulation, wenn ich auch schon recht genaue Vorstellungen habe.
Der Kernel hat seinen eigenen Heap, um Datenstrukturen sowohl sehr kleiner als auch größerer Natur festzuhalten. Dieser Heap ist (wie könnte es anders sein) in Blöcke unterteilt. Jeder Block hat folgenden Aufbau:
- Länge (4 Byte)
- Inhalt (n Byte)
- Länge (4 Byte)
- Flags (1 Byte)
In den Flags ist auch verzeichnet, ob ein Block frei ist oder nicht. Auf die Verwendung des 31. Längenbits habe ich verzichtet (obwohl ich zu Beginn daran gedacht hatte), um mir nicht willkürlich eine 2GB-Grenze zu setzen.
Der Inhalt sind jeweils mindestens 8 Byte, da die freien Blöcke in einer doppelt verketteten Liste stehen.
Der Vorteil mit der doppelten Längenhaltung vorne und hinten ist, dass ich direkt nach der Freigabe eines Blockes abchecken kann, ob davor und/oder dahinter ebenfalls ein freier Block liegt. In einem solchen Fall wird daraus ein großer Freiblock gemacht. Dies wiederum bewirkt, dass ich nie zwei Freiblöcke direkt hinter einander habe. Wenn ich also erst meinen Speicher mit tausenden von kleinen Blöcken fragmentiere und später Stück für Stück wieder frei gebe, habe ich wie vorher wieder einen einzelnen, großen, sauberen Freiblock.
Dies gilt aber, wie gesagt, nur für den Heap des Kernels.
Für die Applikationen möchte ich es ähnlich machen, aber nicht innerhalb des gleichen Speicherbereiches wie dem Kernelheap, da ich vermeiden möchte, dass mir eine Applikation das System lahm legt, indem es Zeiger ungültig verbiegt. Vielmehr werde ich jeder Applikation ihren eigenen Speicherbereich zuweisen und ihren Heap in genau jenem verwalten.
Wie gesagt: Für jede Anmerkung hierzu bin ich offen.