OOStuBS/MPStuBS
|
Abstraktion für die Erkennung und das Booten eines PCs mit APIC. Mehr ...
#include <apicsystem.h>
Öffentliche Typen | |
enum | SystemType { MP_APIC, UP_APIC, UNDETECTED } |
Art des Systems. Mehr ... | |
Öffentliche Methoden | |
void | detectSystemType () |
Führt Systemerkennung aus. Mehr ... | |
bool | bootCPU (unsigned int cpu_id, void *top_of_stack) |
Startet einen Applikationsprozessor. Mehr ... | |
int | getCPUID () |
Liefert die CPUID der aktuellen CPU. Mehr ... | |
void | sendCustomIPI (unsigned char logicalDestination, unsigned char vector) |
Auslösen eines Interprozessorinterrupts. Mehr ... | |
unsigned char | getIOAPICSlot (APICSystem::Device device) |
Liefert die Nummer des Pins, an dem das Gerät device hängt. Mehr ... | |
SystemType | getSystemType () |
Abfrage des Systemtyps. Mehr ... | |
unsigned int | getNumberOfCPUs () |
Gibt die Anzahl der CPUs zurück. Mehr ... | |
unsigned int | getNumberOfOnlineCPUs () |
Gibt die Anzahl der erfolgreich gebooteten CPUs zurück. Mehr ... | |
unsigned char | getIOAPICID () |
Liefert die während des Bootvorgangs ausgelesene ID des IOAPICs. Mehr ... | |
unsigned char | getBSPID () |
Liefert die ID des Bootprozessors (BSP) | |
unsigned char | getLogicalLAPICID (unsigned char cpu) |
Liefert die logische ID des LAPICs der übergebenen cpu. Mehr ... | |
Private Attribute | |
unsigned int | onlineCPUs |
running CPUs | |
int | compatibilityMode |
the compatibility mode that was detected (PIC, virtual wire, symmetric I/O) | |
int | cpuFamily [CPU_MAX] |
the CPU family per CPU | |
int | cpuModel [CPU_MAX] |
the CPU model per CPU | |
unsigned char | cpuID [255] |
local CPU ID indexed with local APIC ID | |
unsigned int | lapicVersion [CPU_MAX] |
the version of the local APICs per CPU | |
unsigned char | logicalLAPICID [CPU_MAX] |
logical LAPIC IDs per CPU, needed for IPI | |
volatile char | callout_cpu_number |
set by BSP, taken by next booting CPU | |
void * | relocatedSetupAP |
Zeiger auf den Setupcode für die Applikation. | |
Abstraktion für die Erkennung und das Booten eines PCs mit APIC.
bool APICSystem::bootCPU | ( | unsigned int | cpu_id, |
void * | top_of_stack | ||
) |
Startet einen Applikationsprozessor.
cpu_id | Gib an, welcher Prozessor gestartet werden soll. Applikationsprozessoren haben die IDs 1 bis n-1 |
top_of_stack | Zeiger auf die oberste Adresse des Stacks, der von der zu startenden CPU verwendet werden soll. |
void APICSystem::detectSystemType | ( | ) |
Führt Systemerkennung aus.
Diese Funktion erkennt ein eventuell vorhandenes Mehrprozessorsystem. Nach erfolgter Erkennung kann der Systemtyp mit Hilfe der Methode getSystemType() abgefragt werden.
|
inline |
Liefert die während des Bootvorgangs ausgelesene ID des IOAPICs.
unsigned char APICSystem::getIOAPICSlot | ( | APICSystem::Device | device | ) |
Liefert die Nummer des Pins, an dem das Gerät device hängt.
|
inline |
Liefert die logische ID des LAPICs der übergebenen cpu.
Die logische ID der LAPICs wird von uns beim Boot-Vorgang so initialisiert, dass genau ein Bit pro CPU gesetzt ist. Dabei ist in der logischen ID des LAPICs von CPU 0 Bit 0 gesetzt, in der ID des LAPICs von CPU 1 Bit 1, usw.
cpu | Die abzufragende CPU |
|
inline |
Gibt die Anzahl der CPUs zurück.
|
inline |
Gibt die Anzahl der erfolgreich gebooteten CPUs zurück.
|
inline |
Abfrage des Systemtyps.
void APICSystem::sendCustomIPI | ( | unsigned char | logicalDestination, |
unsigned char | vector | ||
) |
Auslösen eines Interprozessorinterrupts.
Mit Hilfe dieser Methode kann ein Interprozessorinterrupt (IPI) an eine ganze Gruppe von Prozessoren geschickt werden. In MPStuBS ist das System derart konfiguriert, dass insgesamt 8 CPUs bzw. deren Local APICs angesprochen werden können. Jeder Local APIC wird dabei durch ein Bit in logicalDestination repräsentiert. Dabei entspricht ein gesetztes Bit 0 der logischen LAPIC-ID der CPU 0, Bit 1 der ID der CPU 1 usw.. Welcher Interruptvektor auf den Ziel-CPUs ausgelöst werden soll, wird durch vector festgelegt. Zum konkreten Absenden eines IPIs wird die Methode LAPIC::sendIPI() verwendet.
logicalDestination | Menge von Prozessoren, die einen IPI erhalten sollen. |
vector | Interruptvektor, der ausgelöst werden soll. |