Autor Thema: Interrupts funktionieren nicht  (Gelesen 4571 mal)

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« am: 23. January 2013, 17:38 »
Hi, ich habe jetzt versucht interrupts zu "empfangen", aber auch wenn ich mich ans Tutorial gehalten habe, es passiert einfach nichts, und ich hab auch eine Idee, warum: Ich nutze ja
#define IDT_ENTRIES 256
static long long unsigned int idt[IDT_ENTRIES];

static void idt_set_entry(int i, void (*fn)(), unsigned int selector, int flags)
{
    unsigned long int handler = (unsigned long int) fn;
    idt[i] = handler & 0xffffLL;
    idt[i] |= (selector & 0xffffLL) << 16;
    idt[i] |= (flags & 0xffLL) << 40;
    idt[i] |= ((handler>> 16) & 0xffffLL) << 48;
}
So etwas, um die Interrupts zu "leiten".

Woher soll aber der PC wissen, dass er bei einem Interrupt ausgerechnet in "idt" nachgucken soll? Ich meine, ich könnte das ja auch umbenennen und nicht idt sondern "eierkuchen" oder so nennen. Das ist doch eigentlich nur ein Array der da so im Code "rumgammelt"... oder?

iksnagreb

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 23. January 2013, 18:03 »
Hallo.
Um zu wissen, wo er nachgucken soll muss die idt geladen werden. Hast du sie geladen? Wenn nicht kannst du hier http://www.lowlevel.eu/wiki/IDT nachlesen, wie das geht.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 23. January 2013, 18:13 »
struct {
        unsigned short int limit;
        void* pointer;
    } __attribute__((packed)) idtp = {
        .limit = IDT_ENTRIES * 8 - 1,
        .pointer = idt,
    };

//...

asm volatile("lidt %0" : : "m" (idtp));

Überigens hat sich mein Problem etwas geändert: Mittlerweile passiert nichts, wenn ich die GDT NICHT lade und dann asm volatile("int $0x0"); mache; wenn ich aber die GDT lade und asm volatile("int $0x0"); mache, passiert folgendes:



Ein eigenartiges "Phänomen": Wenn ich IRGENDETWAS im Code verändere und neu compiler, egal wo, ändert sich das Zeichen und die Hintergrundfarbe, die Positionen bleiben aber gleich...

HÄ?

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 23. January 2013, 18:34 »
Der Vram Puffer in der RAM wird dann von iwelchen Daten Überschrieben die da nich hingehören.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 23. January 2013, 18:38 »
OK aber wieso? Alles was ich mache ist asm volatile("int $0x0");...

Und warum passiert das NICHT, wenn die GDT nicht geladen ist?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 23. January 2013, 18:43 »
Das Problem ist einfach ein Fehler in deinem Code.

