Autor Thema: Interrupts - PageFault  (Gelesen 16525 mal)

Adi

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 30. March 2007, 10:52 »
Okay, dieses Tutorial ist genau das was ich brauche ;-)

Allerdings der dort verwendete Assembler-Code ist im Intel-Syntax :-(
Ich nutze in meinem Projekt allerdings den AT&T... (NASM für Windows)

Gibt es hierfür Converter?
Leider sind meine ASM-Kenntisse begrenzt und reichen lediglich zum verstehen was der Code macht... (kurz gesagt mir fehlt einfach die praktische Erfahrung im Assembler coden) und ich möchte mir das implementieren nicht unnötig erschweren indem ich den Code falsch übersetze :-(

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #21 am: 30. March 2007, 11:27 »
intel2gas (hab den aber nicht getestet)
btw. der Code im zweiten Link is AT&T Syntax :wink:
« Letzte Änderung: 30. March 2007, 11:30 von bluecode »
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Adi

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 30. March 2007, 15:57 »
@bluecode:

hast recht  :wink:
und ich hab deine Empfehlung umgesetzt! halte es inzwischen auch für das einzigst sinnvolle die ISR in Assembler zu implementieren!

Assembler ist gar nicht zu übel wenn man sich näher damit beschäftigt^^

Habs so gemacht:

[BITS 32] ; protected mode

[GLOBAL _hwint0]
[GLOBAL _hwint1]

; this is in our C++ code
[extern _interrupt0]
[extern _keyboard_int]
; ***************************

      %macro REG_SAVE 0
      ;save all registers
          push eax
          push ebx
          push ecx
          push edx
          push esi
          push edi
          push ebp
      %endmacro

      %macro REG_RESTORE 0
          pop ebp
          pop edi
          pop esi
          pop edx
          pop ecx
          pop ebx
          pop eax
      %endmacro

      %macro CLEAR_MASTER_PIC 0
          mov eax, 0x20
          out 0x20, al
      %endmacro
     
        _hwint0:
          REG_SAVE
          call _interrupt0
          CLEAR_MASTER_PIC
          REG_RESTORE
          iret
         
        _hwint1:
          REG_SAVE
          call _keyboard_int
          CLEAR_MASTER_PIC
          REG_RESTORE
          iret
         

extern "C" void interrupt0(void);

void interrupt0(void)
{

//std::cout << 'X';

}

@all:

Was mich jedoch interessieren würde... welchen Asm-Syntax nutzt ihr in euren Projekten? Intel oder AT&T?
Mir fiel nämlich auf dass ich beim Inline Assembler den AT&T nutze und wenn ich eine eigne SRC-Datei hab den Intel Syntax!
(Hab mir eine Entwicklungsumgebung aufgebaut mit Eclipse-CDT in verbindung mit DJGPP)

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 30. March 2007, 16:03 »
Ich nutze in meinem Projekt allerdings den AT&T... (NASM für Windows)
AT&T syntax? bist du dir sicher? Hab das gefühl du vertauchst da was. Nasm ist standartmäßig im Intelsyntax und dein Code im leztetn post auch.

Edit:
Ops. Hab den Teil unter dem Code überlesen. Hatte mich halt irritrt das du geschriben(bzw. ich dich so verstanden hab) hast du würdest AT&T in Nasm benutzen.

Ich benutze Intellsyntax(auch als inline)
« Letzte Änderung: 30. March 2007, 16:41 von M.Nemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #24 am: 30. March 2007, 16:16 »
Assembler ist gar nicht zu übel wenn man sich näher damit beschäftigt^^
Für kleinere Codestücke kann man schonmal Assembler hernehmen.
Denk daran an die Slave PIC auch einen EOI zu senden bei IRQs > 7.

Zitat
Was mich jedoch interessieren würde... welchen Asm-Syntax nutzt ihr in euren Projekten? Intel oder AT&T?
Ich nutze mittlerweile ausschließlich AT&T Syntax und als Assembler AS. Ich find AT&T nach ner eingewöhnungszeit eigentlich auch nicht viel komplizierter als Intel Syntax...
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Adi

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 03. April 2007, 16:47 »
So... häng leider immer noch am Multitasking  :-(
Hab versucht das Prinzip der Tutorials in meinen Kernel einzubauen, jedoch komm ich mal wieder nicht weiter und wäre froh wenn ihr mir helfen könnt!

Hier ist mein aktueller Stand, vllt. hab ich ja etwas grundlegendes übersehen oder falsch verstanden:

Die ISR:

[GLOBAL _hwint0]
[GLOBAL _hwint1]

[extern _switch_task]
[extern _p] 

; this is in our C++ code
[extern _keyboard_int]
; ***************************

        _hwint0:
          ;save all registers
          pushad
          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.
         
          call _switch_task
          CLEAR_MASTER_PIC
         
          ;restore all registers         
          mov eax,[_p] ;put adress of struct of current process in eax.
          mov esp,[eax] ;restore adress of esp.
          popad
         
          iret

Der C/C++ Code:

      typedef unsigned char uchar_t;  // -->Length: 8 bit
      typedef unsigned short ushort_t; // -->Length: 16 bit
      typedef unsigned int uint_t;   // -->Length: 32 bit
      typedef unsigned long ulong_t;  // -->Length: 64 bit
     
        typedef struct {
          uint_t prozess_esp;    //actual position of esp
          uint_t prozess_ss;     //actual stack segment.
          uint_t prozess_kstack; //stacktop of kernel stack
          uint_t prozess_ustack; //stacktop of user stack
          uint_t prozess_cr3;
          uint_t prozess_number;
          uint_t prozess_parent;
          uint_t prozess_owner;
          uint_t prozess_group;
          uint_t prozess_timetorun;
          uint_t prozess_sleep;
          uint_t prozess_priority;
          uint_t prozess_filehandle;
          //console_t *prozess_console;
          //memtree_t *vmm_alloc; //memory management info concerning the process
                        //- all its allocated virtual memory
          uchar_t prozess_name[32];
        } prozess_t;
       
        typedef void (*entry_t)(void);
       
extern "C" void switch_task(void);
extern "C" void hwint0();
extern "C" prozess_t *p;

prozess_t *p;

void switch_task(void)
{
kernel->tasks->switch_task();
}

class_multitasking::class_multitasking()
{
p=&prozess[0];
current_p=0;
task_count=1;
}

class_multitasking::~class_multitasking() {}

void class_multitasking::switch_task()
{
++current_p;
if(current_p >= task_count)current_p=0;

p=&prozess[current_p];

//debug
char buffer[32];
itoa(current_p,buffer,10);
std::cout
<< "\nTask: "
<< buffer
<< "\n";
}

prozess_t* class_multitasking::task_anlegen(entry_t entry)
{
++task_count;

         //filling in the kstack for start up:
        uint_t *stacksetup; //temporary pointer

         stacksetup=((uint_t*)malloc(5000))+5000;
        *stacksetup--;
        *stacksetup--=0x0202;
        *stacksetup--=0x08;
        *stacksetup--=(uint_t)entry; //This is the adress of the process' entry point (z.b. main());
        *stacksetup--=0;    //ebp
        *stacksetup--=0;    //esp
        *stacksetup--=0;    //edi
        *stacksetup--=0;    //esi
        *stacksetup--=0;    //edx
        *stacksetup--=0;    //ecx
        *stacksetup--=0;    //ebx
        *stacksetup--=0;    //eax


//filling in the struct.
        prozess[task_count-1].prozess_esp=(uint_t)stacksetup;
}

Der Code für das Task-switching (::switch_task() usw.) ist nicht besonders intelligent gemacht^^
soll ja aber auch nur zum test dienen und zumindest prinzipiell funktionieren;-)

Das Ergebnis:

Nach dem Start des Kernels wird natürlich dauerhaft "Task: 0" ausgegeben... funzt also soweit! wenn ich nun einen neuen Task anlege mit: kernel->tasks->task_anlegen(test_task);
Dann sehe ich auch noch einmal "Task: 1" danach kommt es zu:
"Virutal machine kernel stack fault (hardware reset"
"The virtual machine just suffered a stack fault in kernel mode. On a real computer, this would amount to reset of the processor...."
Wie ich schon glaube rausgefunden zu haben geschieht dies genau nach dem IRET also wenn der Code des neuen Tasks ausgeführt werden soll!

Der neue Task:

void test_task();
void test_task()
{
std::cout << "XXXXXXXXXXXX-NEWTASK-XXXXXXXXXXXXXXX";
}

Achja wenn es euch lieber ist dass ich für dieses Prob. ein eigenes Thema eröffne sagt es bitte :-)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 03. April 2007, 18:22 »
möglicherweise gibt dein malloc einen NULL Zeiger zurück.

Außerdem ist
stacksetup=((uint_t*)malloc(5000))+5000; nicht korrekt. Du legst damit den Stack 20000 Bytes über dem von malloc allokierten Bereich an. Korrekt wäre:

stacksetup=(uint_t*)(((char*)malloc(5000))+5000);
Obs daran liegt ... glaub ich nicht.
Dieser Text wird unter jedem Beitrag angezeigt.

Adi

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 04. April 2007, 00:11 »
@PorkChicken: thx, da war ich wohl nicht richtig bei der sache :roll:

Aber wie vermutet... mit dem eigentlich Problem hat es nichts zu tun :-(

Adi

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 08. April 2007, 19:30 »
Hat niemand eine idee :? :cry:

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #29 am: 09. April 2007, 15:46 »
Gescheiter Emulator und exception handler? Vmware ist halt beim debuggen nicht so toll. Ich würd da dann doch eher bochs empfehlen. Und bei den Exception handlern halt alles relevante ausgeben lassen.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Adi

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #30 am: 10. April 2007, 00:27 »
Dachte bisher eben an einen Grundlegenden Fehler der euch gleich auffällt :-)
Also mit Bochs komm ich der Sache schon näher:

"iret: return CS selector null"

Dies wird direkt vor dem neustart protokolliert!
Könnt ihr damit etwas anfangen :?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #31 am: 10. April 2007, 08:45 »
Lass dir doch zB vor jedem Taskswitch so Sachen wie esp oder was man halt noch so abchecken sollte, ausgeben. Vllt kommst du so der Sache näher. Oder in bochs mal einen breakpoint vor das iret und bei jedem Taskswitch den stack mit dem was zu erwarten wäre vergleichen.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #32 am: 10. April 2007, 09:53 »
Also bei dieser Fehlerausgabe stimmt mit Sicherheit einfach was mit den Stacks welche für den Taskswitch notwendig sind nicht. Da kann entweder was verändert, die falsche Stackadresse gespeichert oder etwas falsch gemappt sein...Schau dir deshalb beim Debuggen auch das CR3, die PageTables und die Pages an und schau ob die erwartungsgemäss stimmen.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #33 am: 10. April 2007, 11:47 »
edit2: vergesst einfach was da stand ^^  :oops:
« Letzte Änderung: 10. April 2007, 11:54 von bluecode »
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Adi

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #34 am: 10. April 2007, 14:02 »
hey also hab da noch einen Fehler gefunden:

Richtig:
        *stacksetup--;
        *stacksetup--=0x0202;
        *stacksetup--=0x08;
        *stacksetup--=(uint_t)entry;
        *stacksetup--=0;    //ebp
        *stacksetup--=0;    //esp
        *stacksetup--=0;    //edi
        *stacksetup--=0;    //esi
        *stacksetup--=0;    //edx
        *stacksetup--=0;    //ecx
        *stacksetup--=0;    //ebx
        *stacksetup=0;    //eax

Hatte ein -- zuviel am Ende ;-)
Was zur Folge hatte das ESP eins zu klein war!

