Autor Thema: Interrupts - PageFault  (Gelesen 22908 mal)

Adi

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #40 am: 11. April 2007, 15:57 »
Meiner Meinung nach müsste der Stack nach REG_RESTORE folgendermaßen aussehen:

| STACK 0x11226d [0x029e]
 | STACK 0x11226f [0x0010]
 | STACK 0x112271 [0x0008]
 | STACK 0x112273 [0x0000]
 | STACK 0x112275 [0x0202]
 | STACK 0x112277 [0x0000]


und nicht:

| STACK 0x001c [0xff53]
 | STACK 0x001e [0xf000]
 | STACK 0x0020 [0xfea5]
 | STACK 0x0022 [0xf000]
 | STACK 0x0024 [0xe987]
 | STACK 0x0026 [0xf000]
 | STACK 0x0028 [0xff53]
 | STACK 0x002a [0xf000]
 | STACK 0x002c [0xff53]
 | STACK 0x002e [0xf000]
 | STACK 0x0030 [0xff53]
 | STACK 0x0032 [0xf000]
 | STACK 0x0034 [0xff53]
 | STACK 0x0036 [0xf000]
 | STACK 0x0038 [0xef57]
 | STACK 0x003a [0xf000]
 | STACK 0x003c [0xff53]
 | STACK 0x003e [0xf000]
 | STACK 0x0040 [0x0116]
 | STACK 0x0042 [0xc000]
 | STACK 0x0044 [0xf84d]
 | STACK 0x0046 [0xf000]
 | STACK 0x0048 [0xf841]
 | STACK 0x004a [0xf000]
 | STACK 0x004c [0xe3fe]
 | STACK 0x004e [0xf000]
 | STACK 0x0050 [0xe739]
 | STACK 0x0052 [0xf000]
 | STACK 0x0054 [0xf859]
 | STACK 0x0056 [0xf000]

Hoffentlich könnt ihr dazu mehr sagen, ich bin Ratlos :|





Edit:

Glaube gerade noch auf die schnelle den oder einen Fehler gefunden zu haben... werde das heute Abend genauer untersuchen:

Natürlich darf ich esp nicht vom Stack popen! Sonst sitzt der Stack plötzlich auf Adresse 0 :wink: :roll:  :roll: :roll:

wird hier deutlicher:
00104c20: (                    ): push eax                  ; 50
00104c21: (                    ): push ebx                  ; 53
00104c22: (                    ): push ecx                  ; 51
00104c23: (                    ): push edx                  ; 52
00104c24: (                    ): push esi                  ; 56
00104c25: (                    ): push edi                  ; 57
00104c26: (                    ): push ebp                  ; 55
00104c27: (                    ): push esp                  ; 54
00104c28: (                    ): mov eax, dword ptr ds:0x306930 ; a130693000
00104c2d: (                    ): mov dword ptr ds:[eax], esp ; 8920
00104c2f: (                    ): call .+0xffffdbaa         ; e8aadbffff
00104c34: (                    ): mov eax, 0x00000020       ; b820000000
00104c39: (                    ): out 0x20, al     

 | STACK 0x06b0 [0x06b4]
 | STACK 0x06b2 [0x0000]
 | STACK 0x06b4 [0x06f8]
 | STACK 0x06b6 [0x0000]
 | STACK 0x06b8 [0x6940]
 | STACK 0x06ba [0x0010]
 | STACK 0x06bc [0x07ac]
 | STACK 0x06be [0x0000]
 | STACK 0x06c0 [0x0000]
 | STACK 0x06c2 [0x0000]
 | STACK 0x06c4 [0x0000]
 | STACK 0x06c6 [0x0000]
 | STACK 0x06c8 [0x8f58]
 | STACK 0x06ca [0x000b]
 | STACK 0x06cc [0x0000]
 | STACK 0x06ce [0x0000]


00104c3b: (                    ): mov eax, dword ptr ds:0x306930 ; a130693000
00104c40: (                    ): mov esp, dword ptr ds:[eax] ; 8b20

