Autor Thema: PageTable im Directory eintragen  (Gelesen 2840 mal)

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« am: 25. January 2006, 14:17 »
Ich hab ein Problem mit dem Code für Paging aus dem 8. Magazin. Dort steht diese Zeile: mov DWORD[0xC000+0],(0xD000 | 000000000111b)
Sie dient dazu, eine PageTable im PageDirectory einzutragen.
 
Wenn ich dass aber so machen will, dass ich die Postion der PageTable in einer Variablen gespeichert habe, sieht das so aus:mov DWORD[0xC000+0],([PositionPageTable] | 000000000111b)
Dieser Befehl ist aber ungültig, also versuche ich es so:mov ebx,[PositionPageTable]
or ebx,000000000111b
mov [0xC000],ebx

Bei diesem Code stürzt der PC oder Bochs ab.

Wie muss ich den Befehl schreiben, damit es funktioniert???

Gruss Noooooooooooos

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 25. January 2006, 18:15 »
Der Aufbau einer PT sieht ungefähr so aus:
00000000000000000000000000000111b
;|||||||||||||||||||||||||||||||^-0      Pressent bit(0 cause exception by use)
;||||||||||||||||||||||||||||||^--1      1=page is writable (0=exception by write?)
;|||||||||||||||||||||||||||||^---2      1=USER(ring3) 0=SUPERVISOR(ring0-2)
;|||||||||||||||||||||||||||^^----3..4   Reserved(00?)
;||||||||||||||||||||||||||^------5      Accessed?
;|||||||||||||||||||||||||^-------6      Dirty? (by PAGE TABLE=Reserved(0?))
;|||||||||||||||||||||||^^--------7..8   Reserved(00?)
;||||||||||||||||||||^^^----------9..11  Avail(What ever you want :)
;^^^^^^^^^^^^^^^^^^^^-------------12..31 high 20bit pointer to a PAGE/PAGE_TABLE

Die ersten 12 Bit sind informationen/Steurbits der PT. Sie sollen auf den Wert 111b gesetzt werden.
NUR die die hohen 20 Bit der Adresse werden in dieser Struktur gespeichert.

mov ebx,[PositionPageTable]
and ebx,0xFFFFF000  ;<-die ersten 12 Bit auf 0 Setzen
or  ebx,000000000111b
mov [0xC000],ebx
db 0x55AA

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 26. January 2006, 08:14 »
Danke, werds probieren!!!

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 26. January 2006, 20:55 »
Es funktioniert immer noch nicht, es wird immer noch der gleiche Fehler ausgelöst.

Ich habe keine Ahnung, woran das liegt, aber mit der anderen Anweisung geht es.

1.)Was bewirkt denn das genau???:mov DWORD[0xC000+0],(0xD000 | 000000000111b)

2.)Wäre es für den Anfang nicht besser das USER/SUPERVIVISOR zuerst mal auf 0 zu stellen???

3.)Wenn in einem PageTable-Eintrag das USER-Bit gesetzt ist, sind dann alle Pages in dieser Table automatisch auch USER-Pages????


Gruss
Nooooooooos

 

Einloggen