Autor Thema: DPF gefolgt von GPF bei der GDT-Initialisierung  (Gelesen 17558 mal)

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 21. May 2009, 19:07 »
wie kann ich das am besten machen mit CS:eip?
du suchst in der log-datei von qemu(wieder mit '-d int') nach der ersten Exception und
guckst im darauf folgenden register dump.

Zitat
Das objdump kann ich wahrscheinlioch mit dem gdb machen, oder?
em… wieso, hast du kein 'objdump'? das ist iirc sogar bei mingw dabei. mit dem gdb kenn ich mich nicht aus.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 21. May 2009, 19:11 »
Mir ist grad aufgefallen, dass es eine Funktion bei Linux ist.
Wusste ich vorher nicht.
Ich schaue dann gleich mal nach.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 21. May 2009, 19:36 »
Wie lese ich denn das cs:eip?
Da stehen folgende Werte:
CS=0008 00000000 ffffffff 00cf9a00
EIP=00100347
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 21. May 2009, 19:59 »
Wie lese ich denn das cs:eip?
Da stehen folgende Werte:
CS=0008 00000000 ffffffff 00cf9a00
EIP=00100347
cs:eip = 0x08:0x00100347(was da sonst noch steht ist base,limit und type des segments)

aber cs ist eigentlich egal. wichtig ist die 0x00100347, danach musst du in der ausgabe von 'objdump' suchen.
« Letzte Änderung: 21. May 2009, 20:01 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 21. May 2009, 20:18 »
Hab die Fehlerhafte Stelle gefunden.
Es ist der iret.
Der Handler sieht wie folgt aus:
  10031c:       60                      pusha 
  10031d:       1e                      push   ds
  10031e:       06                      push   es
  10031f:       0f a0                   push   fs
  100321:       0f a8                   push   gs
  100323:       fc                      cld     
  100324:       66 b8 10 00             mov    ax,0x10
  100328:       8e d8                   mov    ds,eax
  10032a:       8e c0                   mov    es,eax
  10032c:       54                      push   esp   
  10032d:       e8 62 0c 00 00          call   100f94 <int_dispatcher>
  100332:       81 c4 04 00 00 00       add    esp,0x4               
  100338:       89 c4                   mov    esp,eax               
  10033a:       0f a9                   pop    gs                     
  10033c:       0f a1                   pop    fs                     
  10033e:       07                      pop    es                     
  10033f:       1f                      pop    ds                     
  100340:       61                      popa                         
  100341:       81 c4 08 00 00 00       add    esp,0x8               
  100347:       cf                      iret       
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 21. May 2009, 20:41 »
dann ist vermutlich der Stack kaputt.

tritt der fehler auch noch auf wenn dein int_dispatcher einfach das gleiche esp returned wie es als parameter bekommt?

wessen iret ist es denn? der erste timer-interrupt?

was sagt denn der error code?
check_exception old: 0xffffffff new 0xd
     1: v=0d e=???? […]
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 21. May 2009, 20:45 »
Es ist der erste Timer-IRQ.
An sich müsste es lso der gleiche ESP sein.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 21. May 2009, 20:59 »
Es ist der erste Timer-IRQ.
An sich müsste es lso der gleiche ESP sein.

d.h. bei dir funktionieren wahrscheinlich noch keine Interrupts richtig.?

wie sieht den dein int_0x20 stub aus?
int_0x20:
  push 0
  push 0x20
  jmp 0x10031c

was für ein error code wird denn der exception mitgegeben?
bzw. poste mal den kompletten register-dump der zu der exception gehört
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 21. May 2009, 21:03 »
genau so sieht der stub aus.
Der Error-Code ist 0, der mit dem GPF gegeben wird.
Woran kann es liegen, dass der iret Fehler auslöst?
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #29 am: 21. May 2009, 21:21 »
Iret kann aus vielen verschiedenen gründen ein #GP auslösen

ErrorCode: 0
1. Null Selektor für Code oder Stacksegment
2. Adressierung außerhalb der Segment Grenzen

ErrorCode: Selector {nicht wirklich relevant}
fehlerhafte/inkompatible privileglevel, selectoren außerhalb der GDT, und andere

Edit: Bist du dir sicher das es ein #GP(0x0d) ist. Alle möglichen Ursachen scheine für mich mit dem ErrorCode 0 ausgeschlossen zu sein.

Edit2:
Wenn du willst kann ich mir das auch mal angucken(bräuchte nur ein image, zeit hab ich). Ich wüsste sonst echt nicht woran es liegt.
« Letzte Änderung: 21. May 2009, 22:06 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #30 am: 21. May 2009, 22:48 »
Ja, da bin ich mir sicher.
Es erzählt mir zumindest das logile von qemu.

Der Link zu meinem Image:
http://rizor.bplaced.net/rizor-OS-0.1-Alpha.img

Danke für deine Hilfe.
« Letzte Änderung: 21. May 2009, 22:52 von rizor »
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #31 am: 21. May 2009, 23:24 »
Mir ist etwas aufgefallen.
Wieso wird in tyndur 0x28 ins TR geschrieben?
Muss im TR nicht eher die Adresse des TSS stehen?
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #32 am: 21. May 2009, 23:27 »
Nein, da steht ein Selektor, der eben auf einen GDT-Eintrag verweist. TR ist im weitesten Sinn auch nur ein Segmentregister.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #33 am: 21. May 2009, 23:30 »
Okay.
Dann mal eine andere Frage:
Ich mache es momentan so, dass ich den GDT initialisiere und sobald ich Multitasking aktiviere den TSS setze.
Könnte es sein, dass ich damit irgendwelche Probleme erzeuge?
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #34 am: 21. May 2009, 23:37 »
Wenn du es richtig machst nicht.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #35 am: 21. May 2009, 23:49 »
An sich sollte es passen.
Habe nur eine Frage:
Wieso wird in esp0 eine 0 geschrieben (habe ich mir nur ab geguckt)?
Sollte da nicht eigentlich der stackpointer stehen?

So sieht es momentan aus:
memset(&krn_tss , 0 , sizeof(tss_t));
krn_tss.ss0 = SYSTEM_DATA_SELECTOR;
krn_tss.esp0 = 0x0;
krn_tss.ss = 0x10;
krn_tss.ds = 0x10;
krn_tss.es = 0x10;
krn_tss.fs = 0x10;
krn_tss.gs = 0x10;
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #36 am: 21. May 2009, 23:50 »
Da sollte ein Stackpointer stehen, ja. Wo hast du denn abgeschrieben? Sicher, dass der Wert nicht später noch auf was vernünftiges gesetzt wird?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #37 am: 21. May 2009, 23:52 »
dein int_dispatcher returned nicht esp, sondern die interrupt nummer
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #38 am: 22. May 2009, 00:05 »
Das war aus einem Tut, weiß leider nicht mehr welches.
Habe da jetzt den aktuellen ESP-Wert eingetragen.
Das sollte jetzt stimmen, oder?

@MNemo:
Bist du dir da sicher?
Habe mir mal den Stack aufgeschrieben.
Ich sehe da keinen Fehler?
Was sollte deiner Meinung nach denn wegfallen in dem Code?
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #39 am: 22. May 2009, 00:13 »
Das Problem hat sich gelöst.
Manchmal bin ich wie vernagelt...
Habe anstatt esp + 8, esp + 4 gemacht.

Stimmt das mit dem esp0 denn, wenn ich den aktuellen esp nehme?
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

 

Einloggen