-> Hier ist der Stack so wie er sein sollte

 | STACK 0x11224d [0x0000]
 | STACK 0x11224f [0x0000]
 | STACK 0x112251 [0x0000]
 | STACK 0x112253 [0x0000]
 | STACK 0x112255 [0x0000]
 | STACK 0x112257 [0x0000]
 | STACK 0x112259 [0x0000]
 | STACK 0x11225b [0x0000]
 | STACK 0x11225d [0x0000]
 | STACK 0x11225f [0x0000]
 | STACK 0x112261 [0x0000]
 | STACK 0x112263 [0x0000]
 | STACK 0x112265 [0x0000]
 | STACK 0x112267 [0x0000]
 | STACK 0x112269 [0x0000]
 | STACK 0x11226b [0x0000]
 | STACK 0x11226d [0x029e]
 | STACK 0x11226f [0x0010]
 | STACK 0x112271 [0x0008]
 | STACK 0x112273 [0x0000]
 | STACK 0x112275 [0x0202]
 | STACK 0x112277 [0x0000]
 | STACK 0x112279 [0x0000]
 | STACK 0x11227b [0x0000]
 | STACK 0x11227d [0x0ee1]
 | STACK 0x11227f [0x0011]
 | STACK 0x112281 [0x46a7]
 | STACK 0x112283 [0x001f]
 | STACK 0x112285 [0x0000]
 | STACK 0x112287 [0x0000]





00104c42: (                    ): pop esp                   ; 5c

-> Hier nichtmehr

 | STACK 0x0000 [0xff53]
 | STACK 0x0002 [0xf000]
 | STACK 0x0004 [0xff53]
 | STACK 0x0006 [0xf000]
 | STACK 0x0008 [0xff53]
 | STACK 0x000a [0xf000]
 | STACK 0x000c [0xff53]
 | STACK 0x000e [0xf000]
 | STACK 0x0010 [0xff53]
 | STACK 0x0012 [0xf000]
 | STACK 0x0014 [0xff53]
 | STACK 0x0016 [0xf000]
 | STACK 0x0018 [0xff53]
 | STACK 0x001a [0xf000]
 | STACK 0x001c [0xff53]
 | STACK 0x001e [0xf000]
 | STACK 0x0020 [0xfea5]
 | STACK 0x0022 [0xf000]
 | STACK 0x0024 [0xe987]
 | STACK 0x0026 [0xf000]
 | STACK 0x0028 [0xff53]
 | STACK 0x002a [0xf000]
 | STACK 0x002c [0xff53]
 | STACK 0x002e [0xf000]
 | STACK 0x0030 [0xff53]
 | STACK 0x0032 [0xf000]
 | STACK 0x0034 [0xff53]
 | STACK 0x0036 [0xf000]
 | STACK 0x0038 [0xef57]
 | STACK 0x003a [0xf000]



00104c43: (                    ): pop ebp                   ; 5d
00104c44: (                    ): pop edi                   ; 5f
00104c45: (                    ): pop esi                   ; 5e
00104c46: (                    ): pop edx                   ; 5a
00104c47: (                    ): pop ecx                   ; 59
00104c48: (                    ): pop ebx                   ; 5b
00104c49: (                    ): pop eax                   ; 58
00104c4a: (                    ): iretd                     ; cf



Edit2:

Der Fehler hat sich bestätigt! Ganz einfach, aber hab dies die ganze Zeit übersehen  :oops:

Naja aufjedenfall bin ich ein Schritt weiter un der Stack sieht vor dem IRET endlich so aus wie "bisher" gewünscht...

Stack genau wie ich ihn der der Funktion class_multitasking::task_anlegen(entry_t entry) generiere :-) :
| STACK 0x11226d [0x029e]
 | STACK 0x11226f [0x0010]
 | STACK 0x112271 [0x0008]
 | STACK 0x112273 [0x0000]
 | STACK 0x112275 [0x0202]
 | STACK 0x112277 [0x0000]
 | STACK 0x112279 [0x0000]
 | STACK 0x11227b [0x0000]
 | STACK 0x11227d [0x0ee1]
 | STACK 0x11227f [0x0011]
 | STACK 0x112281 [0x46a7]
 | STACK 0x112283 [0x001f]
 | STACK 0x112285 [0x0000]
 | STACK 0x112287 [0x0000]
 | STACK 0x112289 [0x0000]
 | STACK 0x11228b [0x0000]

