Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: [MM] am 22. October 2005, 21:37

Titel: Page-Cache löschen
Beitrag von: [MM] 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
Titel: Page-Cache löschen
Beitrag von: Homix 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
Titel: Page-Cache löschen
Beitrag von: Legend 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.
Titel: Page-Cache löschen
Beitrag von: [MM] 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
Titel: Page-Cache löschen
Beitrag von: [MM] am 23. October 2005, 18:38
Hat sich erledigt, habe vergessen dem INVLPG noch ein Segment-Override mitzugeben...

MM