Übungen zu BS - Dokumentation Aufgabe 6 (WS 2014/15)
Abstraktion des in der CPU integrierten local APICs. Mehr ...
#include <lapic.h>
Öffentliche Methoden | |
LAPIC () | |
Konstruktor. | |
void | init () |
Initalisiert den local APIC der jeweiligen CPU. | |
void | ackIRQ () |
Signalisiert EOI(End of interrupt) | |
uint8_t | getLAPICID () |
Liefert die ID des in der aktuellen CPU integrieren APICs. | |
uint8_t | getCPUID () |
Liefert eindeutige Identifikation der jeweiligen CPU. | |
uint8_t | getVersion () |
Liefert Versionsnummer des local APICs. | |
void | setLogicalLAPICID (uint8_t id) |
Setzt die local APIC ID im LDR Register. | |
void | 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: | |
bool | isIPIDelivered () |
Kehrt mit true zurück, falls zum Zeitpunkt des Aufrufs kein IPI aktiv ist. Kehrt mit false zurück, falls der letzte gesendete IPI noch nicht vom Zielprozessor akzeptiert wurde. | |
bool | isExternalAPIC () |
Ist dieser lAPIC extern? | |
bool | isLocalAPIC () |
Ist dieser lAPIC intern? | |
bool | isPentium4 () |
Ist diese CPU ein PentiumIV? | |
uint32_t | timer_ticks () |
Ermittelt die Frequenz des LAPIC-Timers. | |
uint8_t | timer_div (uint8_t div) |
Berechnet die Bitmaske für den Teiler des LAPIC-Timers. | |
void | setTimer (uint32_t counter, uint8_t divide, uint8_t vector, bool periodic, bool masked=false) |
Stellt den LAPIC-Timer ein. |
Statische öffentliche Attribute | |
static uint32_t | LAPIC_BASE = 0xfee00000 |
Basisadresse der local APIC-Register. |
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.
Dokumentation der Elementfunktionen
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.
|
inline |
uint8_t LAPIC::getLAPICID | ( | ) |
Liefert die ID des in der aktuellen CPU integrieren APICs.
- Rückgabe
- lAPIC ID
uint8_t LAPIC::getVersion | ( | ) |
Liefert Versionsnummer des local APICs.
- Rückgabe
- Versionsnummer
bool LAPIC::isIPIDelivered | ( | ) |
Kehrt mit true zurück, falls zum Zeitpunkt des Aufrufs kein IPI aktiv ist. Kehrt mit false zurück, falls der letzte gesendete IPI noch nicht vom Zielprozessor akzeptiert wurde.
- Rückgabe
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
-
destination Maske mit Zielcpu(s) data Einstellungen
void LAPIC::setLogicalLAPICID | ( | uint8_t | id | ) |
Setzt die local APIC ID im LDR Register.
- Parameter
-
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.
- Parameter
-
counter Startwert des Zählers, der bei jedem Bus-Takt dekrementiert wird. divide Zweipotenz durch den der Bustakt geteilt werden soll (in numerischer Form, siehe LAPIC::timer_div zur Umrechnung) vector Nummer des auszulösenden Interrupts. periodic Gibt an, ob die Unterbrechung periodisch kommen soll 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.
- Parameter
-
div Teiler, Möglichkeiten: 1, 2, 4, 8, 16, 32, 64, 128
- Rückgabe
- Bitmaske für LAPIC::setTimer() oder 0xff falls div ungültig ist.
uint32_t LAPIC::timer_ticks | ( | ) |
Ermittelt die Frequenz des LAPIC-Timers.
- Rückgabe
- Anzahl der Timerticks pro Millisekunde
Die Dokumentation für diese Klasse wurde erzeugt aufgrund der Dateien:
- machine/lapic.h
- machine/lapic.cc