Falsch:
*stacksetup--=0;    //eax

(An der Stelle möchte ich noch erwähnen dass im Tutorial auch die 16Bit Register auf den Stack gesichert werden, allerdings stürzt dann gleich der ganze Kernel ab weswegen ich den Teil weggelassen hab...)

Bochs gibt mir nun folgende Fehler aus:

...

IO write to 0020 = 20
00041422055d[PIC  ] signalling IRQ(0)
00041422066d[CPU0 ] IRET PROTECTED
00041422066e[CPU0 ] fetch_raw_descriptor: LDT: index (fea7)1fd4 > limit (0)
00041422066d[CPU0 ] exception(0x0D)
00041422066d[CPU0 ] interrupt(): vector = 13, INT = 0, EXT = 1
00041422066d[CPU0 ] int_trap_gate286(): INTERRUPT TO SAME PRIVILEGE
00041422084e[CPU0 ] read_virtual_checks(): read beyond limit
00041422084d[CPU0 ] exception(0x0C)
00041422084d[CPU0 ] interrupt(): vector = 12, INT = 0, EXT = 1
00041422084d[CPU0 ] int_trap_gate286(): INTERRUPT TO SAME PRIVILEGE
00041422102e[CPU0 ] read_virtual_checks(): read beyond limit
00041422102d[CPU0 ] exception(0x0C)
00041422102d[CPU0 ] interrupt(): vector = 12, INT = 0, EXT = 1
00041422102d[CPU0 ] int_trap_gate286(): INTERRUPT TO SAME PRIVILEGE
00041422120e[CPU0 ] read_virtual_checks(): read beyond limit
00041422120d[CPU0 ] exception(0x0C)
00041422120d[CPU0 ] interrupt(): vector = 12, INT = 0, EXT = 1
00041422120d[CPU0 ] int_trap_gate286(): INTERRUPT TO SAME PRIVILEGE
00041422138e[CPU0 ] read_virtual_checks(): read beyond limit
00041422138d[CPU0 ] exception(0x0C)
00041422138d[CPU0 ] interrupt(): vector = 12, INT = 0, EXT = 1
00041422138d[CPU0 ] int_trap_gate286(): INTERRUPT TO SAME PRIVILEGE
00041422156e[CPU0 ] read_virtual_checks(): read beyond limit
00041422156d[CPU0 ] exception(0x0C)
00041422156d[CPU0 ] interrupt(): vector = 12, INT = 0, EXT = 1
00041422156d[CPU0 ] int_trap_gate286(): INTERRUPT TO SAME PRIVILEGE
00041422174e[CPU0 ] read_virtual_checks(): read beyond limit
00041422174d[CPU0 ] exception(0x0C)
00041422174d[CPU0 ] interrupt(): vector = 12, INT = 0, EXT = 1
00041422174d[CPU0 ] int_trap_gate286(): INTERRUPT TO SAME PRIVILEGE
00041422192e[CPU0 ] read_virtual_checks(): read beyond limit
00041422192d[CPU0 ] exception(0x0C)
00041422192d[CPU0 ] interrupt(): vector = 12, INT = 0, EXT = 1
00041422192d[CPU0 ] int_trap_gate286(): INTERRUPT TO SAME PRIVILEGE
00041422210e[CPU0 ] read_virtual_checks(): read beyond limit
00041422210d[CPU0 ] exception(0x0C)

