OOStuBS/MPStuBS
|
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. | |
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:
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_LOGICAL
verwendet werden.POLARITY_HIGH
verwenden.TRIGGER_MODE_EDGE
für die Tastatur und den Timer, die (optionale) serielle Schnittstelle jedoch TRIGGER_MODE_LEVEL
1
maskiert die dem Eintrag entsprechende Interruptquelle aus, 0
lässt den Interrupt zu.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).