Allerdings führt die CPU nun ein IRET aus bekomme ich wieder:

00019364120e[CPU0 ] iret: return CS selector null
00019364138e[CPU0 ] read_virtual_checks(): read beyond limit
00019364156e[CPU0 ] read_virtual_checks(): read beyond limit
00019364174e[CPU0 ] read_virtual_checks(): read beyond limit
00019364192e[CPU0 ] read_virtual_checks(): read beyond limit
00019364210e[CPU0 ] read_virtual_checks(): read beyond limit
00019364228e[CPU0 ] read_virtual_checks(): read beyond limit
00019364246e[CPU0 ] read_virtual_checks(): read beyond limit
...

 :cry:
« Letzte Änderung: 11. April 2007, 23:11 von Adi »

Adi

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #41 am: 13. April 2007, 10:30 »
Wie im IRC besprochen habe ich hier nochmal eine Zusammenfassung des Problems!

Die ISR:
        _hwint0:
          ;save all registers
          pushad
          push ds
          push es
          push fs
          push gs
         
          mov eax,[_p] ;put the adress of the struct of CURRENT PROCESS in eax.(the CONTENT of pointer p)
          mov [eax],esp ;save esp in the location of esp in the CURRENT PROCESS-STRUCT.
         
          ;switch Task (C-Code)
          call _switch_task
         
          ;clear PIC
          CLEAR_MASTER_PIC
         
          ;refresh esp (Stack-Pointer)         
          mov eax,[_p] ;put adress of struct of current process in eax.
          mov esp,[eax] ;restore adress of esp.

          ;restore all registers
          pop gs
          pop fs
          pop es
          pop ds
          popad
         
          iretd

Die ISR (Debugger):
00104c10: (                    ): pushad                    ; 60
00104c11: (                    ): push ds                   ; 1e
00104c12: (                    ): push es                   ; 06
00104c13: (                    ): push fs                   ; 0fa0
00104c15: (                    ): push gs                   ; 0fa8
00104c17: (                    ): mov eax, dword ptr ds:0x306930 ; a130693000
00104c1c: (                    ): mov dword ptr ds:[eax], esp ; 8920
00104c1e: (                    ): call .+0xffffdbaf         ; e8afdbffff
00104c23: (                    ): mov eax, 0x00000020       ; b820000000
00104c28: (                    ): out 0x20, al              ; e620
00104c2a: (                    ): mov eax, dword ptr ds:0x306930 ; a130693000
00104c2f: (                    ): mov esp, dword ptr ds:[eax] ; 8b20
00104c31: (                    ): pop gs                    ; 0fa9
00104c33: (                    ): pop fs                    ; 0fa1
00104c35: (                    ): pop es                    ; 07
00104c36: (                    ): pop ds                    ; 1f
00104c37: (                    ): popad                     ; 61
00104c38: (                    ): iretd                     ; cf

Code des neuen Tasks (soweit kommt es erst garnicht):
001000b0: (                    ): push ebp                  ; 55
001000b1: (                    ): mov ebp, esp              ; 89e5
001000b3: (                    ): cli                       ; fa
001000b4: (                    ): hlt                       ; f4
001000b5: (                    ): pop ebp                   ; 5d
001000b6: (                    ): ret                       ; c3

Dump direkt vor IRETD (nur ein Task, kein Switch / ohne Fehler):
| STACK 0x070c [0x17c3]
 | STACK 0x070e [0xff80]
 | STACK 0x0710 [0x0008]
 | STACK 0x0712 [0x0000]
 | STACK 0x0714 [0x0246]
 | STACK 0x0716 [0x0000]
 | STACK 0x0718 [0x07d0]
 | STACK 0x071a [0x0000]
 | STACK 0x071c [0x0fff]
 | STACK 0x071e [0x0000]
 | STACK 0x0720 [0xcccd]
 | STACK 0x0722 [0xcccc]
 | STACK 0x0724 [0x0000]
 | STACK 0x0726 [0x0000]
 | STACK 0x0728 [0x0788]
 | STACK 0x072a [0x0000]
 
