Interrupts

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Interrupts

Beitrag von cloidnerux » Mi Okt 15, 2008 12:17 pm

Habe jezt ne IDT und ahb diese auch geladen.
Ich hab aus nem tut eine Interruptliste, welcher Interrupt für welche Aktion ausgeführt wird.
Da steht für Tatsatur: 0x24-0x27. NA gut, hab ich in meiner IDT die elemnte 0x24-0x27 den keyboardhandler zugewisen.
HAb in diesem handler auch eine printk("text"); drinn um zu sehen, wann er ausgeköst wurde.
Starte jezt das OS und drücke eine taste, aber es wird kein Inerrupt ausgelöst.
Warum?

edit by Xin: Titel korrigiert
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Inerrupts

Beitrag von Dirty Oerti » Mi Okt 15, 2008 4:10 pm

Erstens:

Wie wäre es damit, die Interrupts erstmal anzumachen?
Das geht in ASM mit
Zweitens: Ich glaube nicht, dass deine IDT funktionstüchtig ist.
Das hört sich fast so an, als hättest du dir eine BIOS/DOS (!!) Interruptliste besorgt.
Die BIOS Interrrupts funktionieren im Protected Mode nicht und DOS hast du ja nicht installiert...

Deswegen: Wenn alles fehlschlägt, lies die Anleitung.
Oder in dem konkreten Fall die Linkliste im Wiki:
http://tutorial.proggen.org/doku.php?id ... rammierung
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Inerrupts

Beitrag von cloidnerux » Mi Okt 15, 2008 4:17 pm

Gut interrupts waren ausgeschaltet.
So hab sie eingeschaltet. Bekomme das auch ausgegeben. Aber nur ein mal
zweiter bug: ich muss nach jedem Interrupt Master und/oder Slave PIC wieder anweisen Interupts aufzunehmen.
Hab das jezt gemacht. Starte das Image: VirtualPC sagt: Nichtbehebarer prozessorfehler
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Inerrupts

Beitrag von Xin » Mi Okt 15, 2008 4:22 pm

cloidnerux hat geschrieben:Gut interrupts waren ausgeschaltet.
So hab sie eingeschaltet. Bekomme das auch ausgegeben. Aber nur ein mal
zweiter bug: ich muss nach jedem Interrupt Master und/oder Slave PIC wieder anweisen Interupts aufzunehmen.
Hab das jezt gemacht. Starte das Image: VirtualPC sagt: Nichtbehebarer prozessorfehler
Es tut's nich'!
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Inerrupts

Beitrag von cloidnerux » Mi Okt 15, 2008 4:31 pm

Jezt nicht mehr, aber wieder das selbe problem.
Er zeigt mir an: Interrupt ausgelöst, und macht dann nichts mehr.
Und ich reagire auf jeden Interrupt gleich.
welcher fehler ist das??

Code: Alles auswählen

struct idt_entry                         //das kommt alles ausm tutorial, weil das einfach scheiße erklärt wurde
{
    unsigned short base_lo;  //keine ahnung was hier rein soll, weil ich das tut net verstnaden habe
    unsigned short sel;        //        ' '
    unsigned char always0;    
    unsigned char flags;      //        ' ' 
    unsigned short base_hi;//         ' '
} __attribute__((packed));

struct idt_ptr
{
    unsigned short limit;
    unsigned int base;
} __attribute__((packed));

struct idt_entry idt[256];
struct idt_ptr idtp;

void idt_load()
{
   asm("lidt %0": : "m" (idtp));
}

void idt_set_gate(unsigned char num, unsigned long base, unsigned short sel, unsigned char flags)
{
   idt[num].base_hi=FP_SEG(base);
   idt[num].base_lo=FP_OFF(base);
   idt[num].sel=sel;
   idt[num].always0=0;
   idt[num].flags=flags;
}
void set_slave_EOI()   //Teilt MAster UND Slave Pic mit das der Interrupt verarbeitet wurde
   {
      outb(0x20,0x20);
      outb(0xA0,0x20);
   }

void test()
{
	printk("Es wurde ein iinterrupt ausgelöst");
        set_slave_EOI();
}

void set_idt()
{
	int i=0;
	char a=0;
	for(i=0;i<256;i++)
	{
		++a;
		idt_set_gate(a,(unsigned long int)test, 0x08, 0x8E);//weißt jedem interrupt die funktion test() zu
	}
}

void idt_install()
{
    idtp.limit = (sizeof (struct idt_entry) * 256) - 1;
    idtp.base = (int)&idt[0];
    memset(&idt, 0, sizeof(struct idt_entry) * 256);
    //idt_set_gate(9, (unsigned long int)keyboard_handler, 0x08, 0x8E);
    set_idt();
	idt_load();
}
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Inerrupts

Beitrag von Dirty Oerti » Mi Okt 15, 2008 4:43 pm

Es kann hilfreich sein, dass zu lesen, was evtl außenherum steht.
Nur die Funktion aufrufen ist nicht.
Du musst die Register sichern, den Stack sicher, dann die Interruptfunktion aufrufen und nach deren Beendigung alle Register wieder herstellen, den Stack wieder herstellen und ein iret durchführen.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Inerrupts

Beitrag von cloidnerux » Mi Okt 15, 2008 5:03 pm

hä?
in welchen zusammenhang?
bei jedem Interruptcall oder beim initialisren der IDT oder was?
Und was bringt iret??
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Inerrupts

Beitrag von Dirty Oerti » Mi Okt 15, 2008 5:10 pm

cloidnerux hat geschrieben:hä?
in welchen zusammenhang?
bei jedem Interruptcall oder beim initialisren der IDT oder was?
Und was bringt iret??
Bei jedem Interrupt, immerhin möchte dein Code nach Bearbeitung des Interrupts ja auch weiterlaufen.
Und eben auch nach Bearbeitung jedes Interrupts.

Um den Zusammenhang zu verstehen, rate ich dir, dir mehrere Tutorials (bzw Brans Kernel Development Tutorial) durchzulesen.
Nach einigem Nachdenken wirst du sicher verstehen, wozu eine IDT gebraucht wird und warum bestimmte Schritte notwendig sind.

Was iret bringt werde ich dir in diesem Zusammenhang nur "verraten" (Google hat heute zu, denke ich...), weil es in diesem Fall ein wirklich wichtiger Aspekt ist.
iret dient dazu, mehrere Werte auf einmal zu Popen. In diesem Fall sollten das CS, EIP, EFLAGS, SS, ESP sein.
Ansonsten wird dir ein geeignetes Tutorial (wie es hier mit der Zeit auch entstehen wird) bestimmt weiterhelfen.

Ich kann dir nicht deinen Code schreiben (meine Dateien nur zur einfachsten Interruptverwaltung haben ca 800 Zeilen Code, wenige davon sind leer... )

MfG
Daniel
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Inerrupts

Beitrag von nufan » Mi Okt 15, 2008 5:11 pm

Sorry, dass ich mich hier einmische. Ihr sprecht hier von Interrupts? Sollte dann nicht auch das Thema so heißen?

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Inerrupts

Beitrag von Dirty Oerti » Mi Okt 15, 2008 5:22 pm

dani93 hat geschrieben:Sorry, dass ich mich hier einmische. Ihr sprecht hier von Interrupts? Sollte dann nicht auch das Thema so heißen?
Dazu muss glaub ich erstmal ein Ausschuß gebildet werden, der die Titelschreibweise überprüft

Scherz beseite: Recht hast du.

Hat Xin ja schon geändert.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten