| Zeile 2: | Zeile 2: | ||
== Register == | == Register == | ||
| − | Die Register | + | === Aufbau === |
| + | Die Register der ''Local APIC'' sind in den physischen Speicher eingeblendet. Jedes der Register beginnt an einer 16 Byte Grenze, erstreckt sich aber nur über die ersten 32 Bit. Falls das Register größer als 32 Bit ist, befinden sich die nächst höheren 32 Bit an der nächst höheren 16 Byte Grenze. Die ''Local APIC'' stellt folgende Register zur Programmierung bereit: | ||
| − | {| border="1" | + | |
| − | + | <center> | |
| − | + | {| border="1" cellspacing="0" | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
|- | |- | ||
| − | + | ! Offset | |
| + | ! r/w | ||
| + | ! Größe (Bit) | ||
| + | ! Abkürzung | ||
| + | ! Name des Registers | ||
|- | |- | ||
| − | | | + | | 0x0020 || r/w || 32 || || [[LAPIC#Local APIC ID Register | Local APIC ID Register]] |
|- | |- | ||
| − | | | + | | 0x0030 || r || 32 || || [[LAPIC#Local APIC Version Register | Local APIC Version Register]] |
|- | |- | ||
| − | | | + | | 0x0080 || r/w || 32 || TPR || Task Priority Register |
|- | |- | ||
| − | | | + | | 0x0090 || r || 32 || APR || Arbitration Priority Register ¹ |
|- | |- | ||
| − | | | + | | 0x00A0 || r || 32 || PPR || Processor Priority Register |
|- | |- | ||
| − | | | + | | 0x00B0 || w || 32 || || EOI Register |
|- | |- | ||
| − | | | + | | 0x00D0 || r/w || 32 || || Logical Destination Register |
|- | |- | ||
| − | | | + | | 0x00E0 || r/w || 32 || || Destination Format Register |
|- | |- | ||
| − | | | + | | 0x00F0 || r/w || 32 || || Spurious Interrupt Vector Register |
|- | |- | ||
| − | | | + | | 0x0100<br>0x0170 || r || 256 || ISR || In-Service Register |
|- | |- | ||
| − | | | + | | 0x0180<br>0x01F0 || r || 256 || TMR || Trigger Mode Register |
|- | |- | ||
| − | | | + | | 0x0200<br>0x0270 || r || 256 || IRR || Interrupt Request Register |
|- | |- | ||
| − | | | + | | 0x0280 || r || 32 || || Error Status Register |
|- | |- | ||
| − | | | + | | 0x0300<br>0x0310 || r/w || 64 || ICR || [[LAPIC#Interrupt Command Register | Interrupt Command Register]] |
|- | |- | ||
| − | | | + | | 0x0320 || r/w || 32 || || LVT Timer Register |
|- | |- | ||
| − | | | + | | 0x0330 || r/w || 32 || || LVT Thermal Sensor Register ² |
|- | |- | ||
| − | | | + | | 0x0340 || r/w || 32 || || LVT Performance Monitoring Counters Register ³ |
|- | |- | ||
| − | | | + | | 0x0350 || r/w || 32 || || LVT LINT0 Register |
|- | |- | ||
| − | | | + | | 0x0360 || r/w || 32 || || LVT LINT1 Register |
|- | |- | ||
| − | | | + | | 0x0370 || r/w || 32 || || LVT Error Register |
|- | |- | ||
| − | | | + | | 0x0380 || r/w || 32 || || Initial Count Register |
|- | |- | ||
| − | | | + | | 0x0390 || r/w || 32 || || Current Count Register |
|- | |- | ||
| − | | | + | | 0x03E0 || r/w || 32 || || Divide Configuration Register |
| − | |||
| − | |||
| − | |||
| − | |||
| − | | | ||
| − | | | ||
| − | | | ||
| − | | | ||
|} | |} | ||
| + | </center> | ||
| − | + | ||
| − | + | ¹ Nicht unterstützt in Pentium 4 und Intel Xeon Prozessoren<br> | |
| − | + | ² Eingeführt mit dem Pentium 4 und Intel Xeon Prozessoren. Dieses Register ist implementationsabhängig und muss in Zukunft nicht mehr vorhanden sein.<br> | |
| − | <br | + | ³ Eingeführt mit dem Pentium Pro Prozessor. Dieses Register ist implementationsabhängig und muss in Zukunft nicht mehr vorhanden sein.<br> |
=== Local APIC ID Register === | === Local APIC ID Register === | ||
| + | |||
P6-Prozessorfamilie und Pentium-Prozessoren: | P6-Prozessorfamilie und Pentium-Prozessoren: | ||
{| border="1" cellpadding="2" | {| border="1" cellpadding="2" | ||
| Zeile 120: | Zeile 86: | ||
=== Local APIC Version Register === | === Local APIC Version Register === | ||
| + | |||
{| border="1" cellpadding="2" | {| border="1" cellpadding="2" | ||
! 31-24 || 23-16 || 15-8 || 7-0 | ! 31-24 || 23-16 || 15-8 || 7-0 | ||
| Zeile 125: | Zeile 92: | ||
| Reserviert || Max. LVT-Einträge || Reserviert || Version | | Reserviert || Max. LVT-Einträge || Reserviert || Version | ||
|} | |} | ||
| + | |||
Wenn beim Version-Byte das HighNibble 1 ist, ist es ein Local APIC. Andernfalls ein externer APIC. Bei Pentium 4 und Intel Xeon wird als LocalApic 0x14 zurückgegeben. Bei einem externen APIC entspricht das LowNibble X dem Chip 82489DX. | Wenn beim Version-Byte das HighNibble 1 ist, ist es ein Local APIC. Andernfalls ein externer APIC. Bei Pentium 4 und Intel Xeon wird als LocalApic 0x14 zurückgegeben. Bei einem externen APIC entspricht das LowNibble X dem Chip 82489DX. | ||
| Zeile 131: | Zeile 99: | ||
=== Interrupt Command Register (ICR) === | === Interrupt Command Register (ICR) === | ||
| + | |||
Das Interrupt Command Register wird verwendet um IPIs zu versenden. | Das Interrupt Command Register wird verwendet um IPIs zu versenden. | ||
{| border="1" cellpadding="2" | {| border="1" cellpadding="2" | ||
| Zeile 157: | Zeile 126: | ||
| 7-0 || Vector | | 7-0 || Vector | ||
|} | |} | ||
| + | |||
| + | == Programmierung == | ||
| + | |||
| + | === physische Adresse === | ||
| + | |||
| + | Die physische Adresse der Register kann entweder aus der [[SMP#Configuration_Table | Configuration Table]] der ''Intel Multiprocessor Specification'' ausgelesen werden oder über das [[MSR]] 0x001B ausgelesen werden. | ||
| + | |||
| + | === Initialisierung === | ||
| + | In folgender Reihenfolge sollten die Register der Local APIC initialisiert werden: | ||
| + | * ''Task Priority Register'' | ||
| + | * ''LVT Timer Register'' | ||
| + | * ''LVT Thermal Sensor Register'' | ||
| + | * ''LVT Performance Counter Register'' | ||
| + | * ''LVT LINT0 Register'' | ||
| + | * ''LVT LINT1 Register'' | ||
| + | * ''LVT Error Register'' | ||
| + | * ''Spurious Interrupt Vector Register'' | ||
| + | |||
| + | === End of Interrupt === | ||
| + | |||
| + | Ein ''End of Interrupt'' (EOI) wird der ''Local APIC'' signalisiert, in dem man in das ''EOI Register'' den Wert 0 schreibt. | ||
== Weblinks == | == Weblinks == | ||
| Zeile 164: | Zeile 154: | ||
[[Kategorie:Hardware]] | [[Kategorie:Hardware]] | ||
[[Kategorie:Glossar]] | [[Kategorie:Glossar]] | ||
| − | [[Kategorie: | + | [[Kategorie:Tutorials]] |