eax:0x00000000, ebx:0x00000016, ecx:0x00000000, edx:0x000003d5
ebp:0x00000728, esp:0x0000070c, esi:0x00000fff, edi:0x000c3000
eip:0x00104c38, eflags:0x00000006, inhibit_mask:0
cs:s=0x0008, dl=0x0000fbff, dh=0x00cf9a00, valid=1
ss:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=7
ds:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=1
es:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=1
fs:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
gs:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
ldtr:s=0x0000, dl=0x0000ffff, dh=0x00008200, valid=1
tr:s=0x0000, dl=0x0000ffff, dh=0x00008300, valid=1
gdtr:base=0x00007dcc, limit=0x17
idtr:base=0x00106018, limit=0x7ff
dr0:0x00000000, dr1:0x00000000, dr2:0x00000000
dr3:0x00000000, dr6:0xffff0ff0, dr7:0x00000400
cr0:0x80000011, cr1:0x00000000, cr2:0x00000000
cr3:0x0009e000, cr4:0x00000000

Dump direkt vor IRETD (erster Taskswitch, neuer Stack / Fehler):
| STACK 0x11226d [0x00b0]
 | STACK 0x11226f [0x0010]
 | STACK 0x112271 [0x0008]
 | STACK 0x112273 [0x0000]
 | STACK 0x112275 [0x0246]
 | STACK 0x112277 [0x0000]
 | STACK 0x112279 [0x0000]
 | STACK 0x11227b [0x0000]
 | STACK 0x11227d [0x0ee1]
 | STACK 0x11227f [0x0011]
 | STACK 0x112281 [0x46a7]
 | STACK 0x112283 [0x001f]
 | STACK 0x112285 [0x0000]
 | STACK 0x112287 [0x0000]
 | STACK 0x112289 [0x0000]
 | STACK 0x11228b [0x0000]
 
eax:0x00000000, ebx:0x00000000, ecx:0x00000000, edx:0x00000000
ebp:0x00000000, esp:0x0011226d, esi:0x00000000, edi:0x00000000
eip:0x00104c38, eflags:0x00000006, inhibit_mask:0
cs:s=0x0008, dl=0x0000fbff, dh=0x00cf9a00, valid=1
ss:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=7
ds:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
es:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
fs:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
gs:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
ldtr:s=0x0000, dl=0x0000ffff, dh=0x00008200, valid=1
tr:s=0x0000, dl=0x0000ffff, dh=0x00008300, valid=1
gdtr:base=0x00007dcc, limit=0x17
idtr:base=0x00106018, limit=0x7ff
dr0:0x00000000, dr1:0x00000000, dr2:0x00000000
dr3:0x00000000, dr6:0xffff0ff0, dr7:0x00000400
cr0:0x80000011, cr1:0x00000000, cr2:0x00000000
cr3:0x0009e000, cr4:0x00000000

Der Fehler (direkt nach IRETD):
00015057973e[CPU0 ] iret: return CS selector null


Danke für eure Hilfe :-)

Adi

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #42 am: 14. April 2007, 02:41 »
Problem gelöst!  :-) :-) :-) :-) :-)

Detaillierte Infos kommen demnächst...

Adi

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #43 am: 18. April 2007, 11:12 »
Mehr Infos (LÖSUNG)

Wie mir empfohlen worden ist hab ich den Bootloader umgestellt, und zwar von bootf02 (www.osdever.net) auf Grub!

Die exakte Ursache weis ich leider nicht, aber hab inzwischen herausgefunden das der alte startcode paging aktiviert, und grub eben nicht, auserdem werden bei einem Stack-Dump nun 32Bit Werte angezeigt (bei den alten dumps, [siehe oben] waren es 16Bit??!!).... :|

Inzwischen kann ich Grub nur empfehlen da dieser auch z. B. Möglichkeiten bietet die RAM-Größe auszulesen!

