Um den Speicher zu verwalten, muss der Kernel doch eine Liste der allokierten Elemente haben
Der Kernel muss primär eine Liste der
freien, physikalischen Speicherseiten haben. Diese Liste könnte man zB. als Stack (Das ist nicht die einzige Möglichkeit, aber so [ähnlich] habe ich es in lightOS gemacht) implementieren, wobei man zum Allozieren von Speicherseiten einfach von diesem Stack Einträge (Das sind bei mir physikalische Adressen einer 4kb Speicherseite) runterholt und zum Freigeben diese Adresse wieder drauflegt. Das tolle daran ist, dass man den Speicherbereich, den man zum Speichern dieses Stacks braucht, nach und nach (je kleiner der Stack wird) mit freigeben kann.
D.h. im Endeffekt hat man für das Speichern der freien Seiten überhaupt keinen Speicherplatz verbraucht und für die belegten Seiten nur die normalen Page-Tables/-Directories.
edit: In lightOS speichert der Kernel momentan zusätzlich zu den Page-Tables/-Directories noch eine Liste der allozierten Seiten, aber ich kann jetzt ehrlich gesagt nicht mehr sagen, warum/ob das wirklich nötig ist/war.
[...] um zu erkennen, was schon weg ist und zu welchem Task der Bereich gehört, oder nicht?
Das steht doch in den Page-Tables/-Directories dann, dass heißt man könnte es prinzipiell auch dort auslesen.
Angenommen ein großes Programm benötigt 12 MB Speicher.
Der Overhead sind da 3Page-Tables (also 12kb), wenn man davon ausgeht, dass man das allozierte wirklich nur in den Page-Tables/-Directories speichert, richtig? Das erscheint mir wirklich nicht so viel, wenn man es mit der Programmgröße von 12Mb vergleicht.
Mal abgesehen davon ist der Aufwand 4/2Mb und 4kb Speicherseiten gleichzeitig zu verwalten sehr wahrscheinlich um einiges größer.Wenn du das machen wolltest, bräuchtest du wahrscheinlich ausgefeiltere Algorithmen (wegen Fragmentation).
Und wenn du nur 2/4Mb Speicherseiten erlauben willst, dann ist der Overhead für kleinere Programm extrem groß.