Autor Thema: Paging und Speichermanagment  (Gelesen 4181 mal)

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« am: 30. April 2010, 14:39 »
Hallo

Ich hab ein paar Fragen zum Paging und Speichermanagment.

Ich hab hier erst einmal Aufgeschrieben, wie ich mir mein Speichermanagement vorstelle.

Jeder Task bekommt eine eigene PageDirektory. (Natürlich auch PageTabellen)  Eine PageDirektory und PageTabellen für das OS um auf gesamten Speicher zugreifen zu können. Eifachhalber mape ich das hier Linear (Virtuelle Adresse ist dann gleich = Physischer, VA == PA) bei jeder Speicherzuweisung (vom erstellen von Tasks oder ähnlichem), wird in die OS PD eingetragen(mit gemappt). (weis nicht, ob das, dass Beste ist, jedoch währes was anderes komplizierter, denke ich).

Ein Problem habe ich da auch noch, für Interups brauch ich ja ein Stack (für andere OS Dinge wohl auch), bei der PD  mit dem linear gemappten. Ich denke das ich das so gelöst habe, das ich an den Untersten Einträgen (höchsten Adressen) der PD den Stack einrichte, der aber nicht (linear gemapt ist, bekommt Speicherseiten zugewiesen. (Aber das OS brauch ja nicht so viel Platz für den Stack).

Jetzt zum wichtigen Teil meiner Frage:
Mein Software Multitasking muss ich noch umschreiben, damit es auch fürs Paging geht.
Ich hab ein bisschen im Forum gelesen, das beim neu Laden vom CR3 (PD) Register, die Adressierung sich nicht sofort ändert (wegen dem Cache). Wie bekomme ich das hin, dass das CR3 Register geladen wird und nach dem iret Befehl an der Richtigen Speicherstelle Ausgeführt wird?
Ich muss ja für den nächsten Task seine PD laden (CR3 Register).
Das weis ich nicht, wie da genau gehen soll.  :?

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #1 am: 30. April 2010, 17:45 »
Ich hab ein bisschen im Forum gelesen, das beim neu Laden vom CR3 (PD) Register, Adressierung sich nicht sofort ändert (wegen dem Cache). Wie bekomme ich das hin, dass das CR3 Register geladen wird und nach dem iret Befehl an der Richtigen Speicherstelle Ausgeführt wird?
Ich muss ja für den nächsten Task seine PD laden (CR3 Register).
Soweit ich weiß, geschieht diese Änderung so ziemlich sofort. Falls du den TLB meinst, der wird in dem Moment komplett invalidiert, in dem irgendein Wert nach CR3 geschrieben wird (ausgenommen die Pagetables und Pages, die als global also überall gleich gekennzeichnet wurden).

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 03. May 2010, 12:25 »
Also wenn ich jetzt z. B. diese letzten Befehle Software Multitasking habe
mov cr3, eax
no_mult_task:

mov al, 0x20 ;EOI-Wert in AL ablegen
out 0x20, al ;EOI an Master-PIC senden

pop edi
pop esi
pop ebx
pop eax
pop es
pop ds

sti
iret
dann wird doch nach dem ändern von cr3 alles ungültig sein ? :?

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #3 am: 03. May 2010, 13:49 »
dann wird doch nach dem ändern von cr3 alles ungültig sein ? :?
Wenn das Pagedirectory nur ungültige Werte enthält, ja.

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 03. May 2010, 16:30 »
Wenn die (oder das) Pagedirectory vor dem iret sich ändert, sind das ungültige Werte, das ist ja mein Theoretisches (gedankliches) Problem, das nach dem iret erst darauf bezogen werden soll. Oder wie soll das sonst gehen?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 03. May 2010, 16:32 »
Der Code, in dem das mov cr3, eax liegt, muss logischerweise im alten und neuen PD an dieselbe virtuelle Adresse gemappt sein. Normalerweise ist sogar der komplette Kernel an derselben Adresse in alle Page Directories gemappt.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 06. May 2010, 11:20 »
OK Anders geht das wohl nicht. Gut. :-)

Das daraus folgende Problem hab ich glaub ich selbst gelöst.

Wie ich das mache, damit der Kernel und der Adressraum für das jeweilige Programm nicht im Weg stehen.
Ich lasse das Programm der jeweiligen Tasks im virtuellen Adressraum über den Kernel Adressen anfangen.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 06. May 2010, 15:16 »
Überlicherweise werden für Anwendungsprogramme die unteren 2GB (manchmal auch 3GB) des virtuellen Adressraums belegt, im Rest liegen dann der Kernel und die Adressräume für PCI etc.

 

Einloggen