Hallo zusammen,
ich brauch dringend ein paar Ratschläge. Ich lande wie auch immer ich es angehe im Chaos.
Ich versuche gerade, Stack-basiertes Multitasking in mein OS zu implementieren. Funktioniert auch wunderbar, solange ich im Ring 0 bleibe und alles im selben Adressraum laufen lasse.
Als nächsten Schritt sollte nun mein Test-Task ein eigenes CR3 bekommen, und daran ist es auch gleich gescheitert.
Im Prinzip benötigt ja jeder Task ein eigenes Pagedirectory, min. ein Pagetable für den Programmcode und ein Pagetable für den Stack.
Das sind immerhin schonmal 3kb / Task, welche direkt 1:1 gemappt werden müssen.
Um mir das Leben einfach zu gestalten, habe ich nun 1mb innerhalb der ersten 4mb reserviert, die ich eh direkt mappe.
Mein Plan war zuerst einige Helferfunktionen zu schreiben, welche dann in diesem Bereich nach ungenutzen Pagedirectorys / -tables suchen, die dann der Taskmanager nutzen kann. Wie gesagt, Chaos (meiner Meinung nach). Andere Idee: Pagedirectorys an ihrer Adresse lassen und beid jedem Taskswitch den Inhalt erneuern: vieeeel zu langsam.
Habt ihr eine Funktion, welche speziell 1:1 gemappten Speicher zurückgibt oder wie macht ihr das? Gibt es dafür irgentwelche sauberen Lösungen, ohne zig Helfer-Funktionen, 20 reservierte Speicherblöcke und kiloweise verschwendetetn Speicher?
EDITIrc sei dank habe ich inzwischen schon einige Lösungsvorschläge erhalten und werde mich mal an folgender Methode versuchen:
Einen definierten bereich virtuellen Speicher nutzen, um diesen immer direkt auf den zu beschreibenden physikalischen Speicher zu mappen.
Nach dem Motto: warum einfach, wenns auch kompliziert geht.
Irgentwie kommen mir meine alten Ideen inzwischen recht absurd vor
Grüße vom Faulancer.