So, zur Adressraumaufteilung gleich meine erste Frage: Das wird nur realisiert durch entsprechend gesetzte Flags in den PTE's?
Ja. Rein theoretisch brauchst du so eine Aufteilung überhaupt nicht, sondern könntest über das Flag für jede Page individuell dynamisch zur Laufzeit festlegen, ob sie eine Kernel- oder Userspace-Page ist. Nur würde das die Verwaltung so kompliziert machen, dass man lieber in einem bestimmten virtuellen Adressbereich nur Kernelpages und in einem anderen Bereich nur Userpages hat, so dass man einer Adresse direkt ansieht, wohin sie gehört.
So weit, so kompliziert. Sobald mein Paging aktiviert ist, habe ich nur noch virtuelle Adressen. Um dennoch an die PD ranzukommen habe ich schon mehrfach gelesen dass das PD einen Eintrag auf dich selbst bekommt und ich es sozusagen als zusätzliches PT verwalten kann. Damit komme ich an die phys. Adresse, die ich ja zum aktivieren des PD brauche.
Genau, so geht es am besten. Wenn du verstanden hast, wie dieser Trick im Detail funktioniert, dann hast du das schwierigste am Paging geschafft.
Jetzt noch eine offene Frage:
Wenn mein Task beendet ist wird ja der Speicherkontext gewechselt. Was passiert mit dem alten Kontext? Gilt der als unbenutzt und kann einfach wieder neu belegt werden?
Der Prozessor kennt immer nur ein einziges PD, nämlich das, auf das cr3 gerade zeigt. Für die PTs gilt das ähnlich, der Prozessor schaut nur diejenigen PTs an, auf die ein PTE im aktiven PD zeigt und nur, wenn auf die entsprechenden Adressen zugegriffen wird.
Abgesehen davon, dass du mit dem Prozessor einen zweiten Nutzer der Daten hast, sind es ganz normale Daten im RAM, die du allozierst und freigibst wie alles andere auch. Wenn du weißt, dass der Prozessor nicht mehr auf die Daten zugreift, kannst du sie auch für etwas ganz anderes wiederverwenden.
Zu den meisten Punkten habe ich nichts kommentiert. Wie bei einem guten Unix-Tool heißt das, dass das so passt.