I/O Advanced Programmable Interrupt Controller — Änderungen 11048 → 11141

Zeile 1: Zeile 1:
−
Die '''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 eine I/O APIC notwendig. Darüber hinaus stellt die 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 der I/O APIC schneller, da sie nicht über I/O Ports, sondern über Speicherbereiche abläuft.
+
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 der I/O APIC:
+
Die folgenden Register dienen der Konfiguration des I/O APIC:
  
  
Zeile 51: Zeile 51:
 
| 28-31 || reserviert ||
 
| 28-31 || reserviert ||
 
|-
 
|-
−
| 24-27 || 4Bit ID der I/O APIC || lesend/schreibend
+
| 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 der I/O APIC || lesend/schreibend
+
| 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 empfangende(n) [[Local APIC]](s) an, Erklärung siehe [[I/O APIC#Destination | ''Destination''-Tabelle]] || lesend/schreibend
+
| 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 von der [[Local APIC]] bzw. den Local APICs angenommen || nur lesend
+
| 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 von der I/O APIC sondern wird von einem externen Controller (z.B. des [[PIC]]) geliefert. Der ''Trigger Mode'' muss ''edge'' sein.
+
| 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 der I/O APIC ===
+
=== 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 ===
−
Die 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]] der I/O APIC aus und kann anschließend über das Datenregister das interne Register auslesen bzw. beschreiben.
+
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: