Hallo,
ich bin beim nachdenken über meinen IRQ-Controller auf ein interessantes Problem gestoßen: benötigt man eigentlich unbedingt einen EOI-Mechanismus?
Beim klassischen PIC (für x86) ist es ja so das wenn der einen Interrupt an eine CPU ausgeliefert hat das er dann erst mal keine weiteren IRQs meldet, auch nicht von anderen Geräten aber gerade letzteres ist ja bei SMP eher doof. Das heißt das mein IRQ-Controller eigentlich nur den gerade ausgelieferten IRQ sperren darf und dieser dann mit seinem individuellen EOI am Ende seines IRQ-Handlers wieder frei gegeben werden müsste. Aber gerade individuelle EOIs kosten wieder zusätzliche Logik im IRQ-Controller und auch ein paar zusätzliche Befehle im Kernel da der ja wissen muss welchen IRQ er da gerade als beendet melden möchte.
Da stellt sich dann aber die Frage: kommen eigentlich vom selben Gerät weitere IRQs während der IRQ-Handler bereits aktiv ist?
Ganz ausschließen kann man das sicher nicht also muss man das per SW abfangen (wenn man das nicht per HW macht). Da ich die IRQs bei meinem Micro-Kernel-OS eh per asynchronem IPC an die Treiber-Prozesse liefern möchte ist es eigentlich zuverlässig ausgeschlossen das ein und der selbe IRQ-Handler (als PopUp-Thread) mehrfach aufgerufen wird, es wird dann im Kernel gequeued (da eine IRQ-Message ja nur konstant ein paar Bytes benötigt ist das auch kein Speicherproblem). Dafür kann ich mir das EOI-Zeugs komplett sparen und das spart dann bei jedem IRQ etliche Takte ein.
Seht Ihr in meinen Gedanken da irgendwo einen Fehler oder würdet Ihr aus anderen Gründen vom Verzicht auf EOI eher abraten?
Sonstige Anregungen oder Vorschläge dazu?
Grüße
Erik
ich bin beim nachdenken über meinen IRQ-Controller auf ein interessantes Problem gestoßen: benötigt man eigentlich unbedingt einen EOI-Mechanismus?
Beim klassischen PIC (für x86) ist es ja so das wenn der einen Interrupt an eine CPU ausgeliefert hat das er dann erst mal keine weiteren IRQs meldet, auch nicht von anderen Geräten aber gerade letzteres ist ja bei SMP eher doof. Das heißt das mein IRQ-Controller eigentlich nur den gerade ausgelieferten IRQ sperren darf und dieser dann mit seinem individuellen EOI am Ende seines IRQ-Handlers wieder frei gegeben werden müsste. Aber gerade individuelle EOIs kosten wieder zusätzliche Logik im IRQ-Controller und auch ein paar zusätzliche Befehle im Kernel da der ja wissen muss welchen IRQ er da gerade als beendet melden möchte.
Da stellt sich dann aber die Frage: kommen eigentlich vom selben Gerät weitere IRQs während der IRQ-Handler bereits aktiv ist?
Ganz ausschließen kann man das sicher nicht also muss man das per SW abfangen (wenn man das nicht per HW macht). Da ich die IRQs bei meinem Micro-Kernel-OS eh per asynchronem IPC an die Treiber-Prozesse liefern möchte ist es eigentlich zuverlässig ausgeschlossen das ein und der selbe IRQ-Handler (als PopUp-Thread) mehrfach aufgerufen wird, es wird dann im Kernel gequeued (da eine IRQ-Message ja nur konstant ein paar Bytes benötigt ist das auch kein Speicherproblem). Dafür kann ich mir das EOI-Zeugs komplett sparen und das spart dann bei jedem IRQ etliche Takte ein.
Seht Ihr in meinen Gedanken da irgendwo einen Fehler oder würdet Ihr aus anderen Gründen vom Verzicht auf EOI eher abraten?
Sonstige Anregungen oder Vorschläge dazu?
Grüße
Erik

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert
).
