OOStuBS/MPStuBS
IOREDTBL_L Strukturreferenz

Eintrag in der IO Redirection Table. Mehr ...

#include <ioapic_registers.h>

Öffentliche Attribute

unsigned int vector:8
 Interrupt Vector, R/W.
 
unsigned int delivery_mode:3
 Delivery Mode, R/W.
 
unsigned int destination_mode:1
 Destination Mode, R/W.
 
unsigned int delivery_status:1
 Delivery Status, RO.
 
unsigned int polarity:1
 Interrupt Input Pin Polarity, R/W.
 
unsigned int remote_irr:1
 Remote IRR (for level-triggered interrupts only), RO.
 
unsigned int trigger_mode:1
 Trigger Mode, R/W.
 
unsigned int mask:1
 Interrupt Mask, R/W.
 

Ausführliche Beschreibung

Eintrag in der IO Redirection Table.

Jeder Eintrag in der IO Redirection Table symbolisiert eine externe Interruptquelle. Für jeden externen Interrupt lassen sich hier folgende Einstellungen vornehmen:

  • vector gibt an, welcher Vektor in der Interruptvektortabelle für den entsprechenden Interrupt aktiviert werden soll.
  • delivery_mode gibt an, wie die adressierten CPUs (bzw. ihre local APICs) auf das Interruptsignal reagieren sollen. In OO/MPStubs soll DELIVERY_MODE_LOWESTPRI verwendet werden. Da die einzelnen CPUs alle dieselbe Priorität besitzen, werden so die auftretenden Interrupts gleich über alle CPUs verteilt.
  • destination_mode legt fest, wie logical_destination interpretiert werden soll. In OO/MPStubs soll hier DESTINATION_MODE_LOGICAL verwendet werden.
  • polarity gibt an, wann ein Interrupt signalisiert werden soll. OO/MPStubs soll hier POLARITY_HIGH verwenden.
  • trigger_mode gibt an, ob die Interruptsignalisierung pegel- oder flankengesteuert ist. OO/MPStubs verwendet hier TRIGGER_MODE_EDGE für die Tastatur und den Timer, die (optionale) serielle Schnittstelle jedoch TRIGGER_MODE_LEVEL
  • mask gibt an, ob für die entsprechende Quelle Interrupts zugelassen werden sollen oder nicht. 1 maskiert die dem Eintrag entsprechende Interruptquelle aus, 0 lässt den Interrupt zu.
  • logical_destination beschreibt als Bitmaske eine Menge von Prozessoren, die potentiell als Empfänger der Interruptnachricht in Frage kommen. Für OOStuBS ist dies logischerweise 1, für MPStuBS müssen in der Bitmaske die untersten n Bits auf 1 gesetzt sein, wobei n die Anzahl der im System vorhandenen CPUs ist (siehe APICSystem::getNumberOfCPUs()). Damit kommen alle CPUs als Empfänger infrage und die Interruptlast wird so gleichmäßig über alle CPUs verteilt. Hinweis: In QEMU funktioniert dies nicht. Dort bekommt immer CPU 0, also der BSP alle Interrupts.

Ein Tabelleneintrag besteht dabei aus zwei 32bit breiten Wörtern IOREDTBL_H bzw. IOREDTBL_L

Die Redirection Tabelle beginnt bei IOAPIC-Register 0x10 und endet bei 0x3f. Jeder Eintrag umfasst 64 bit, also 2 Register des IOAPICs. IOREDTBL_L ist niederwertige Wort, IOREDTBL_H das höherwertige. Eintrag 0 in der Tabelle wären dann die Register 0x10 (entspricht IOREDTBL_L) und 0x11 (entspricht IOREDTBL_H).

Siehe auch
IO-APIC manual, p. 11-13

Die Dokumentation für diese Struktur wurde erzeugt aufgrund der Datei: