Autor Thema: IRQs  (Gelesen 6380 mal)

O_mega

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« am: 10. April 2010, 14:24 »
Hallo,

ich habe im Tutorial die GDT und IDT und den PIC initialisiert.
Da steht das der Kernel eigendlich ab schmieren sollte weil ich dem Timerinterrupt keinen Handler zugewiesen habe,das passiert aber nicht.
Ich habe um zu testen einen Handler geschrieben, der aber nicht aufgerufen wird.Ich benutze Bochs als Emulator, villeicht hat es damit ja etwas zu tun.

Viele Grüße

O_mega
« Letzte Änderung: 19. April 2010, 01:45 von PorkChicken »

O_mega

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 10. April 2010, 18:59 »
Hallo,

das mit dem Timer hat sich komischer weise gelegt,
aber nun ist mein Problem das der Timer sich nicht nochmal meldet.
Das EOI habe ich gesendet.
Es funktionirt nur wenn ich das Interruptflag mit sti; neu setze.

Viele Grüße

O_mega

O_mega

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 14. April 2010, 17:39 »
Bitte helft

Das ist der Interrupt Eintrag.
void interrupt_32()
{
//register_save();
printf("Time");
//zuruek();
        pic_send_eoi(1);
}

Das hier beim Setzen.
idt_set_entry(32,interrupt_32,0x8,IDT_FLAG_INTERRUPT_GATE | IDT_FLAG_RING0 | IDT_FLAG_PRESENT);(Gleiche Setzungsfunktion wie im Tut.)

Das die für den PIC.
void init_pic()
{

outb(0x20, 0x11);
outb(0x21, 0x20);
outb(0x21, 0x04);
outb(0x21, 0x01);


outb(0xa0, 0x11);
outb(0xa1, 0x28);
outb(0xa1, 0x02);
outb(0xa1, 0x01);


outb(0x20, 0x0);
outb(0xa0, 0x0);

asm volatile ("sti;");

printf_m("PIC geladen!\n",0x0A,0x0);
Das Eoi senden ist wie PIC - Tut.
Es wird nur einmal der Interrupt aufgerufen. :?

Viele Grüße

O_mega

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 14. April 2010, 19:01 »
Du solltest Assemblerstubs, die iret aufrufen, verwenden und nicht direkt eine C-Funktion als Interrupthandler angeben, die man bekanntlich nur ein normales ret, welches eher nicht die Interrupts aktiviert (abgesehen davon, dass es wild irgendwo rumspringen wird). Konkret musst du einen Zeiger auf intr_stub_32 übergeben und halt in die Assemblerdatei ein
intr_stub 32
und anschließend handle_interrupt so erweitern, dass es bei Interrupt 32 eben deine Funktion aufruft.
« Letzte Änderung: 14. April 2010, 19:03 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

O_mega

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 18. April 2010, 18:11 »
Danke, :lol:
hat mich schon ein ganzes Stück weiter gebracht.
NUR: der Linker spuckt eine Fehlermeldung.
interrupt.o: In function `init_idt':
interrupt.c:123: undefined reference to `ICQ_1'
Soweit klar aber wieso Assembliert der Compiler nicht die Funktion ICQ_1?
Die Datei heißt interrupt.S.

Viele Grüße

O_mega
« Letzte Änderung: 18. April 2010, 18:36 von O_mega »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 18. April 2010, 18:39 »
Vielleicht weil es IRQ und nicht ICQ heißt?
Dieser Text wird unter jedem Beitrag angezeigt.

O_mega

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 18. April 2010, 18:50 »
Nein, :-D ich hab die Funktion selbst definirt.
Das Problem ist das er die Datei nicht Assembliert,evt.
nicht findet.(Sonst findet er auch alle Dateien)

Viele Grüße

O_mega

O_mega

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 18. April 2010, 19:12 »
Danke,  :-o :-D
hab gar nicht gemerkt was fürn unsinn ich rede.
Aber das hat ja nichts mit der Funktionalität der Funktion zu tun,oder?!

Viele Grüße

O_mega

PS. Wie bennent man ein Thema um?
« Letzte Änderung: 18. April 2010, 19:22 von O_mega »

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #8 am: 18. April 2010, 19:28 »
Nein, :-D ich hab die Funktion selbst definirt.
In welcher Datei hast du denn die Funktion definiert? Wird diese Datei compiliert? Wird die darauf resultierende Objektdatei mitgelinkt?
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

O_mega

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 18. April 2010, 19:33 »
IRQ
Die Funktion ist in interrupt.S definiert.
.global ICQ_1ICQ_1:Sie wird (das ist das Problem) nicht kompiliert.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #10 am: 18. April 2010, 20:20 »
hm,

interrupt.S wird zu interrupt.o
interrupt.c wird zu interrupt.o

klingt nach nem Konflikt. Ich würde die interrupt.S mal umbenennen :wink:
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

O_mega

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 21. April 2010, 18:16 »
Super Klappt :-D

 

Einloggen