Autor Thema: lodsX und stosX in Paging und ein Problem  (Gelesen 1817 mal)

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« am: 22. February 2005, 19:35 »
hallo,

1. kann ich mit eingeschaltetem paging überhaupt noch lodsb und stosb benutzen? wenn ja: welche adresse benutzt das dann? phys. oder virt.?? und gibbet ein befehlspaar, dass nur ein offset verwendet ohne einen selektor?

2. baue ich gerade an meinem pagefaultint. ich wills so haben, dass jedes programm kein speicher mallocen muss, sondern einfach darauf zugreifen, und das system stellt diesen dann zur verfügung. damit mein OS weiß, ob eine page auslagerbar is und ob sie ausgelagert ist hab ich noch 2 von 3 freien bits in den pageeinträgen benutzt. das sind jetzt die ehmals freien:

+-+-+-+
|0|F|S|
+-+-+-+
S zeigt an, ob eine Seite ausgelagert (1) ist oder nicht (0)
F zeigt an, ob eine Seite auslagerbar (0) ist oder nicht (1)


dann hab ich mir einen stack für freie pages gemacht und eine funktion (GetPageOffset) gemacht, die mir das offset im speicher des pageeintrages gibt, der für die addy in cr2 zuständig is. in cr3 steht das pagedir. alles sieht dann so aus:

int0x0E:
;page-fault-exception
push eax
push edi
push esi
call GetPageOffset ;offset holen
mov esi,eax ;einstellen
mov edi,eax ;einstellen
lodsd ;alten eintrag holen
push eax ;sichern
shl eax,0x16 ;auf ausgelagert prüfen
shr eax,0x1F
cmp eax,0x01
je int0x0E_swapped
pop eax ,wieder holen

mov [paging_save_esp],esp ;esp sichern
mov esp,[paging_esp] ;pagestack esp holen
pop eax ;seite holen
mov [paging_esp],esp ;neuen esp sichern
mov esp,[paging_save_esp] ;alten esp holen
add eax,0x00000003 ;stati richtig stellen
stosd ;eintragen

pop esi
pop edi
pop eax
iret ;fertig
int0x0E_swapped:
;kommt noch
                 


problem: geht nicht! bochs:

Zitat

00005008698p[CPU  ] >>PANIC<< fetch_raw_descriptor: LDTR.valid=0
00005008698i[SYS  ] Last time is 1109097285
00005008698i[CPU  ] protected mode
00005008698i[CPU  ] CS.d_b = 32 bit
00005008698i[CPU  ] SS.d_b = 32 bit
00005008698i[CPU  ] | EAX=000000ff  EBX=1000174d  ECX=ffff0c00  EDX=00000300
00005008698i[CPU  ] | ESP=0009ffef  EBP=00000000  ESI=0009ffff  EDI=01000000
00005008698i[CPU  ] | IOPL=0 NV UP DI PL NZ NA PE NC
00005008698i[CPU  ] | SEG selector     base    limit G D
00005008698i[CPU  ] | SEG sltr(index|ti|rpl)     base    limit G D
00005008698i[CPU  ] |  DS:0030( 0006| 0|  0) 00000000 000fffff 1 1
00005008698i[CPU  ] |  ES:0030( 0006| 0|  0) 00000000 000fffff 1 1
00005008698i[CPU  ] |  FS:0030( 0006| 0|  0) 00000000 000fffff 1 1
00005008698i[CPU  ] |  GS:0030( 0006| 0|  0) 00000000 000fffff 1 1
00005008698i[CPU  ] |  SS:0010( 0002| 0|  0) 00000000 00000c00 1 1
00005008698i[CPU  ] |  CS:0008( 0001| 0|  0) 00000000 00000c00 1 1
00005008698i[CPU  ] | EIP=000009f8 (000009f7)
00005008698i[CPU  ] | CR0=0xe0000011 CR1=0x00000000 CR2=0x01000000
00005008698i[CPU  ] | CR3=0x00003000 CR4=0x00000000
00005008698i[     ] restoring default signal behavior
00005008698i[CTRL ] quit_sim called with exit code 1


danke für hilfe,

J!N
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #1 am: 23. February 2005, 14:55 »
Also lodsx und ähnlicht geht natürlich trotzdem, warum auch nicht? Wenn Paging an ist gibt es nur noch Virtuelle Adressen.
Malloc hat eigentlich garnichts mit der Verwaltung des Betriebssystem zu tun, sondern läuft auf Userebene. Nur wenn nicht genügend Speicher im Heap ist, also der Bereich über den Malloc verfügen darf, fordert es beim OS mehr Speicher an.
Und das mit kein Speicher mallocen und einfach drauf zugreifen. Bei Malloc kommt ja ein Pointer zurück, den braucht man ja schliesslich damit man weiss wohin. Ohne das würde man wild rumschreiben und hätte eigentlich keine Ahnung was man macht,
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #2 am: 23. February 2005, 15:26 »
ich weiß, man braucht keinen pointer, da man ja virtuell arbeitet, man kann also überall hinschreiben, wo man will. aber wie funktioniert dass den bei lodsX und stosX? nimmt der die physischen oder virtuellen adressen? ich hab nähmlich versucht, auf einen bereich mit offset 0x01000000 zuzugreifen, was nimmer in meinem deskriptor liegt, da hat bochs terror gemacht, aber eigendlich weiß man ja dann garnet, ob die seite, die man mit dem lodsX/stosX anspricht sich noch im deskriptor befindet, die kann ja überall sein, darf man dann also alles bis zu virtuellen adresse, die sich im limit befindet verwenden, oder bis zur physischen adresse?

thx,

J!N
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #3 am: 23. February 2005, 19:27 »
PS: kann mir jemand sagen, wie ich den TLB lösche? könnte ja sein, dass der noch den alten zustand der soeben dazugamappten page hat, und deshalb nochmal ne exception erzeugt usw...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #4 am: 24. February 2005, 16:19 »
Also Adressbildung mit Paging geht so von statten:
Erst nimmt er die Adresse die du ihm angibst und jagt sie durch des Deskriptorzeug, dann kommt das Paging dran.
Es gibt irgendeinen Befehl um den TLB auf invalid zu setzen glaube ich aber ka welcher
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #5 am: 24. February 2005, 16:36 »
hab ihn gefunden... (INVLPG) den oder was anderes muss ich ausführen, wenn ich eine seite von present=0 auf present=1 gesetzt hab.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #6 am: 26. February 2005, 15:40 »
also das zeug mit dem paging geht jetzt! ich hab net gewusst, dass bei nem pagefault freundlicherweise nochn word aufn stack gebracht wird, was dann den rechner verwirrt... habs bisher noch nicht gelesen, aber jetzt weiß ich es!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

 

Einloggen