OOStuBS/MPStuBS
|
Abstraktion des in der CPU integrierten local APICs. Mehr ...
#include <lapic.h>
Öffentliche Methoden | |
LAPIC () | |
Konstruktor. Mehr ... | |
void | ackIRQ () |
Signalisiert EOI(End of interrupt) Mehr ... | |
uint8_t | getLAPICID () |
Liefert die ID des in der aktuellen CPU integrieren APICs. Mehr ... | |
uint8_t | getVersion () |
Liefert Versionsnummer des local APICs. Mehr ... | |
void | sendIPI (uint8_t destination, struct ICR_L data) |
Verschickt einen IPI an die adressieren CPU(s) Mehr ... | |
bool | isIPIDelivered () |
Kehrt mit true zurück, falls zum Zeitpunkt des Aufrufs kein IPI aktiv ist. Mehr ... | |
bool | isExternalAPIC () |
Ist dieser lAPIC extern? Mehr ... | |
bool | isLocalAPIC () |
Ist dieser lAPIC intern? Mehr ... | |
bool | isPentium4orNewer () |
Ist diese CPU ein Pentium 4 oder neuer? Mehr ... | |
uint32_t | timer_ticks () |
Ermittelt die Frequenz des LAPIC-Timers. Mehr ... | |
uint8_t | timer_div (uint8_t div) |
Berechnet die Bitmaske für den Teiler des LAPIC-Timers. Mehr ... | |
void | setTimer (uint32_t counter, uint8_t divide, uint8_t vector, bool periodic, bool masked=false) |
Stellt den LAPIC-Timer ein. Mehr ... | |
void | setTimerMasked (bool masked=false) |
Setzt die LAPIC-Timer Interrupt Make. Mehr ... | |
Statische öffentliche Attribute | |
static uint32_t | LAPIC_BASE = 0xfee00000 |
Basisadresse der local APIC-Register. Mehr ... | |
Private Typen | |
enum | |
System Programming Guide 3A, p. 9-8 - 9-10. | |
Private Methoden | |
void | init () |
Initialisiert den local APIC der jeweiligen CPU. Mehr ... | |
void | setLogicalLAPICID (uint8_t id) |
Setzt die local APIC ID im LDR Register. Mehr ... | |
Private Attribute | |
friend | APICSystem |
The APIC System is our friend to call init and setLAPICID() | |
Abstraktion des in der CPU integrierten local APICs.
In modernen PCs besitzt jede CPU einen sogenannten "local APIC". Dieser vermittelt zwischen dem I/O APIC, an den die externen Interruptquellen angeschlossen sind, und der CPU. Interruptnachrichten, welche den lokalen APIC von aussen erreichen, werden an den zugeordneten Prozessorkern weitergereicht, um dort die Interruptbearbeitung anzustoßen.
In Multiprozessorsystem ist es darüberhinaus noch möglich mit Hilfe des lokalen APICs Nachrichten in Form von Interprozessorinterrupts an andere CPUs zu schicken bzw. zu empfangen.
|
inline |
Konstruktor.
void LAPIC::ackIRQ | ( | ) |
Signalisiert EOI(End of interrupt)
Teilt dem local APIC mit, dass die aktuelle Interruptbehandlung abgeschlossen ist. Diese Funktion muss gegen Ende der Unterbrechungsbehandlung aufgerufen werden und zwar bevor prozessorseitig die Unterbrechungen wieder zugelassen werden.
uint8_t LAPIC::getLAPICID | ( | ) |
Liefert die ID des in der aktuellen CPU integrieren APICs.
uint8_t LAPIC::getVersion | ( | ) |
Liefert Versionsnummer des local APICs.
|
private |
Initialisiert den local APIC der jeweiligen CPU.
bool LAPIC::isExternalAPIC | ( | ) |
Ist dieser lAPIC extern?
bool LAPIC::isIPIDelivered | ( | ) |
Kehrt mit true zurück, falls zum Zeitpunkt des Aufrufs kein IPI aktiv ist.
bool LAPIC::isLocalAPIC | ( | ) |
Ist dieser lAPIC intern?
bool LAPIC::isPentium4orNewer | ( | ) |
Ist diese CPU ein Pentium 4 oder neuer?
void LAPIC::sendIPI | ( | uint8_t | destination, |
struct ICR_L | data | ||
) |
Verschickt einen IPI an die adressieren CPU(s)
Zum schicken von "normalen" IPIs sind folgende Einstellung im struct ICR_L notwerndig:
destination | Maske mit Zielcpu(s) |
data | Einstellungen |
|
private |
Setzt die local APIC ID im LDR Register.
id | APIC ID |
void LAPIC::setTimer | ( | uint32_t | counter, |
uint8_t | divide, | ||
uint8_t | vector, | ||
bool | periodic, | ||
bool | masked = false |
||
) |
Stellt den LAPIC-Timer ein.
counter | Startwert des Zählers, der bei jedem Bus-Takt dekrementiert wird. |
divide | Zweierpotenz, durch die der Bustakt geteilt werden soll (wird als numerischer Wert (1, 2, 4, 8, ...) übergeben, zur Umrechnung in die passende Bitmaske siehe LAPIC::timer_div) |
vector | Nummer des auszulösenden Interrupts. |
periodic | Gibt an, ob die Unterbrechung periodisch kommen soll |
masked | Unterdrückt Unterbrechungen bei Zählerablauf |
void LAPIC::setTimerMasked | ( | bool | masked = false | ) |
Setzt die LAPIC-Timer Interrupt Make.
masked | Unterdrückt Unterbrechungen bei Zählerablauf |
uint8_t LAPIC::timer_div | ( | uint8_t | div | ) |
Berechnet die Bitmaske für den Teiler des LAPIC-Timers.
div | Teiler, Möglichkeiten: 1, 2, 4, 8, 16, 32, 64, 128 |
0xff
falls div ungültig ist. uint32_t LAPIC::timer_ticks | ( | ) |
Ermittelt die Frequenz des LAPIC-Timers.
|
static |
Basisadresse der local APIC-Register.