Kann man die APIC so konfigurieren, dass bestimmte IRQs nur an bestimmte CPUs geschickt werden?
Soweit ich mich korrekt erinnere gibt es in den IO-APICs dafür Bitmasken o.ä. an wen ein IRQ zu senden ist. Oder der Local-APIC in der CPU selektiert welche IRQs er annimmt.
Siehe I/O APIC Spezifikation (die auf der
Wikiseite verlinkt ist) in Kapitel 3.2.4 Bits 56-63 sind das Destination Field, da kommt normalerweise die LAPIC ID rein (dort ist auch was mit Logical Mode und Processor Sets beschrieben, aber was genau das ist und wie das geht weiß ich ehrlich gesagt nicht), d.h. man gibt in der I/O APIC an, wer es erhält.
Wenn ich mich ganz recht entsinne, dann braucht man aber um die L zw. I/O APIC zu initialisieren die SMP- oder ACPI-Tabellen, ohne die könnte das schwieriger werden, da (hier bin ich mir nicht sehr sicher) die IRQ-Nummern die die I/O APIC verwenden überhaupt nicht die der normalen PIC sein müssen. Aber auf jeden Fall braucht man die Tabellen um die neuen IRQs auszunutzen, die I/O APIC unterstützt ja normalerweise mehr als 16 IRQs. Und in den Tabellen steht dann zB drin, dass z.B. die PIC-Geräte - ich glaub da steht nur drin, dass PCI-Interrupt-Pin #A (der steht im PCI-Config Space des Geräts) z.B. auf 17 mappt oder sowas - auf IRQs über 16 mappen, das wird man aber dem 'Interrupt Line' Register aus dem Config Space der Geräte nicht entnehmen, denn da steht soweit ich das verstanden habe nur der IRQ unter Verwendung der PIC drin.
Dem IRQ-Sharing kannst Du aus dem Weg gehen in dem Du MSI http://en.wikipedia.org/wiki/Message_Signaled_Interrupts verwendest.
Das ist aber ziemlich neu - sogar für mein Verständnis von neu. Außerdem: ist das überhaupt Pflicht bei PCI-Express und bei PCI-Express Geräten? Wenn ich mich recht entsinne ist das über Capabilities geregelt und die können ja schlicht und ergreifend bei Geräten fehlen, va. wird das sicherlich in keinem Emulator tun. Die andere Sache ist, wie stell ich denn überhaupt fest ob das Mainboard das kann? Über die Bridges?