Hier noch aktuelle Debug-Infos über Regsiter und Stack-Zustand direkt vor IRETD:

        _hwint0:
          cli
          ;save all registers
          pushad
          push ds
          push es
          push fs
          push gs
         
          mov eax,[_process] ;put the adress of the struct of CURRENT PROCESS in eax.(the CONTENT of pointer p)
          mov [eax],esp ;save esp in the location of esp in the CURRENT PROCESS-STRUCT.
         
          ;switch Task (C-Code)
          call _switch_task
         
          ;clear PIC
          CLEAR_MASTER_PIC
         
          ;refresh esp (Stack-Pointer)         
          mov eax,[_process] ;put adress of struct of current process in eax.
          mov esp,[eax] ;restore adress of esp.

          ;restore all registers
          pop gs
          pop fs
          pop es
          pop ds
          popad
         
          iretd

001031b0: (                    ): cli                       ; fa
001031b1: (                    ): pushad                    ; 60
001031b2: (                    ): push ds                   ; 1e
001031b3: (                    ): push es                   ; 06
001031b4: (                    ): push fs                   ; 0fa0
001031b6: (                    ): push gs                   ; 0fa8
001031b8: (                    ): mov eax, dword ptr ds:0x106840 ; a140681000
001031bd: (                    ): mov dword ptr ds:[eax], esp ; 8920
001031bf: (                    ): call .+0xffffe472         ; e872e4ffff
001031c4: (                    ): mov eax, 0x00000020       ; b820000000
001031c9: (                    ): out 0x20, al              ; e620
001031cb: (                    ): mov eax, dword ptr ds:0x106840 ; a140681000
001031d0: (                    ): mov esp, dword ptr ds:[eax] ; 8b20
001031d2: (                    ): pop gs                    ; 0fa9
001031d4: (                    ): pop fs                    ; 0fa1
001031d6: (                    ): pop es                    ; 07
001031d7: (                    ): pop ds                    ; 1f
001031d8: (                    ): popad                     ; 61
001031d9: (                    ): iretd                     ; cf

| STACK 0x00067d7c [0x00101f53]
 | STACK 0x00067d80 [0x00000008]
 | STACK 0x00067d84 [0x00000246]
 | STACK 0x00067d88 [0x00067d02]
 | STACK 0x00067d8c [0x00067da0]
 | STACK 0x00067d90 [0x00101019]
 | STACK 0x00067d94 [0x00000000]
 | STACK 0x00067d98 [0x00067db8]
 | STACK 0x00067d9c [0x001040f0]
 | STACK 0x00067da0 [0x0011062d]
 | STACK 0x00067da4 [0x00104054]
 | STACK 0x00067da8 [0x00000019]
 | STACK 0x00067dac [0x00000002]
 | STACK 0x00067db0 [0x00000000]
 | STACK 0x00067db4 [0x40067de4]
 | STACK 0x00067db8 [0x00067e38]
 | STACK 0x00067dbc [0x00101390]
 | STACK 0x00067dc0 [0x0011061c]
 | STACK 0x00067dc4 [0x00101019]
 | STACK 0x00067dc8 [0x0000000a]
 | STACK 0x00067dcc [0x20202020]
 | STACK 0x00067dd0 [0x20202020]
 | STACK 0x00067dd4 [0x00106884]
 | STACK 0x00067dd8 [0x203a726f]
 | STACK 0x00067ddc [0x20200a00]

eax:0x00000000, ebx:0x0011062d, ecx:0x000b8f9e, edx:0x000003d5
ebp:0x00067d98, esp:0x00067d7c, esi:0x00067e5c, edi:0x00067e24
eip:0x001031d9, eflags:0x00000006, inhibit_mask:0
cs:s=0x0008, dl=0x0000ffff, dh=0x00cf9a00, valid=1
ss:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=7
ds:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=1
es:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=1
fs:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=1
gs:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=1
ldtr:s=0x0000, dl=0x0000ffff, dh=0x00008200, valid=1
tr:s=0x0000, dl=0x0000ffff, dh=0x00008300, valid=1
gdtr:base=0x00008f5c, limit=0x27
idtr:base=0x00106028, limit=0x7ff
dr0:0x00000000, dr1:0x00000000, dr2:0x00000000
dr3:0x00000000, dr6:0xffff0ff0, dr7:0x00000400
cr0:0x00000011, cr1:0x00000000, cr2:0x00000000
cr3:0x00000000, cr4:0x00000000

Danke an alle die mir bei diesem Problem geholfen haben!
Wird sicher nicht lange dauern bis ich euch wieder belästige :roll: :-P

 

Einloggen