Forum: PC-Programmierung Wie funktioniert das Interruptsharing beim PC softwareseitig?


von Hans H. (loetkolben)


Lesenswert?

Hallo,
so wie ich es verstehe hängen seit PCI mehrere interuptfähige 
Pheripheriecontroller an einem Interrupteingang der CPU.
D.h. jeder Controller kann den Interrupt (gleichzeitig) auslösen.
Wie erfolgt die Registrierung der Treiber die für diesen Interrupt 
zuständig sind und woran erkennt das Betriebssystem welcher Treiber den 
Interrupt abarbeitet um diesen aufzurufen oder macht das jeder Treiber 
selber und das Betriebssystem ruft die nacheinander auf? Alles auf 
Windows-Systemen.

Bin auch für Links dankbar die das gut erklären.

Und nebenbei, ist irgendwo festgelegt welcher Kern einer Mehrkern-CPU 
die Interrupts abarbeitet oder kommt da jeder mal dran?

: Verschoben durch Moderator
von Εrnst B. (ernst)


Lesenswert?

Hans H. schrieb:
> so wie ich es verstehe hängen seit PCI mehrere interuptfähige
> Pheripheriecontroller an einem Interrupteingang der CPU.

da hängt noch ein APIC dazwischen
https://de.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller

> Und nebenbei, ist irgendwo festgelegt welcher Kern einer Mehrkern-CPU
> die Interrupts abarbeitet oder kommt da jeder mal dran?

Kann der Treiber festlegen, und der Admin ggfs. überschreiben.

https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/interrupt-affinity-and-priority

von Frank K. (fchk)


Lesenswert?

Hans H. schrieb:

> so wie ich es verstehe hängen seit PCI mehrere interuptfähige
> Pheripheriecontroller an einem Interrupteingang der CPU.

Nicht ganz.

Bei ISA gab es hier von den herkömmlichen i8259 Interruptcontrollern 
(PIC) bereitgestelle Interrupt-Leitungen, auf die sich die Peripherie 
draufhängen konnte. Diese waren flankengetriggert, was für das 
Interruptsharing doof war.

Bei PCI hatte jeder Slot bis zu 4 Interrupt-Leitungen, die auf die 
herkömmlichen 8259-Interupteingänge aufgeteilt wurden. Diese konnten 
pegelgetriggert sein, was das Interruptsharing ermöglicht hat. Die 
Interruptroutine musste jeden infrage kommenden Baustein abfragen, ob er 
den Interrrupt ausgelöst hat.

Später kam dann ein sogenannter APIC (Advanced PIC) und sogenannte 
Message Signalled Interrupts (MSI) dazu. MSIs haben keine dedizierten 
Leitungen mehr, sondern sind spezielle Pakete auf dem Bus, Diese lösen 
dann eigene Interruptvektoren aus, die dann gleich die passenden 
Interruptroutinen aufrufen.

Bei PCIe gibt es keine herkömmlichen Interrupts mehr, sondern nur noch 
Message Signalled Interrupts.

> Wie erfolgt die Registrierung der Treiber die für diesen Interrupt
> zuständig sind und woran erkennt das Betriebssystem welcher Treiber den
> Interrupt abarbeitet um diesen aufzurufen oder macht das jeder Treiber
> selber und das Betriebssystem ruft die nacheinander auf? Alles auf
> Windows-Systemen.

Das hängt davon ab, was das für ein Treiber ist - ein herkömmlicher NT 
Kernel Driver, ein WDM Treiber, ein KMDF Treiber oder ein UMDF Treiber. 
Das steht dann alles in den entsprechenden Microsoft Dokumentationen 
drin. Stichwort MSDN, Windows SDK und Windows DDK. Das Thema ist hier 
fürs Forum viel zu komplex.

> Und nebenbei, ist irgendwo festgelegt welcher Kern einer Mehrkern-CPU
> die Interrupts abarbeitet oder kommt da jeder mal dran?

Normalerweise werden die Interrupts auf die Kerne verteilt, aber man 
kann das konfigurieren, welvcher Interrupt auf welchen Kernen landet. 
Genauso kann man Prozesse und Threads an bestimmte Kerne binden. 
"Affinity" ist hier das Stichwort.