...

Ich hoffe dass ich den richtigen Log-Ausschnitt erwischt habe!
Mir ist nämlich noch nicht ganz klar wie ich Breakpoints speziell für IRET setze...  :|

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #35 am: 10. April 2007, 14:08 »
Mir ist nämlich noch nicht ganz klar wie ich Breakpoints speziell für IRET setze...  :|
Du musst halt herausfinden an welcher adresse sich das iret in deiner kerneldatei befindet, dann machst du für die adresse einen breakpoint.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Adi

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #36 am: 10. April 2007, 15:39 »
@bluecode

Ja schon, sorry dass ich mich so blöde anstelle... aber wie komme ich an die Adresse? :oops:

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #37 am: 10. April 2007, 16:17 »
Man nehme den Disassembler seiner Wahl und disassembliere seinen Kernel. Dann suche man nach dem iret. Bei allen Disassemblern steht links vom disassemblierten Opcode die Adresse an welcher dieser Opcode zu finden war. Wenn dein Dateiformat Symbolnamen unterstützt, dann kannste auch nach dem Symbol suchen unter dem iret auftaucht, dann wirds ein bisschen einfacher.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #38 am: 10. April 2007, 18:50 »
in bochs kanst du auch mit dem komando "show int" alle iret's (mit addresse)auflisten lassen die auftreten
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Adi

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #39 am: 11. April 2007, 15:44 »
@M.Nemo: Genial, genau das hab ich gebraucht ;-) thx

