Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: nooooooooos am 19. October 2006, 11:06
-
Hmm...ja ich hab da so eine Page gemappt (physikalisch: 0x22000; logisch: 0x10000)
Wenn ich jetzt etwas an 0x10000 schreibe, erscheint es zwar dort, aber nicht per phyikalischem SpeicherDump auch an 0x22000.
Könnte das was mit Caching zu tun haben....Wie lös ich das Problem???
Thx, Noooooooooooooos
-
Hmmm...das ändert auch nix. Bei Invlpg wird einfach ein PageFault erzeugt; muss man denn da die logische oder physikalische Adresse übergeben???
Auch das CR3 neu beschreiben bringt nix.
Naja....ich zeige hier mal ein Ausschnitt aus dem Bochsdebugger, wenns doch kein Cache-Fehler sein sollte:
- Zuerst mal, schaue ich nach einem DW in der fehlerhaften Page(logisch: 0x10000, physikalisch: 0x22000):
<bochs:10> x /d 0x1000c
0x0001000c <bogus+ 0>: 131079 - Dann schau ich die Register an:
<bochs:11> dump_cpu
eax:0x00000000, ebx:0x00000001, ecx:0x00000000, edx:0x0000a339
ebp:0x00000000, esp:0x0000e700, esi:0x00022007, edi:0x00011000
eip:0x0000a268, eflags:0x00000202, inhibit_mask:0
cs:s=0x0008, dl=0x0000ffff, dh=0x00cf9a00, valid=1
ss:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=7
ds:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=7
es:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=5
fs:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
gs:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
ldtr:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
tr:s=0x0018, dl=0x9e130068, dh=0x00008900, valid=1
gdtr:base=0x00009c33, limit=0x2f
idtr:base=0x00009c63, limit=0x1af
dr0:0x00000000, dr1:0x00000000, dr2:0x00000000
dr3:0x00000000, dr6:0xffff0ff0, dr7:0x00000400
cr0:0x80000011, cr1:0x00000000, cr2:0x00000000
cr3:0x00007000, cr4:0x00000010
CR3=0x7000 - Dann schau ich mir dieses an:
<bochs:12> xp /d 0x7000
0x00007000 <bogus+ 0>: 24615
Wobei 24615 (Die PageTable) hexadezimal 0x6027 heisst. - Dann schauen wir in der PageTable an der Stelle für 0x10000 (Offset=0x40)den Eintrag an:
<bochs:13> xp /d 0x6040
0x00006040 <bogus+ 0>: 139271
139271=0x22007 - Und wenn wir jetzt in der physischen Page wieder das selbe DW wie am Anfang auslesen wollen, ist dieses Null:
<bochs:14>xp /d 0x2200c
0x0002200c <bogus+ 0>: 0
Thx Nooooooooooos
-
Hää?? Ich blick da nich ganz durch....Das sind doch die normalen Bits, U/S, Present usw.????
-
Ja eben 0x6000 ist die Ady, dann kommen noch alle Bits macht dann aben 0x6027^^
-
Ja...das sind doch zwei mögliche Wege um zur Ady zu kommen, dann noch Plus die ganzen Bits...blabla, dann komme ich auf 0x6027.
-
JA!!
Aber ich muss das U/S-Bit setzen, sonst läuft da nix im Ring3...Und auch die andern...
EDIT:
Das ly würd ich wegeditieren^^
-
Dann zeig uns Unwissenden doch mal wo genau er das macht :wink: Ich seh das nämlich nicht.
-
Mann....!!!
Im Debugger geb ich dann die Adresse schon ohne Bits ein...
-
genau das mein ich, nooooooooos macht da eben keinen murks mit den bits.
-
Also...ich blick bei eurer Diskussion nich mehr durch.
Muss ich jetzt was ändern???
-
Welche bochs version verwendest du denn und hast du es mit einem anderen Emulator auch probiert oder paging wieder ausschalten und dann auslesen? Ich frag nur weil mir in den CHANGES des neuesten bochs release (2.3) folgendes ins Auge sticht:
* lots of cpu and internal debugger fixes (link) (http://bochs.sourceforge.net/getcurrent.html)
-
Hmm...ja ich hab noch 2.2....dann hol ich mir mal den neuen. thx
-
Hmmm...ja, an Bochs liegts nich. Das Problem besteht weiter unvermindert.
Wenn ich invlpg zusammen mit wbinvd benutz, welcher soll ich dann zuerst dran nehmen??
-
Schon gut...Dank an alle
Es lag trotzdem am Cache(auch Bochs hat einen) und nachdem ich invplg an der richtigen Stelle eingesetzt hab, ists gegangen.
Nooooooooooos