Vermutlich ist die GDT oder die IDT oder beides nicht korrekt eingerichtet.
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 23. January 2013, 19:15 »
Na toll und wie find ich raus, wo der Fehler ist? :(

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 23. January 2013, 19:28 »
Das ist eine hervoragende Frage.

Füg deinem Aufruf von qemu die Parameter -d int hinzu. Dann sollte qemu eine Datei namens qemu.log erstellen. Lad die mal irgendwo hoch oder poste sie hier (die ersten 200 Zeilen sollten genügen).

Wenn du willst, kannst du das natürlich auch selbst austüfteln: In der Log-Datei werden dank des Parameters alle Interrupts inklusive Exceptions aufgezeichnet. Für uns ist der Zustand der CPU zum Zeitpunkt der Exception interessant, insbesondere welche Exception (v=..) auftritt und was der Fehlercode ist (e=....). Wenn es einen Fehlercode ("Error Code") gibt, kannst du ihn mittels der Intel Manuals dekodieren.
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 23. January 2013, 19:36 »
Okay... interessanter Nebeneffekt: mit "-d int" tritt der Fehler nicht mehr auf, aber es passiert auch nichts, eigentlich sollte es ja "-> Interrupt" ausgeben, so steht es zumindest in meiner handle_interrupt()...

Hier sind die ersten 200 Zeilen:SMM: enter
EAX=00000001 EBX=07fe0200 ECX=00000000 EDX=00000cfc
ESI=000f102d EDI=0003802d EBP=07fe0110 ESP=00006ebc
EIP=000f2346 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     000fcd30 00000037
IDT=     000fdb30 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=000f1000 CCD=00000001 CCO=LOGICB 
EFER=0000000000000000
SMM: after RSM
EAX=00000001 EBX=07fe0200 ECX=00000000 EDX=00000cfc
ESI=000f102d EDI=0003802d EBP=07fe0110 ESP=00006ebc
EIP=000f2346 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     000fcd30 00000037
IDT=     000fdb30 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=00000000 CCD=00000000 CCO=EFLAGS 
EFER=0000000000000000
     0: v=00 e=0000 i=1 cpl=0 IP=0008:00000000001007d2 pc=00000000001007d2 SP=0010:0000000000103db0 EAX=000000000000000a
EAX=0000000a EBX=00009500 ECX=000b8000 EDX=000003d5
ESI=00000000 EDI=00106000 EBP=00103db8 ESP=00103db0
EIP=001007d2 EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00103f00 00000027
IDT=     00103f40 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=00000010 CCD=00103db0 CCO=ADDL   
EFER=0000000000000000
check_exception old: 0xffffffff new 0x6
     1: v=06 e=0000 i=0 cpl=0 IP=0008:0000000000103f08 pc=0000000000103f08 SP=0010:0000000000103da4 EAX=00000000000000aa
EAX=000000aa EBX=00009500 ECX=000b8000 EDX=000003d5
ESI=00000000 EDI=00106000 EBP=00103db8 ESP=00103da4
EIP=00103f08 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00103f00 00000027
IDT=     00103f40 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=000000aa CCD=0000019e CCO=ADDB   
EFER=0000000000000000
check_exception old: 0xffffffff new 0x6
     2: v=06 e=0000 i=0 cpl=0 IP=0008:0000000000103f08 pc=0000000000103f08 SP=0010:0000000000103d98 EAX=00000000000000fa
EAX=000000fa EBX=00009500 ECX=000b8000 EDX=000003d5
ESI=00000000 EDI=00106000 EBP=00103db8 ESP=00103d98
EIP=00103f08 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00103f00 00000027
IDT=     00103f40 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=000000fa CCD=0000018e CCO=ADDB   
EFER=0000000000000000
check_exception old: 0xffffffff new 0x6
     3: v=06 e=0000 i=0 cpl=0 IP=0008:0000000000103f08 pc=0000000000103f08 SP=0010:0000000000103d8c EAX=00000000000000fa
EAX=000000fa EBX=00009500 ECX=000b8000 EDX=000003d5
ESI=00000000 EDI=00106000 EBP=00103db8 ESP=00103d8c
EIP=00103f08 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00103f00 00000027
IDT=     00103f40 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=000000fa CCD=0000015e CCO=ADDB   
EFER=0000000000000000
check_exception old: 0xffffffff new 0x6
     4: v=06 e=0000 i=0 cpl=0 IP=0008:0000000000103f08 pc=0000000000103f08 SP=0010:0000000000103d80 EAX=00000000000000fa
EAX=000000fa EBX=00009500 ECX=000b8000 EDX=000003d5
ESI=00000000 EDI=00106000 EBP=00103db8 ESP=00103d80
EIP=00103f08 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00103f00 00000027
IDT=     00103f40 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=000000fa CCD=0000012e CCO=ADDB   
EFER=0000000000000000
check_exception old: 0xffffffff new 0x6
     5: v=06 e=0000 i=0 cpl=0 IP=0008:0000000000103f08 pc=0000000000103f08 SP=0010:0000000000103d74 EAX=00000000000000fa
EAX=000000fa EBX=00009500 ECX=000b8000 EDX=000003d5
ESI=00000000 EDI=00106000 EBP=00103db8 ESP=00103d74
EIP=00103f08 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00103f00 00000027
IDT=     00103f40 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=000000fa CCD=000000fe CCO=ADDB   
EFER=0000000000000000
check_exception old: 0xffffffff new 0x6
     6: v=06 e=0000 i=0 cpl=0 IP=0008:0000000000103f08 pc=0000000000103f08 SP=0010:0000000000103d68 EAX=00000000000000fa
EAX=000000fa EBX=00009500 ECX=000b8000 EDX=000003d5
ESI=00000000 EDI=00106000 EBP=00103db8 ESP=00103d68
EIP=00103f08 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00103f00 00000027
IDT=     00103f40 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=000000fa CCD=000001ce CCO=ADDB   
EFER=0000000000000000
check_exception old: 0xffffffff new 0x6
     7: v=06 e=0000 i=0 cpl=0 IP=0008:0000000000103f08 pc=0000000000103f08 SP=0010:0000000000103d5c EAX=00000000000000fa
EAX=000000fa EBX=00009500 ECX=000b8000 EDX=000003d5
ESI=00000000 EDI=00106000 EBP=00103db8 ESP=00103d5c
EIP=00103f08 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00103f00 00000027
IDT=     00103f40 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=000000fa CCD=0000019e CCO=ADDB   
EFER=0000000000000000
check_exception old: 0xffffffff new 0x6
     8: v=06 e=0000 i=0 cpl=0 IP=0008:0000000000103f08 pc=0000000000103f08 SP=0010:0000000000103d50 EAX=00000000000000fa
EAX=000000fa EBX=00009500 ECX=000b8000 EDX=000003d5
Keine Ahnung, was das alles bedeuten soll :D

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 23. January 2013, 19:49 »
Beim Überfliegen der Datei ist dir hoffentlich aufgefallen, dass sich da immer wieder ähnliche Abschnitte wiederholen. Das ist jeweils der Zustand der CPU bei einem Ereignis. Es steht immer dabei was für ein Ereignis das war. Als erstes kommt SMM: enter und der dazugehörige Registerzustand, dann SMM: after RSM und der Registerzustand. Beide kann man ignorieren, weil die zum Bootvorgang gehören. Danach kommt der erste Interessante Dump:

     0: v=00 e=0000 i=1 cpl=0 IP=0008:00000000001007d2 pc=00000000001007d2 SP=0010:0000000000103db0 EAX=000000000000000av=00 heißt, dass Interrupt 0 aufgerufen wurde (das i=1 bestätigt, dass du das selbst warst). Weil das hier steht, bedeutet das zumindest ein paar Sachen beim Einrichten der GDT/IDT richtig gelaufen sind.

Schauen wir uns also den nächsten Interrupt an.
     1: v=06 e=0000 i=0 cpl=0 IP=0008:0000000000103f08 pc=0000000000103f08 SP=0010:0000000000103da4 EAX=00000000000000aav=06 heißt Exception 6 Invalid Opcode. (Interruptnummern kann man in Kapitel 6 im Volume 3: System Programming Guide der Intel Manuals nachschlagen.) Das heißt die CPU hat versucht etwas auszuführen, das kein Code ist. Mehrere Fehlerquellen sind möglich. Drei fallen mir spontan ein:
- Du hast die falsche Adresse in die IDT eingetragen
- Der Interrupthandler macht den Stack kaputt (überschreibt etwas, fehlerhafte Verwendung von push/pop, ...)
- Der Interrupthandler hat kein iret
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 23. January 2013, 19:59 »
Aha, OK, also ich achte auf Zeilen dieser Art.

Dann mal überlegen: Der Interrupthandler ist:.extern handle_interrupt
intr_common_handler:
    // CPU-Zustand sichern
    push %ebp
    push %edi
    push %esi
    push %edx
    push %ecx
    push %ebx
    push %eax

    // Handler aufrufen
    push %esp
    call handle_interrupt
    add $4, %esp

    // CPU-Zustand wiederherstellen
    pop %eax
    pop %ebx
    pop %ecx
    pop %edx
    pop %esi
    pop %edi
    pop %ebp

    // Fehlercode und Interruptnummer vom Stack nehmen
    add $8, %esp

    iret
Also - iret ist schonmal da.
push und pop gefällt mir auch, auch wenn %esp nur push hat und nicht pop, aber das war ja im tutorial auch so...
bleibt also falsche Adresse in der IDT... damit meinst du doch die hier, oder?idt_set_entry(47, intr_stub_47, 0x8, IDT_FLAG_INTERRUPT_GATE | IDT_FLAG_RING0 | IDT_FLAG_PRESENT);

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 23. January 2013, 20:04 »
push und pop gefällt mir auch, auch wenn %esp nur push hat und nicht pop, aber das war ja im tutorial auch so...
Das push %esp braucht kein pop, weil da dann add $4, %esp kommt. Das ändert genauso wie pop den Stackpointer (und darauf kommt es an), aber liest halt nichts vom Stack. Der Code scheint in Ordnung zu sein, wenn du die Makros intr_stub und intr_stub_error_code auch aus dem Tutorial übernommen hast.

bleibt also falsche Adresse in der IDT... damit meinst du doch die hier, oder?idt_set_entry(47, intr_stub_47, 0x8, IDT_FLAG_INTERRUPT_GATE | IDT_FLAG_RING0 | IDT_FLAG_PRESENT);
Ja. Wie ist intr_stub_47 deklariert?
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 23. January 2013, 20:05 »
extern void intr_stub_47(void);

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 23. January 2013, 20:08 »
Hab ich auch nichts dran auszusetzen. Dann kann ich da auch nicht mehr diagnostizieren. Wenn du den kompletten Code (gezippt oder als git-Repository) irgendwo höchlädst, kann ich anbieten mir den mal anzuschauen.
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 23. January 2013, 20:11 »
Das wäre echt super nett :)

Kommt sofort!

Hier: http://www.file-upload.net/download-7100422/zip.zip.html
« Letzte Änderung: 23. January 2013, 20:14 von KtmnjjpfjsFvzG »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 23. January 2013, 20:26 »
Das #include "interrupt.S" in start.S ist das Problem. Es steht unter .section .bss und dadurch landet der Code für die Interrupt-Stubs in der .bss-Sektion, die nicht in den Speicher geladen wird.

Ich hab das behoben, indem ich interrupt.S in int_stubs.S umbenannt habe (damit es keinen Konflikt mit interrupt.c gibt), die #include-Zeile entfernt habe und in der Makefile int_stubs.S bei SRCS hinzugefügt habe.
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 23. January 2013, 20:28 »
Jaaaaaaaaaaaaaaaaaa es geeeeeeeeeeeht :D :D :D

DANKE!!!!!!!!!!!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 23. January 2013, 20:29 »
Gerne. Du solltest übrigens alle Quelltext-Dateien in SRCS aufführen und nicht über #include einbinden. Außerdem solltest du dir ein Linkerskript zulegen. Eines der ersten Tutorials gibt dafür ein Beispiel.
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen