Autor Thema: Page-Cache löschen  (Gelesen 2976 mal)

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« am: 22. October 2005, 21:37 »
Hallo,

ich habe eine Funktion geschrieben, die im Protected Mode in einer Schleife immer 4096 Byte von der Adresse 0 ins Datensegment kopiert.
Dabei wird per Paging immer ein anderer Speicherbereich an die Adresse 0 gemappt. Mein Problem ist nun, dass ich in der Schleife aber immer nur die Daten lese, die ich schon im ersten Durchlauf geleseh hatte.
Meine Theorie ist nun, dass sich die Adresse aus dem ersten Schleifendurchlauf im TLB befinden, und also gar nicht in der Pagetabelle nach der aktuellen Adresse geschaut wird. Kann ich das irgendwie umgehen wie zB das Leeren der Pipeline mit dem Far-Jump beim einschalten der P-Modes?
Oder ist eventuell auch meine Theorie falsch?
Ich könnte ja einfach mal versuchen von 32 anderen Adressen zu lesen, um den TLB zu leeren, aber wer sagt denn, dass der TLB auch bei heutigen Prozessoren nur 32 Adressen speichert...

MM

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 22. October 2005, 22:09 »
hi,
also wenn man das cr3-Register ändert, dann wird der TBL gelöscht (was deshalb auch bei einem taskswitch der Fall ist).
notfalls mit:
mov eax,cr3
mov cr3,eax

außerdem müsste man den Buffer auch in den PageTableEntries abschalten können oder eventuell eine Buffercontrolle im cr0 Register.

soweit ich mich erinnern kann gibt es für das löschen vom TBL auch Assemblerbefehle aka "INVD" oder für einzelne Pages "INVLPG".

cu,
stefan2005

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #2 am: 23. October 2005, 15:28 »
Für eine einzelne 4KB Seite ist die Instruktion INVPLG die schnellere Variante.
Und ja, einfach nur die Addresse in der Page Table überschreiben leert nicht den TLB.
*post*

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #3 am: 23. October 2005, 18:28 »
Habs mal ausprobiert, und INVLPG zeigt leider keine Wirkung. Bei INVD wird neu gestartet, weshalb ich WBINVD probiert habe, was aber auch keinerlei Wirkung zeigte, nur wenn ich CR3 neu lade geht es.
Das finde ich doch schon etwas arm...
Oder reicht es nicht einfach den INVLPG Befehl auf die Zieladresse, welche in der Page liegt anzuwenden?
Hab auch grad diesen Satz über INVLPG in einer Referenz gefunden:
"Intel warns that this instruction may be implemented differently on future processors."
Was soll man davon halten?

MM

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #4 am: 23. October 2005, 18:38 »
Hat sich erledigt, habe vergessen dem INVLPG noch ein Segment-Override mitzugeben...

MM

 

Einloggen