OOStuBS/MPStuBS
LAPIC Klassenreferenz

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. 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 isPentium4 ()
 Ist diese CPU ein PentiumIV? 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 ()
 Initalisiert 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()
 

Ausführliche Beschreibung

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.

Beschreibung der Konstruktoren und Destruktoren

◆ LAPIC()

LAPIC::LAPIC ( )
inline

Konstruktor.

Dokumentation der Elementfunktionen

◆ ackIRQ()

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.

◆ getLAPICID()

uint8_t LAPIC::getLAPICID ( )

Liefert die ID des in der aktuellen CPU integrieren APICs.

Rückgabe
lAPIC ID

◆ getVersion()

uint8_t LAPIC::getVersion ( )

Liefert Versionsnummer des local APICs.

Rückgabe
Versionsnummer

◆ init()

void LAPIC::init ( )
private

Initalisiert den local APIC der jeweiligen CPU.

◆ isExternalAPIC()

bool LAPIC::isExternalAPIC ( )

Ist dieser lAPIC extern?

◆ isIPIDelivered()

bool LAPIC::isIPIDelivered ( )

Kehrt mit true zurück, falls zum Zeitpunkt des Aufrufs kein IPI aktiv ist.

Rückgabe
false, falls der letzte gesendete IPI noch nicht vom Zielprozessor akzeptiert wurde

◆ isLocalAPIC()

bool LAPIC::isLocalAPIC ( )

Ist dieser lAPIC intern?

◆ isPentium4()

bool LAPIC::isPentium4 ( )

Ist diese CPU ein PentiumIV?

◆ sendIPI()

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_shorthand: 0
  • level : 1 (Kein Init-IPI)
  • destination_mode : 1 (Logical Destination Mode)
  • delivery_mode : 0 (Fixed Delivery Mode)
  • vector : Anwendungsspezifisch
Parameter
destinationMaske mit Zielcpu(s)
dataEinstellungen

◆ setLogicalLAPICID()

void LAPIC::setLogicalLAPICID ( uint8_t  id)
private

Setzt die local APIC ID im LDR Register.

Parameter
idAPIC ID

◆ setTimer()

void LAPIC::setTimer ( uint32_t  counter,
uint8_t  divide,
uint8_t  vector,
bool  periodic,
bool  masked = false 
)

Stellt den LAPIC-Timer ein.

Parameter
counterStartwert des Zählers, der bei jedem Bus-Takt dekrementiert wird.
divideZweipotenz durch den der Bustakt geteilt werden soll (in numerischer Form, siehe LAPIC::timer_div zur Umrechnung)
vectorNummer des auszulösenden Interrupts.
periodicGibt an, ob die Unterbrechung periodisch kommen soll
maskedUnterdrückt Unterbrechungen bei Zählerablauf

◆ setTimerMasked()

void LAPIC::setTimerMasked ( bool  masked = false)

Setzt die LAPIC-Timer Interrupt Make.

Parameter
maskedUnterdrückt Unterbrechungen bei Zählerablauf

◆ timer_div()

uint8_t LAPIC::timer_div ( uint8_t  div)

Berechnet die Bitmaske für den Teiler des LAPIC-Timers.

Parameter
divTeiler, Möglichkeiten: 1, 2, 4, 8, 16, 32, 64, 128
Rückgabe
Bitmaske für LAPIC::setTimer() oder 0xff falls div ungültig ist.

◆ timer_ticks()

uint32_t LAPIC::timer_ticks ( )

Ermittelt die Frequenz des LAPIC-Timers.

Rückgabe
Anzahl der Timerticks pro Millisekunde

Dokumentation der Datenelemente

◆ LAPIC_BASE

uint32_t LAPIC::LAPIC_BASE = 0xfee00000
static

Basisadresse der local APIC-Register.


Die Dokumentation für diese Klasse wurde erzeugt aufgrund der Dateien: