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:
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:
problem: geht nicht! bochs:
danke für hilfe,
J!N
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:
Code: [Auswählen]
+-+-+-+
|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:
Code: [Auswählen]
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

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken


Gespeichert