Friedrich-Alexander-Universität Erlangen-Nürnberg  /   Technische Fakultät  /   Department Informatik
lapic.h-Dateireferenz

EnthÀlt die Klasse LAPIC zum Zugriff auf den Local APIC. Mehr ...

#include "types.h"
Dieser Graph zeigt, welche Datei direkt oder indirekt diese Datei enthÀlt:

Namensbereiche

 LAPIC
 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.
 

Funktionen

void LAPIC::init (uint8_t logicalID)
 Initialisiert den local APIC der jeweiligen CPU und setzt die lokale APIC ID im LDR Register. Mehr ...
 
void LAPIC::endOfInterrupt ()
 Signalisiert EOI (End of interrupt) Mehr ...
 
uint8_t LAPIC::getID ()
 Liefert die ID des in der aktuellen CPU integrieren APICs. Mehr ...
 
uint8_t LAPIC::getLogicalID ()
 
void LAPIC::setLogicalID (uint8_t id)
 
uint8_t LAPIC::getVersion ()
 Liefert Versionsnummer des local APICs. Mehr ...
 
bool LAPIC::IPI::isDelivered ()
 Kehrt mit true zurĂŒck, falls zum Zeitpunkt des Aufrufs kein IPI aktiv ist. Mehr ...
 
void LAPIC::IPI::send (uint8_t destination, uint8_t vector)
 Sende einen Inter-Prozessor Interrupt. Mehr ...
 
void LAPIC::IPI::sendGroup (uint8_t logical_destination, uint8_t vector)
 Sende einen Inter-Prozessor Interrupt an eine Gruppe von Zielprozessoren. Mehr ...
 
void LAPIC::IPI::sendAll (uint8_t vector)
 Sende einen Inter-Prozessor Interrupt an alle Prozessoren. Mehr ...
 
void LAPIC::IPI::sendOthers (uint8_t vector)
 Sende einen Inter-Prozessor Interrupt an alle anderen Prozessoren (jedoch nicht an sich selbst) Mehr ...
 
void LAPIC::IPI::sendInit (bool assert=true)
 
void LAPIC::IPI::sendStartup (uint8_t vector)
 
uint32_t LAPIC::Timer::ticks (void)
 Ermittelt die Frequenz des LAPIC-Timers. Unter Verwendung des PIT wird eine gewisse (lĂ€ngere) Zeit gewartet und davor sowie danach der aktuelle LAPIC Timer ZĂ€hler ausgelesen. Aus der Differenz der beiden ZĂ€hlerwerte sowie der Wartezeit werden die LAPIC Timer Ticks pro Millisekunden errechnet. Mehr ...
 
void LAPIC::Timer::set (uint32_t counter, uint8_t divide, uint8_t vector, bool periodic, bool masked=false)
 Stellt den LAPIC-Timer ein. Mehr ...
 

AusfĂŒhrliche Beschreibung

EnthÀlt die Klasse LAPIC zum Zugriff auf den Local APIC.

Local APIC referenziert in Intel System Programming Guide 3A

Dokumentation der Funktionen

◆ isDelivered()

bool LAPIC::IPI::isDelivered ( )

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

◆ send()

void LAPIC::IPI::send ( uint8_t  destination,
uint8_t  vector 
)

Sende einen Inter-Prozessor Interrupt.

Parameter
destinationID des Zielprozessors (unter Verwendung von System::getLogicalLAPICID() )
vectorAuszulösender Interrupt

◆ sendAll()

void LAPIC::IPI::sendAll ( uint8_t  vector)

Sende einen Inter-Prozessor Interrupt an alle Prozessoren.

Parameter
vectorAuszulösender Interrupt

◆ sendGroup()

void LAPIC::IPI::sendGroup ( uint8_t  logical_destination,
uint8_t  vector 
)

Sende einen Inter-Prozessor Interrupt an eine Gruppe von Zielprozessoren.

Parameter
logical_destinationMaske mit den LAPIC IDs der Zielprozessors (unter Verwendung von System::getLogicalLAPICID() )
vectorAuszulösender Interrupt

◆ sendOthers()

void LAPIC::IPI::sendOthers ( uint8_t  vector)

Sende einen Inter-Prozessor Interrupt an alle anderen Prozessoren (jedoch nicht an sich selbst)

Parameter
vectorAuszulösender Interrupt

◆ set()

void LAPIC::Timer::set ( 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.
divideZweierpotenz, durch die der Bustakt geteilt werden soll (wird als numerischer Wert (1, 2, 4, 8, ...) ĂŒbergeben, zur Umrechnung in die passende Bitmaske siehe lokale Funktion getClockDiv() )
vectorNummer des auszulösenden Interrupts.
periodicGibt an, ob die Unterbrechung periodisch kommen soll
maskedUnterdrĂŒckt Unterbrechungen bei ZĂ€hlerablauf
Noch zu erledigen:
Methode implementieren

◆ ticks()

uint32_t LAPIC::Timer::ticks ( void  )

Ermittelt die Frequenz des LAPIC-Timers. Unter Verwendung des PIT wird eine gewisse (lÀngere) Zeit gewartet und davor sowie danach der aktuelle LAPIC Timer ZÀhler ausgelesen. Aus der Differenz der beiden ZÀhlerwerte sowie der Wartezeit werden die LAPIC Timer Ticks pro Millisekunden errechnet.

FĂŒr die Messung wird mittels set() der LAPIC ZĂ€hler in einen Single-Shot Modus ohne Interrupts gesetzt, nach der Messung wird er wieder deaktiviert.

Zu beachten
Bei der Berechnung der Differenz der ZĂ€hlerwerten muss berĂŒcksichtigt werden, dass absteigend gezĂ€hlt wird!
RĂŒckgabe
Anzahl der Timerticks pro Millisekunde
Noch zu erledigen:
Methode implementieren