Autor Thema: Probleme mit Teil 8 des Tutorials  (Gelesen 6186 mal)

spaceemotion

  • Beiträge: 49
    • Profil anzeigen
    • SpaceEmotion
Gespeichert
« am: 07. November 2010, 13:58 »
Hallo zusammen,
ich habe mal wieder ein Problem Im Teil 8 des Tutorials werden Programme geschrieben. Das klappte auch alles super - bis ich eine ganz einfache Funktion schreiben wollte, wie zum Beispiel
void a() {}Die Funktion macht zwar nichts, wird auch nicht aufgerufen, aber trotzdem stürzt QEMU mit folgender Meldung ab.
qemu: fatal: Trying to execute code outside RAM or ROM at 0x53f000ff

EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000000
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00001020
EIP=53f000ff EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0000 00000000 00000000 00000000
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0000 00000000 00000000 00000000
FS =0000 00000000 00000000 00000000
GS =0000 00000000 00000000 00000000
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00100042 00000017
IDT=     00126360 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=f000ff69 CCO=INCL   
FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
Den kompletten Code gibt es hier: sesdll1.se.funpic.de/lowlevel/User_Space/. Ich wette, dass das ein ganz doofer Fehler ist, aber ich finde ihn trozdem nicht.

SpaceEmotion

PS: Der Ordner "core" heißt ".core" und "include" ".include".

LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #1 am: 07. November 2010, 19:41 »
hallo,

wie viel Arbeitsspeicher hast du dem virtuellen PC denn zugewiesen?
klingt nämlich nach zu wenig RAM

LittleFox

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 07. November 2010, 19:55 »
Ich denke nicht, dass es was mit zu wenig RAM zu tun hat. Der Wert EIP=0x53f000ff klingt nach NULL-Pointer-Dereferenzierung. Insbesondere ist der Wert von ESP auffällig. Du solltest feststellen, was sich an dieser Adresse befinden sollte. Ich vermute der Fehler tritt bei der Rückkehr aus einem Interrupt Handler auf. Von da aus solltest du rückwärts mögliche Quellen für den Fehler (falscher Wert in ESP) suchen.
Dieser Text wird unter jedem Beitrag angezeigt.

LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #3 am: 07. November 2010, 19:58 »
OK, der ESP wert ist wirklich komisch ...
Ich bin nur über
qemu: fatal: Trying to execute code outside RAM or ROM at 0x53f000ff gestolpert, das hatte ich heute auch schon und da war es der RAM

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 07. November 2010, 20:03 »
Wenn das der Fall ist, wird das Vergrößern des RAMs wird nicht die Ursache des Fehlers (nämlich Annahme einer bestimmten Menge RAM) beheben.
Dieser Text wird unter jedem Beitrag angezeigt.

LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #5 am: 07. November 2010, 22:10 »
der 'fehler' war, dass ich noch kein paging hab und ein programm an 128mb geladen werden wollte, 64 waren zugewiesen
in teil 8 hat man auch noch kein paging

spaceemotion

  • Beiträge: 49
    • Profil anzeigen
    • SpaceEmotion
Gespeichert
« Antwort #6 am: 09. November 2010, 08:22 »
Hallo,
vielen Dank erstmal. Ich habe den Fehler selbst gefunden. Es war ein Problem mit dem Multitasking, der sich in meinem Falle durch das starten eine Dummy Task beheben ließ. Ok, so weit so gut, jetzt bekomme ich bei gleichem Code eine GP-Exception. Hat jemand eine Idee?

S.

Programm Noob

  • Gast
Gespeichert
« Antwort #7 am: 09. November 2010, 09:38 »
du meinst GPF? Guck mal wo EIP ist der führt vieleicht irgendwelchen Mist aus oder benutzt du cli sti hlt oder so in einem Ring3 Task? Ohne Weitere Infos ist ne Hilfe schlecht. nen GPF hat viele Ursachen.

PNoob

spaceemotion

  • Beiträge: 49
    • Profil anzeigen
    • SpaceEmotion
Gespeichert
« Antwort #8 am: 09. November 2010, 09:56 »
Aus irgendeinem Grund, ist es jetzt kein GPF mehr sondern ein Invalid Opcode. Also noch mal ein paar Infos:
 - Das Interuptflag ist gesetzt
 - Ich habe keine Ring-3-Tasks
Wie genau finde ich heraus, worauf die Pointer zeigen? Mit *(cpu_state->esp) funktioniert es nicht...
Also, wo finde ich mögliche Ursachen für einen Invalid Opcode?

S.

Programm Noob

  • Gast
Gespeichert
« Antwort #9 am: 09. November 2010, 10:03 »
die adresse von eip ist interesant.
Aber Invalid Opcode sieht mir stark danach aus, als würdest du ausversehen über deinen Kernel herausden Code ausführen. haben alle deine Funktionen, die du als Tasks startest ne Endlosschleife?
Die adresse bekommst du dann mit printf("EIP: 0x%X",cpu_state->eip);  raus.

PNoob

spaceemotion

  • Beiträge: 49
    • Profil anzeigen
    • SpaceEmotion
Gespeichert
« Antwort #10 am: 09. November 2010, 14:22 »
Lösung gefunden! Dank an alle, die sich Gedanken gemacht haben.
Zur Lösung:
Vorher:
void a()
{

}
Jetzt habe ich das so:
void a();
....
void a()
{

}

 

Einloggen