Autor Thema: Verwirrt durch Interrupts  (Gelesen 16162 mal)

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« am: 31. May 2007, 15:39 »
Hallo,
ich versuche gerade mal die ganzen Interrupts zu programmieren, aber ich schaffs einfach nicht, habe sehr viele Fragen, aber die kommen spaeter, erstmal nur eine:
Undzwar: welches sind im Pmode die Hardware Interrupts, welches Exceptions, welches Software Interrupts und welches eigene Interrupts (sind Software und die eigenen die gleichen?) ?

So eine Liste waer mal ganz schoen.

Wenn ich das weiss, dann frag ich weiter :)

Edit: Und vielleicht nochmal die gleiche Liste fuer den Rmode, damit ich sehen kann, wo die Unterschiede sind.
« Letzte Änderung: 31. May 2007, 15:41 von kotzkroete »

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 31. May 2007, 17:20 »
Such mal nach der "Ralph Brwon's Interrupt List".
Umfangreicher gehts nicht. :)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #2 am: 31. May 2007, 17:47 »
Im ProtectedMode kannst du mittels PIC (im RM geht das auch, aber nicht empfohlen) die IRQs die InterruptNummern zuweisen. Also in meinem OS sind z.B. die IRQ0-IRQ7 den int20h bis int27h und die IRQ8-IRQ15 den  int28h bis int2Fh zugewisen. Also soweit ich weiß liegen die Exceptions bei int00h bis int1Fh, weswegen du dort die IRQs nicht platzieren solltest. Mit dem int30h bis intFFh kannst du dann machen was du willst.

bitmaster
In the Future everyone will need OS-64!!!

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 31. May 2007, 17:55 »
Achso....
Also IRQs kommen nur von der Hardware?
Und die Sachen, die ich mit int aufrufe sind die ISRs?
Und ich kann jetzt einem IRQ sozusagen ein int zuweisen?

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 31. May 2007, 18:04 »
ja also du weist ihm im pm eher ein int gate zu welches auf ein codestück zeigt, welches den int behandlet.

ja irqs sind von der hardware...du kannst mit int theoretisch auch einen interrupt aufrufen, welcher eine exeption behandelt macht aber wenig sinn


gruss

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 31. May 2007, 18:10 »
Achso....Aber eine Exception ist doch auch ein interrupt, oder nicht?
Dann muesste ich also erstmal alle ISRs schreiben und dann die IRQs zuweisen...hm ...da ob ich das verstehe.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 31. May 2007, 18:13 »
nene isrs musst du nicht unbedingt schreiben...ich habe seit 2 jahren leere isrs und ab und zu fülle ich einen auf...

natürlich wäre eine kleine funktion gut, welche eine meldung ausgibt wenn eine exeption oder ein sonstiger int aufgerufen wird...das wäre aber nicht so aufwändig...

jaja eine exeption ist ein interrupt...


gruss

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 31. May 2007, 18:29 »
Aber man braucht doch einige ISRs, um ueberhaupt irgendwas machen zu koennen. Zumindest fuer die IRQs sollte man doch welche schreiben und evtl. fuer die Exceptions, oder nicht?

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 31. May 2007, 18:47 »
Jaja klar aber es macht nix wenn du zuerst noch z.B. Paging, Speicherverwaltung usw. machst...weil sonst musst du eventuell wieder Sachen an den ISRs ändern...Danach ist das programmieren von gescheiten ISRs und/oder Treibern neben dem machen einer (G)UI das wesentliche am OS-Dev

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 31. May 2007, 18:52 »
Hm....da ob ich das jetzt alles verstehe.... :/
Woher kenn ich denn die Adresse der ISR? Denn die brauch ich ja fuer die IDT.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 31. May 2007, 19:19 »
dort wo dein code beginnen soll machst du ein label...in asm so:

label:

dann kannst du im code stellvertretend für die adresse das label angeben(ohne doppelpunkt)...Hier einmal ein Muster Gate:

   dw label
   dw 8
   db 0
   db 11101110b
   dw 0


Somit hast du die Adresse direkt eingetragen...


