hallo erstmal,
Ich habe letztens versucht die strcmp Funktion zu implementieren, was dann ungefähr so aussieht:
char* cstring = pmm_alloc();
memset(cstring,0,0x1000);
...
Wenn ich diese Funktion nun einmal aufrufe klappt auch alles. Beim zweiten Aufruf bekomme ich einen Stack Fault ( 0xd ). Im Wiki heißt es das es an ein Falsch geladenem Stack Segment Register liegen kann. Ich bin im Moment ratlos woher der kommen kann. Wenn ich Memset z.B. nur 100 Bytes schreiben lasse geht wieder alles, aber ich wollte eigentlich schon eine ganze Page löschen.
Diese Funktion hab ich einmal in einem Ring0 Task ausprobiert und zum Testen wegen dem SS Register auch einmal in einem Ring3 Task.
Kann es an dem SS Register liegen? Hab hier mal die Ausgabe von QEMU
check_exception old: 0xffffffff new 0xd
6: v=0d e=0000 i=0 cpl=0 IP=0008:00100a3d pc=00100a3d SP=0010:0012af44 EAX=03da0620
EAX=03da0620 EBX=001021e9 ECX=00000001 EDX=0012af5c
ESI=0010059a EDI=0000001a EBP=0000000c ESP=0012af44
EIP=00100a3d EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS [-WA]
FS =0000 00000000 00000000 00000000
GS =0000 00000000 00000000 00000000
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00102160 00068fff 00c08900 DPL=0 TSS32-avl
GDT= 00102220 00000030
IDT= 00102260 000007ef
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000008 CCD=0012af44 CCO=ADDL
EFER=0000000000000000
Was mich leicht wundert, dass die SS und CS Register DPL 0 haben und die anderen beiden DPL 03. Müssten die bei einem Ring 3 Task nich alle DPL 3 haben?
EDIT:
Zumindest sind da nur meine Ring0 Selektoren geladen. (also 0x8 und 0x10)
Gruß Sebi2020