Über den internen Disassembler kam ich dann an die folgenden Adressen:

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              ; e620
00104c3b: (                    ): mov eax, dword ptr ds:0x306930 ; a130693000
00104c40: (                    ): mov esp, dword ptr ds:[eax] ; 8b20
00104c42: (                    ): pop esp                   ; 5c
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

Und hier nun endlich detaillierte Infos zum Problem :-)

Die Debug-Infos betreffen folgende Situation:

->neuer Task wurde angelegt!
->ISR0: Erster Task-Switch

(Code mit dem dazugehörigen Stack/Register Status)
        _hwint0:
          ;save all registers
          REG_SAVE
             
 | STACK 0x06b0 [0x06b4]
 | STACK 0x06b2 [0x0000]
 | STACK 0x06b4 [0x06f8]
 | STACK 0x06b6 [0x0000]
 | STACK 0x06b8 [0x6940]
 | STACK 0x06ba [0x0010]
 | STACK 0x06bc [0x0784]
 | STACK 0x06be [0x0000]
 | STACK 0x06c0 [0x0000]
 | STACK 0x06c2 [0x0000]
 | STACK 0x06c4 [0x0000]
 | STACK 0x06c6 [0x0000]
 | STACK 0x06c8 [0x8f08]
 | STACK 0x06ca [0x000b]
 | STACK 0x06cc [0x0000]
 | STACK 0x06ce [0x0000]
 
