| Zeile 1: | Zeile 1: | ||
| − | + | Der '''I/O APIC''' (= '''I/O Advanced Programmable Interrupt Controller''') löst den [[PIC | Programmable Interrupt Controller]] in einem [[SMP]]- bzw. [[NUMA]]-System ab. Da der PIC die [[IRQ | IRQs]] ausschließlich an den BSP (= Bootstrap Processor) senden kann, ist in einem System mit mehreren Prozessoren ein I/O APIC notwendig. Darüber hinaus stellt der I/O APIC statt nur 16 IRQ-Leitungen wie der PIC normalerweise 24 IRQ-Leitungen zur Verfügung. Dies verringert die Anzahl der von mehreren Geräten gleichzeitig genutzten IRQs in Systemen mit sehr vielen Geräten. Außerdem ist die Programmierung des I/O APIC schneller, da sie nicht über I/O Ports, sondern über Speicherbereiche abläuft. | |
| Zeile 23: | Zeile 23: | ||
=== Interne Register === | === Interne Register === | ||
| − | Die folgenden Register dienen der Konfiguration | + | Die folgenden Register dienen der Konfiguration des I/O APIC: |
| Zeile 51: | Zeile 51: | ||
| 28-31 || reserviert || | | 28-31 || reserviert || | ||
|- | |- | ||
| − | | 24-27 || 4Bit ID | + | | 24-27 || 4Bit ID des I/O APIC || lesend/schreibend |
|- | |- | ||
| 0-23 || reserviert || | | 0-23 || reserviert || | ||
| Zeile 81: | Zeile 81: | ||
| 28-31 || reserviert || | | 28-31 || reserviert || | ||
|- | |- | ||
| − | | 24-27 || 4Bit Arbitration ID | + | | 24-27 || 4Bit Arbitration ID des I/O APIC || lesend/schreibend |
|- | |- | ||
| 0-23 || reserviert || | | 0-23 || reserviert || | ||
| Zeile 97: | Zeile 97: | ||
! Zugriffsart | ! Zugriffsart | ||
|- | |- | ||
| − | | 56-63 || || Destination || gibt die | + | | 56-63 || || Destination || gibt den/die empfangenden [[Local APIC]](s) an, Erklärung siehe [[I/O APIC#Destination | ''Destination''-Tabelle]] || lesend/schreibend |
|- | |- | ||
| 17-55 || || || reserviert || | | 17-55 || || || reserviert || | ||
| Zeile 105: | Zeile 105: | ||
| 15 || || Trigger Mode || 0b = edge sensitive<br>1b = level sensitive || lesend/schreibend | | 15 || || Trigger Mode || 0b = edge sensitive<br>1b = level sensitive || lesend/schreibend | ||
|- | |- | ||
| − | | 14 || || Remote IRR || Dieses Bit ist nur gültig, wenn der ''Trigger Mode'' ''edge'' ist:<br> 0b = EOI mit passendem Interruptvektor wurde gesendet<br>1b = Interrupt wurde | + | | 14 || || Remote IRR || Dieses Bit ist nur gültig, wenn der ''Trigger Mode'' ''edge'' ist:<br> 0b = EOI mit passendem Interruptvektor wurde gesendet<br>1b = Interrupt wurde vom [[Local APIC]] bzw. den Local APICs angenommen || nur lesend |
|- | |- | ||
| 13 || INTPOL || Interrupt Input Pin Polarity || 0b = high active<br>1b = low active || lesend/schreibend | | 13 || INTPOL || Interrupt Input Pin Polarity || 0b = high active<br>1b = low active || lesend/schreibend | ||
| Zeile 154: | Zeile 154: | ||
| 110b || reserviert || | | 110b || reserviert || | ||
|- | |- | ||
| − | | 111b || ExtINT || Analog zu ''Fixed'' wird ein normaler Interrupt ausgelöst. Der Interruptvektor kommt allerdings nicht | + | | 111b || ExtINT || Analog zu ''Fixed'' wird ein normaler Interrupt ausgelöst. Der Interruptvektor kommt allerdings nicht vom I/O APIC sondern wird von einem externen Controller (z.B. des [[PIC]]) geliefert. Der ''Trigger Mode'' muss ''edge'' sein. |
|} | |} | ||
| Zeile 160: | Zeile 160: | ||
== Programmierung == | == Programmierung == | ||
| − | === Basisadresse | + | === Basisadresse des I/O APIC === |
Die Basisadresse dieser Speicherbereiche kann im Allgemeinen über die [[Symmetrisches_Multiprozessorsystem#Intel_Multiprocessor_Specification | SMP]]- bzw. die [[ACPI | ACPI]]-Tabellen ausgelesen werden. Bei einem PIIX3 Chipsatz beginnt der Speicherbereich bei 0xFEC00xy00 (x und y werden mit dem APICBASE Register im PIIX3 festgelegt). | Die Basisadresse dieser Speicherbereiche kann im Allgemeinen über die [[Symmetrisches_Multiprozessorsystem#Intel_Multiprocessor_Specification | SMP]]- bzw. die [[ACPI | ACPI]]-Tabellen ausgelesen werden. Bei einem PIIX3 Chipsatz beginnt der Speicherbereich bei 0xFEC00xy00 (x und y werden mit dem APICBASE Register im PIIX3 festgelegt). | ||
=== Lesen/Schreiben der internen Register === | === Lesen/Schreiben der internen Register === | ||
| − | + | Der I/O APIC besitzt ein Indexregister (''I/O Register Select'' bzw. ''IOREGSEL'') und ein Datenregister (''I/O Window'' bzw. ''IOWIN''). Mit dem Indexregister wählt man ein [[I/O APIC#Interne Register | internes Register]] des I/O APIC aus und kann anschließend über das Datenregister das interne Register auslesen bzw. beschreiben. | |
Folgender Code kann dazu verwendet werden auf die internen Register zuzugreifen: | Folgender Code kann dazu verwendet werden auf die internen Register zuzugreifen: | ||