Wie gesagt, ohne die Microsoft Dokumentation und Treiberpacks etc kannst 
Du das alles vergessen.

fchk

: Bearbeitet durch User
von Hans H. (loetkolben)


Lesenswert?

Danke für die nützlichen Antworten, da ist doch einiges was ich noch 
nicht kannte. Insbesondere den APIC und message signaled Interrupt.
Bin halt ein Kind der achtziger :)

von MaWin (Gast)


Lesenswert?

Interrupt sharing gibts aber natürlich immer noch.
Dann muss der Treiber in den Registern seines Gerätes nachschauen, ob es 
tatsächlich etwas zu tun gibt. Wenn nicht, muss tut er einfach nicht und 
der Interrupt war für andere Gerät(e)

von rbx (Gast)


Lesenswert?

Der Intel 8259 Programmable Interrupt Controller (PIC) ist nicht für 
multiprozessorfähig.

( 
https://docplayer.org/3323526-Interrupts-seminar-rechnerarchitektur.html 
)

Die weitere Entwicklung betrifft sowohl CPU- wie auch 
Mainboard-Geschichte.

Zusätzliche wichtige Stichworte sind Hyper Transport (HT) (Nicht 
Hyperthreading, das heißt auch HT!) bzw. QuickPath Interconnect 
(QPI,Intel)

Ein weiteres wichtiges Stichwort ist Memory-Mapping.

https://www.diva-portal.org/smash/get/diva2:578377/fulltext01.pdf

https://softwareengineering.stackexchange.com/questions/358483/help-with-memory-mapped-i-o-and-hardware-interrupts-for-virtual-machine

..und dass die Interrupts bei PCI als optional eingestuft werden.

Außerdem hinzu kommt noch BIOS vs UEFI.

von Herbert B. (Gast)


Lesenswert?

Frank K. schrieb:
> Normalerweise werden die Interrupts auf die Kerne verteilt, aber man
> kann das konfigurieren, welvcher Interrupt auf welchen Kernen landet.

Unter Linux kann man das mit irqbalance einstellen.
https://linux.die.net/man/1/irqbalance

von rbx (Gast)


Lesenswert?

Herbert B. schrieb:
> Unter Linux kann man das mit irqbalance einstellen.
> https://linux.die.net/man/1/irqbalance

Hast du zufällig auch einen Tipp, wie man diese Mausprobleme bei 
normaler Baldurs Gate 2 Installation in Linux/Fedora in den Griff 
bekommt?
Die Maus reagiert viel zu langsam auf Spielereignisse, oder die Maus 
wird vielfach angezeigt, oder beides gleichzeitig, blinkende Anzeige, 
und schlechte Ereignisverarbeitung.
Wenn ich in der Baldurs INI "3 D Acceleration" auf 1 setze, und dann das 
Spiel mit "dedizierter Grafikkarte" starte, stürzt das Spiel, bzw. die 
Grafikkarte zusammen mit dem Betriebsystem böse ab.

( ;) )

von ... (Gast)


Lesenswert?

> Mausprobleme

Einfach eine Busmaus nehmen.

von rbx (Gast)


Lesenswert?

... schrieb:
> Einfach eine Busmaus nehmen.

Das Spiel läuft normal auf dem Windows 8 NB, also könnte ich es da drauf 
spielen. Allerdings geht kein Vollbild über die Intel-Cpu-Grafik und der 
Spielbildschirm ist am Ende sehr klein.

von Peter D. (peda)


Lesenswert?

Hans H. schrieb:
> Insbesondere den APIC und message signaled Interrupt.
> Bin halt ein Kind der achtziger :)

Dann stelle Dir vor, Interruptsharing ist wie bei den PIC. Es gibt nur 
einen Vector und die CPU muß erst umständlich alle freigegebenen 
Interruptquellen abfragen.
Das APIC ist dann ähnlich dem Z80, die auslösende Peripherie legt die 
Vectornummer auf den Bus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.