gruss

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 31. May 2007, 19:22 »
Nur das Problem ist ja, dass in der IDT die Adresse in 2 words oder so eingeteilt ist. 

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 31. May 2007, 19:28 »
hmm ja das ist allerdings nur ein problem wenn dein Kernel (oder besser isr) überhalb von 64 KB ist...in diesem falle machst du das irgendwie so:
adresse_isr:
dd label


und dann verwendest du im Gate einmal:
dw [adresse_isr]

und einmal:
dw [adresse_isr+2]


Gruss

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #13 am: 31. May 2007, 21:05 »
Wenn es dein Binärformat zulässt, dann (sollte mit nasm/yasm gehen):
dw label ; und
dw (label >> 16)
oder das label durch ein Codestück an den richtigen platz schreiben:
mov eax, label
mov [blabla], ax
shr eax, 16
mov [blabla2], ax

Nos Code funktioniert afaik nicht.
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

Korona

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 01. June 2007, 10:27 »
Afaik wird
dw label ; und
dw (label >> 16)
zumindest in NASM nicht funktionieren. (die Addresse von label wird erst durch den Linker bestimmt und kann daher nicht Teil eines Ausdrucks sein. Eventuell funkioniert der Code wenn du zu einer flachen Binary kompilierst, NASM überträgt zwischen seinen Stages aber normalerweise nur wenig Informationen, daher funzt das afaik auch nicht.)

Die beste Lösung ist wie Bluecode gesagt hat:
mov eax, label
mov [blabla], ax
shr eax, 16
mov [blabla2], ax

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #15 am: 01. June 2007, 13:35 »
Eventuell funkioniert der Code wenn du zu einer flachen Binary kompilierst
Wie gesagt, es kommt aus das Format der Binary an. Mit elf geht es mit sicherheit nicht, da elf keine 16bit relocations unterstützt.
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 #16 am: 01. June 2007, 19:38 »
Joa und wenn man noch ein bisschen optimieren wollte...aber für den anfang ist das mit shr sicher am schläusten....

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 02. June 2007, 12:40 »
Ok...mal sehen, ob ich das schaffe....
Aber wie mach ich das denn jetzt genau mit den IRQs, das hab ich noch nicht 100% verstanden...
Also ich sage dem ersten PIC, dass die IRQs 0-7 z.B. ISR32-39 sind und dem zweiten, dass IRQs 8-15 ISR40-47 sind?
« Letzte Änderung: 02. June 2007, 13:13 von kotzkroete »

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 02. June 2007, 14:07 »
ja aber für das gibt es überall fertige codestück...die eigentlich immer funktionieren...

gruss

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 02. June 2007, 14:21 »
Also die PICs hab ich nun remapped, die ISRs krieg ich auch noch selber hin, aber mit der IDT tu ich mich sehr schwer.
Folgendes habe ich mal geschrieben:
idt_start:
dw exception & 0x00ffff
dw 0x10
dw 0x8E00
dw exception >> 16
idt_end:
nasm:
idt.s:7: error: `&' operator may only be applied to scalar values
idt.s:10: error: shift operator may only be applied to scalar values

Ok, gegooglet:
You're trying to load a 16-bits field (a part of the IDT descriptor) with a reference to a 32-bit label that is subject to relocation. Try to replace

isr_label:
   iret
bad_stuff dw isr_label & 0xFFFF
          dw 0xdead
          dw 0xbeef
          dw isr_label >> 16

by something that extracts a 'pure value' from the address (e.g. the difference of two addresses are a pure value and $$ means to NASM the start of the section)

%define BASE_OF_SECTION SOME_CONSTANT_YOU_SHOULD_KNOW
isr_label:
   iret
good_stuff dw (BASE_OF_SECTION isr_label - $$) & 0xFFFF
           dw 0xcafe
           dw 0xbabe
           dw (BASE_OF_SECTION isr_label - $$) >> 16

The role of BASE_OF_SECTION is to adjust the pure offset to the real situation (usually as defined in your linker script), e.g. if your kernel get loaded at 1MB, you'll set it to 0x100000 to keep the CPU happy.

Aber das versteh ich nicht. Leider konnte ich mit den posts auch nicht so viel anfangen...

 

Einloggen