eax:0x00000000, ebx:0x000b8f08, ecx:0x00000000, edx:0x00000000
ebp:0x000006f8, esp:0x000006b0, esi:0x00000784, edi:0x00106940
eip:0x00104c28, eflags:0x00000046, 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=7
es:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=5
fs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
gs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
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
           
          mov eax,[_p] ;put the adress of the struct of CURRENT PROCESS in eax.(the CONTENT of pointer p)
         
 | STACK 0x06b0 [0x06b4]
 | STACK 0x06b2 [0x0000]
 | STACK 0x06b4 [0x06f8]
 | STACK 0x06b6 [0x0000]
 | STACK 0x06b8 [0x6940]
 | STACK 0x06ba [0x0010]
 | STACK 0x06bc [0x0784]
 | STACK 0x06be [0x0000]
 | STACK 0x06c0 [0x0000]
 | STACK 0x06c2 [0x0000]
 | STACK 0x06c4 [0x0000]
 | STACK 0x06c6 [0x0000]
 | STACK 0x06c8 [0x8f08]
 | STACK 0x06ca [0x000b]
 | STACK 0x06cc [0x0000]
 | STACK 0x06ce [0x0000]         
         
eax:0x00110b91, ebx:0x000b8f08, ecx:0x00000000, edx:0x00000000
ebp:0x000006f8, esp:0x000006b0, esi:0x00000784, edi:0x00106940
eip:0x00104c2d, eflags:0x00000046, 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=7
es:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=5
fs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
gs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
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       
         
         
          mov [eax],esp ;save esp in the location of esp in the CURRENT PROCESS-STRUCT.
         
          call _switch_task

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

eax:0x00306934, ebx:0x000b8f30, ecx:0x00000000, edx:0x00000000
ebp:0x000006f8, esp:0x000006b0, esi:0x00000798, edi:0x00106940
eip:0x00104c34, 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=7
es:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=5
fs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
gs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
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

          CLEAR_MASTER_PIC
         

         
          ;restore all registers         
          mov eax,[_p] ;put adress of struct of current process in eax.
          mov esp,[eax] ;restore adress of esp.
         
 | 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]
 | STACK 0x112289 [0x0000]
 | STACK 0x11228b [0x0000]
 | STACK 0x11228d [0x0000]
 | STACK 0x11228f [0x0000]
 | STACK 0x112291 [0x0000]
 
eax:0x00110be5, ebx:0x000b8f30, ecx:0x00000000, edx:0x00000000
ebp:0x000006f8, esp:0x0011224d, esi:0x00000798, edi:0x00106940
eip:0x00104c42, 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=7
es:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=5
fs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
gs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
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


          REG_RESTORE

 | 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]

eax:0xf000ff53, ebx:0xf000ff53, ecx:0xf000ff53, edx:0xf000ff53
ebp:0xf000ff53, esp:0x0000001c, esi:0xf000ff53, edi:0xf000ff53
eip:0x00104c4a, 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=7
es:s=0x0010, dl=0x0000ffff, dh=0x00cf9300, valid=5
fs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
gs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
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
           
          iret
         
00022437138e[CPU0 ] fetch_raw_descriptor: LDT: index (fea7)1fd4 > limit (0)
00022437138: exception (not softint) 0008:001049e6 (0x001049e6)
00022437138: iret 0008:001049e6 (0x001049e6)
00022437156e[CPU0 ] read_virtual_checks(): read beyond limit
00022437156: exception (not softint) 0008:00104a0e (0x00104a0e)
00022437174e[CPU0 ] read_virtual_checks(): read beyond limit
00022437174: exception (not softint) 0008:00104a0e (0x00104a0e)
00022437192e[CPU0 ] read_virtual_checks(): read beyond limit
00022437192: exception (not softint) 0008:00104a0e (0x00104a0e)
00022437210e[CPU0 ] read_virtual_checks(): read beyond limit
00022437210: exception (not softint) 0008:00104a0e (0x00104a0e)
00022437228e[CPU0 ] read_virtual_checks(): read beyond limit
00022437228: exception (not softint) 0008:00104a0e (0x00104a0e)
...
« Letzte Änderung: 11. April 2007, 17:36 von Adi »

 

Einloggen