Hallo,
In meinem Konzept soll eine Ethernet-Karte 3 unabhängige IRQs haben: einmal fürs Empfangen, einmal fürs Senden und einmal fürs Management (Kabel dran/ab u.ä.). Auf diese Art können Empfangen und Senden komplett unabhängig von einander auf unterschiedlichen CPUs laufen.
Solange sich die Hardware nicht dran hält, nutzt dir das wenig.
Also moderne Ethernet-Karten können das, vielleicht ließt Du Dir doch mal das e1000-Driver-Developer-Manual durch. Ganz im Ernst, aktuelle Hardware ist durchaus dafür ausgelegt ihre IRQ-Last auf mehrere IRQs und damit potentiell auf mehrere CPUs zu verteilen.
.....
Wie gesagt, nach ein paar Minuten wird der Interrupt abgeschaltet.
Naja, als so toll empfinde ich diese Idee trotzdem nicht. Wenn die IRQs zum Problem werden dann werden sie einfach abgeschalten, klingt für mich eher nach ner Verzweiflungstat als nach nem klugen Konzept.
Das eigentliche EOI ist das Zurücksetzen des Zählers in deinem Fall.
Genau. Ein IRQ hat nur 2 Zustände im IRQ-Controller: inaktiv (Zähler == 0) und pending (Zähler != 0). Den dritten Zustand "wird gerade von der SW bearbeitet" möchte ich mir gerne sparen weil da das Weiterschalten immer von der SW händisch gemacht werden muss.
Also doch ein EOI.
Das Ausliefern eines IRQ an eine CPU quittiert ihn auch gleich automatisch in meinem Ohne-EOI-Konzept. Auf das Ausliefern kann man nicht verzichten, irgendwie muss die CPU ja schließlich die IRQ-Nummer erfahren, aber diesen Vorgang möchte ich komplett in Hardware realisieren (so wie es bei x86 u.v.a.m. auch ist).
Der Zustand "wird gerade von der Software verarbeitet" existiert bei pegelgesteuerten Interrupts (PIC -> CPU, nicht Hardware -> PIC) nicht
Ist für PIC -> x86 und meine Plattform (und wohl die meisten anderen auch) zutreffend.
da der Interrupt solange aktiv ist, wie der Zähler >0 ist
Oder die pegelbasierte IRQ-Leitung von der Hardware zum PIC noch aktiv ist.
und zurücksetzen musst du ihn eh.
Klar. Die hier gestellte Frage ist: "Wann?". Also mit welchen Vorgang wird der IRQ im IRQ-Controller quittiert?
Um die CPU von doppelter Kommunikation mit dem IRQ-Controller zu entlasten möchte ich das Quittieren gleich mit ins Ausliefern (also das Abholen durch die CPU) mit einbauen.
Das der IRQ auch bei der Hardware quittiert werden muss ist klar und absolut unumgänglich (und HW-spezifisch).
Das heißt, jeder Interrupthandler muss zwei ACKs rausschicken, einmal an die Hardware und einmal an den PIC.
Und gerade den zweiten ACK möchte ich mir sparen, um genau diesen Punkt dreht sich diese Diskussion.
Um das zu vermeiden, muss die Hardware direkt mit pegelgesteuerten Interrupts arbeiten, aber das hast du ja schon ausgeschlossen.
Gerade weil man bei pegel-triggered Interrupts auch zwingend diesen dritten Zustand benötigt (weil ja die HW die IRQ-Leitung nicht sofort mit dem Ausliefern des IRQs an eine CPU deaktiviert, das bekommt die ja auch gar nicht mit) möchte ich MSI einsetzen.
Das heißt, dass Interrupts bei dir prinzipiell niedriger priorisiert sind (sein können) als die aktuell laufende Software?
Grundsätzlich ja. Schließlich könnten ja bestimmte Aufgaben wichtiger sein als einzelne Hardware-Komponenten. Außerdem ist bei einem Micro-Kernel ja auch ein IRQ-Handler nur ganz normale User-Mode-Software (das heißt damit ein IRQ-Handler von einem wichtigen HW-Gerät nicht vom IRQ eines weniger wichtigen HW-Gerätes unterbrochen wird muss der erste IRQ-Handler eine höhere Priorität haben). Grundsätzlich soll bei mir der IRQ und sein zugehöriger SW-IRQ-Handler die selbe Priorität haben (anders wäre ja auch Quatsch).
Soweit ich das jetzt verstanden habe, möchtest du prinzipiell mehrere IRQ-Handler für verschiedene Hardware parallel ablaufen lassen können, je CPU ein Handler.
Exakt, es spricht doch auch nichts dagegen das möglichst alle IRQs möglichst schnell verarbeitet werden (gemäß ihrer Prioritäten natürlich).
Das heißt, es gibt nicht nur einen pending IRQ, sondern prinzipiell mehrere
Ein IRQ der noch auf pending ist wird noch
nicht verarbeitet, der wartet also noch darauf das sich eine CPU seiner annimmt und den zugehörigen IRQ-Handler ausführt. Es kann in meinem System also mehrere (viele) pending IRQs gleichzeitig geben (z.B. wenn mehrere IRQs (fast) zeitgleich kommen bevor auch nur einer davon an eine CPU ausgeliefert werden kann) und auch mehrere unterschiedliche IRQs können von den CPUs verarbeitet werden (theoretisch sogar mehr als CPUs vorhanden sind da ein IRQ-Handler ja auch mal sleep(x) benutzen kann und damit eine CPU für begrenzte Zeit frei gibt).
das erzwingt direkt einen EOI-Mechanismus für "ich bin fertig".
Warum? Wenn ein IRQ für den IRQ-Controller mit der Auslieferung an eine CPU als Erledigt anzusehen ist dann besteht keine Notwendigkeit für einen EOI zum IRQ-Controller.
Falsche Grundvoraussetzung: "gute Hardware".
Da hast Du mich wohl missverstanden, "gute Hardware" ist keine
Grundvorausetzung! Aber sie sollte mit möglichst wenig CPU-Einsatz unterstützt werden, solange "schlechte Hardware" nicht das System behindert oder gar gefährdet und da sehe ich momentan keine Gefahr. Siehst Du denn eine Gefahr für das System?
Grundsätzlich muss ich an dieser Stelle das Thema eher abschließen.
Error: Not enough Ahnung.
Das ist extrem doof! Wer sonst hat denn hier noch Ahnung (und Lust mit mir zu Diskutieren)?
Grüße
Erik