Autor Thema: Stack Fault Exception bei memset Funktion.  (Gelesen 5361 mal)

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« am: 26. June 2011, 11:27 »
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
« Letzte Änderung: 26. June 2011, 12:03 von sebi2020 »
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 26. June 2011, 12:13 »
0xd (13) ist kein Stack Fault, sondern ein #GP (General Protection Fault).
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« Antwort #2 am: 26. June 2011, 12:40 »
Hm, Okay, aber ist irgendwas auffälliges? weil komischer weise klappt ja alles beim ersten aufruf, nur beim zweiten meckert er.
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 26. June 2011, 12:47 »
Naja, viel mehr kann man aus den Informationen, die du geliefert hast, nicht rauslesen.

Ich vermute mal, dass dein pmm_alloc() vielleicht einen Speicherbereich zurückgeliefert hat, der gar nicht frei war, sondern wo du den Taskzustand drauf hattest. Das memset nullt dann den ganzen Zustand und beim Laden der Segmentregister fliegt dir alles um die Ohren (der Fehlercode e=0000 würde dazu wohl passen). Aber das sind alles nur wilde Theorien.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« Antwort #4 am: 26. June 2011, 13:43 »
Ich hab das mal überprüft, aber ich glaube nicht, das es daran liegt... Ich hab die Pointer mal ausgeben lassen:

Task 1 (stack) : 0x123000
Task 1 (tasklist) :  0x126000

Task 2 (stack) : 0x127000
Task 2 (tasklist) : 0x128000

Task 3 (stack) : 0x129000
   Userstack: 0x12A000
Task 3 (tasklist) : 0x12B000

Task 4 (stack): 0x12C000
Task 4 (tasklist) : 0x12D000

cstring (1. Aufruf) : 0x12E000
cstring (2. Aufruf) : 0x12F000
Der ESP zeigt allerdings auf ne komische Stelle. Er wächst doch nach unten, oder nicht? Also müsste er im Grunde unter 0x12A000 liegen und nicht bei 0x12AF44

EDIT: DAs ist jetzt eine komische Ironie!
Ich hab den Fehler gefunden. pmm_alloc() funktioniert. Viel intressanter ist, was passiert wenn man den stack und userstack pointer als uint32_t* pointer festlegt und da mal 0x1000 drauf addiert. :)
« Letzte Änderung: 26. June 2011, 15:20 von sebi2020 »
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 26. June 2011, 16:00 »
Du bist nicht der erste, der auf die C-Pointerarithmetik reingefallen ist.  ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen